Ich versuche, die absoluten Bildschirmpixelkoordinaten der oberen linken Ecke einer Ansicht zu ermitteln. Alle Methoden, die ich finden kann, funktionieren jedoch nicht getLeft()
und getRight()
funktionieren nicht, da sie alle relativ zum übergeordneten Element der Ansicht zu sein scheinen 0
. Was ist der richtige Weg, um dies zu tun?
Wenn es hilft, ist dies für ein Spiel, bei dem das Bild wieder in Ordnung gebracht wird. Ich möchte, dass der Benutzer eine Box zeichnen kann, um mehrere Teile auszuwählen. Meine Vermutung ist , dass der einfachste Weg , dies zu tun ist , um getRawX()
und getRawY()
aus der MotionEvent
und vergleichen diese Werte dann gegen die linke obere Ecke des Layouts , die Stücke zu halten. Wenn ich die Größe der Stücke kenne, kann ich dann bestimmen, wie viele Stücke ausgewählt wurden. Mir ist klar, dass ich getX()
und getY()
auf dem verwenden kann MotionEvent
, aber da dies eine relative Position zurückgibt, die es schwieriger macht, zu bestimmen, welche Stücke ausgewählt wurden. (Nicht unmöglich, ich weiß, aber es scheint unnötig kompliziert).
Bearbeiten: Dies ist der Code, mit dem ich versucht habe, die Größe des Vorratsbehälters gemäß einer der Fragen zu ermitteln. TableLayout
ist der Tisch, der alle Puzzleteile enthält.
TableLayout tableLayout = (TableLayout) findViewById(R.id.tableLayout);
Log.d(LOG_TAG, "Values " + tableLayout.getTop() + tableLayout.getLeft());
Bearbeiten 2: Hier ist der Code, den ich ausprobiert habe, und folge den vorgeschlagenen Antworten.
public int[] tableLayoutCorners = new int[2];
(...)
TableLayout tableLayout = (TableLayout) findViewById(R.id.tableLayout);
tableLayout.requestLayout();
Rect corners = new Rect();
tableLayout.getLocalVisibleRect(corners);
Log.d(LOG_TAG, "Top left " + corners.top + ", " + corners.left + ", " + corners.right
+ ", " + corners.bottom);
cells[4].getLocationOnScreen(tableLayoutCorners);
Log.d(LOG_TAG, "Values " + tableLayoutCorners[0] + ", " + tableLayoutCorners[1]);
Dieser Code wurde hinzugefügt, nachdem die Initialisierung abgeschlossen ist. Das Bild wurde in ein Array von ImageViews (das Zellen [] -Array) unterteilt, das in a enthalten ist TableLayout
. Zellen [0] sind oben links ImageView
, und ich habe Zellen [4] ausgewählt, da sie irgendwo in der Mitte liegen und definitiv keine Koordinaten von (0,0) haben sollten.
Der oben gezeigte Code gibt mir immer noch alle Nullen in den Protokollen, was ich wirklich nicht verstehe, weil die verschiedenen Puzzleteile korrekt angezeigt werden. (Ich habe versucht, public int für tableLayoutCorners und die Standardsichtbarkeit zu verwenden, wobei beide das gleiche Ergebnis liefern.)
Ich weiß nicht, ob dies von Bedeutung ist, aber die ImageView
s haben ursprünglich keine Größe. Die Größe des ImageView
s wird während der Initialisierung automatisch von der Ansicht bestimmt, wenn ich ihm ein Bild zur Anzeige gebe. Könnte dies dazu beitragen, dass ihre Werte 0 sind, obwohl dieser Protokollierungscode steht, nachdem sie ein Bild erhalten und ihre Größe automatisch geändert haben? Um dem möglicherweise entgegenzuwirken, habe ich den Code tableLayout.requestLayout()
wie oben gezeigt hinzugefügt , aber das hat nicht geholfen.