Ich versuche, die absoluten Bildschirm-Pixelkoordinaten der linken oberen Ecke einer Ansicht zu ermitteln. Allerdings sind alle Methoden, die ich finden kann, wie zum Beispiel getLeft()
y getRight()
funktionieren nicht, da sie alle relativ zum Elternteil der Ansicht zu sein scheinen, so dass ich 0
. Wie geht man dabei richtig vor?
Wenn es hilft, ist dies ein Spiel, bei dem es darum geht, das Bild wieder in Ordnung zu bringen. Ich möchte, dass der Benutzer ein Feld zeichnen kann, um mehrere Teile auszuwählen. Ich gehe davon aus, dass dies am einfachsten möglich ist, wenn man getRawX()
y getRawY()
von der MotionEvent
und vergleichen Sie diese Werte dann mit der linken oberen Ecke des Layouts, in dem sich die Teile befinden. Wenn ich die Größe der Teile kenne, kann ich feststellen, wie viele Teile ausgewählt wurden. Ich weiß, dass ich Folgendes verwenden kann getX()
y getY()
über die MotionEvent
Da dies jedoch eine relative Position ergibt, ist es schwieriger zu bestimmen, welche Stücke ausgewählt wurden. (Nicht unmöglich, ich weiß, aber es scheint unnötig kompliziert).
Edit: Dies ist der Code, mit dem ich versucht habe, die Größe des Containers zu ermitteln, wie in einer der Fragen beschrieben. TableLayout
ist der Tisch, auf dem alle Puzzleteile liegen.
TableLayout tableLayout = (TableLayout) findViewById(R.id.tableLayout);
Log.d(LOG_TAG, "Values " + tableLayout.getTop() + tableLayout.getLeft());
Edit 2: Hier ist der Code, den ich versucht habe, nach mehr der 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 cell[]-Array) aufgeteilt, das in einer TableLayout
. Cells[0] ist die obere linke Seite ImageView
und ich habe cells[4] ausgewählt, da es irgendwo in der Mitte liegt und auf keinen Fall Koordinaten von (0,0) haben sollte.
Mit dem oben gezeigten Code erhalte ich immer noch alle 0en in den Protokollen, was ich wirklich nicht verstehe, da die verschiedenen Puzzleteile korrekt angezeigt werden. (Ich habe public int für tableLayoutCorners und default visibility ausprobiert, was beides das gleiche Ergebnis liefert).
Ich weiß nicht, ob dies von Bedeutung ist, aber die ImageView
s sind ursprünglich nicht mit einer Größe versehen. Die Größe der ImageView
s wird während der Initialisierung automatisch von der Ansicht bestimmt, wenn ich ihr ein Bild zur Anzeige gebe. Könnte dies dazu beitragen, dass ihre Werte 0 sind, auch wenn der Protokollierungscode nach der Übergabe eines Bildes und der automatischen Größenänderung erfolgt? Um dem möglicherweise entgegenzuwirken, habe ich folgenden Code hinzugefügt tableLayout.requestLayout()
wie oben gezeigt, aber das hat nicht geholfen.