Ich versuche, die absoluten Bildschirmpixelkoordinaten der oberen linken Ecke einer Ansicht zu erhalten. Alle Methoden, die ich finden kann, wie getLeft()
und getRight()
funktionieren jedoch nicht, da sie alle relativ zum übergeordneten Element der Ansicht zu sein scheinen, so dass mir 0
. Was ist der richtige Weg, dies zu tun?So erhalten Sie die absoluten Koordinaten einer Ansicht
Wenn es hilft, ist dies für ein Spiel "das Bild in Ordnung bringen". Ich möchte, dass der Benutzer eine Box zeichnen kann, um mehrere Teile auszuwählen. Meine Annahme ist, dass der einfachste Weg das zu tun ist, getRawX()
und-von der MotionEvent
und vergleichen Sie dann diese Werte gegen die obere linke Ecke des Layouts, das die Stücke hält. Wenn ich die Größe der Teile kenne, kann ich bestimmen, wie viele Teile ausgewählt wurden. Ich weiß, dass ich getX()
und getY()
auf dem MotionEvent
verwenden kann, aber da das eine relative Position zurückgibt, die das Bestimmen der ausgewählten Teile schwieriger macht. (Nicht unmöglich, ich weiß, aber es scheint unnötig kompliziert).
Edit: Dies ist der Code, den ich verwendet habe, um zu versuchen, die Größe des Container zu erhalten, wie eine der Fragen. 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());
Edit 2: Hier ist der Code, den ich habe versucht, mehrere der vorgeschlagenen Antworten folgen.
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 nach der Initialisierung hinzugefügt. Das Bild wurde in ein Array von ImageViews (das Array cells []) aufgeteilt, das in einem TableLayout
enthalten ist. Zellen [0] ist die obere linke ImageView
, und ich wählte Zellen [4] wie es irgendwo in der Mitte ist und sollte definitiv keine Koordinaten von (0,0) haben.
Der oben gezeigte Code gibt mir immer noch alle 0s in den Logs, was ich wirklich nicht verstehe, weil die verschiedenen Puzzleteile korrekt angezeigt werden. (Ich versuchte public int für tableLayoutCorners und Standard Sichtbarkeit, beide geben das gleiche Ergebnis.)
Ich weiß nicht, ob das signifikant ist, aber die ImageView
s sind ursprünglich nicht eine Größe gegeben. Die Größe der ImageView
s wird während der Initialisierung automatisch von der View bestimmt, wenn ich ihr ein Bild zur Anzeige gebe. Könnte dies dazu beitragen, dass ihre Werte 0 sind, obwohl der Logging-Code nach dem Eingeben eines Bildes und automatischem Ändern der Größe der Größe erfolgt? Um dem entgegenzuwirken, habe ich den Code tableLayout.requestLayout()
wie oben gezeigt hinzugefügt, aber das hat nicht geholfen.
Nun, das ist die Art von Funktion I erwartet zu finden. Leider darf ich es nicht richtig gebrauchen. Ich weiß, dass es ein bekannter Fehler war, dass getLocationOnScreen eine Nullzeiger-Ausnahme in Android v1.5 (der Plattform, für die ich kodiere) gibt, aber das Testen in Version 2.1 funktionierte nicht besser. Beide Methoden gaben mir 0 für alles. Ich habe oben ein Code-Snippet eingefügt. –
Sie können es nur aufrufen * AFTER * Layout ist passiert. Sie rufen die Methode auf, bevor die Ansichten auf dem Bildschirm positioniert werden. –
Aha, du hast Recht, obwohl es nicht offensichtlich war, dass ich das tat. Vielen Dank! Für jeden, der neugierig auf mehr Details ist, habe ich eine Antwort hinzugefügt, die erklärt, was ich meine. –