2017-12-31 112 views
0

Ich mache ein einfaches Android-Spiel, und ich habe ein Problem, weil ich meine Spieler Startposition nicht bekommen kann.Wie erhält man ImageView-Position?

Spieler auf dem Bildschirm Start des Spiels zentriert ist, ich will seine Position bekommen, habe ich versucht, viele Möglichkeiten:

ImageView knight = findViewById(R.id.knight); 
Point knightPos = new Point((int)knight.getX(), (int)knight.getY()); 
//or 
Point knightPos = new Point(knight.getLeft(), knight.getTop()); 
//or 
Rect r = knight.getDrawable().getBounds(); 
knightPos = new Point(r.left, r.top); 

Alles gibt mir 0,0

Vielleicht, weil ich Spieler Zentrierung bin mit layout_gravity?

Meine XML-Spieler Bildcode:

<ImageView 
    android:id="@+id/knight" 
    android:layout_width="60dp" 
    android:layout_height="60dp" 
    android:src="@drawable/knight" 
    android:layout_gravity="center"/> 

ich mit ihm stucked bin, wenn es denn layout_gravity, können Sie mir eine andere Art und Weise sagen, dass es zu zentrieren?

EDIT: Früher zentrierte ich Spieler in Java-Code, aber ich wusste nicht, wie es ist Koordinaten Größe zu erhalten, wie es scheint, Bilder Koordinaten nicht in onCreate Methode initialisiert, weil Größe 0,0 auch war, es mich zu positionieren wurde mit:

Display display = getWindowManager().getDefaultDisplay(); 
screenSize = new Point(); 
display.getSize(screenSize); 

knight.setX(screenSize.x/2 - knight.getWidth()/2); 
knight.setY(screenSize.y/2 - knight.getHeight()/2); 

Aber wie ich schon sagte knight.getHeight() und knight.getWidth() 0.

Antwort

0

war Sie ViewTreeObserver implementieren

hier ist das Beispiel: -

 private int finalHeight, finalWidth; 
     @Override 
      protected void onCreate(Bundle savedInstanceState) { 
..... 
     final ImageView iv = (ImageView)findViewById(R.id.scaled_image); 
     final TextView tv = (TextView)findViewById(R.id.size_label); 
     ViewTreeObserver vto = iv.getViewTreeObserver(); 
     vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
      public boolean onPreDraw() { 
       iv.getViewTreeObserver().removeOnPreDrawListener(this); 
       finalHeight = iv.getMeasuredHeight(); 
       finalWidth = iv.getMeasuredWidth(); 
       tv.setText("Height: " + finalHeight + " Width: " + finalWidth); 
       return true; 
      } 
     }); 
+0

dies mir einen Fehler geben, weil finalHeight und finalWidth haben als final gekennzeichnet werden, aber wenn ich es als Endnote werde ich nicht in der Lage, sie außerhalb onPreDraw Funktion zu erhalten. Wenn ich sie als Klassenmitglieder deklariere, kann ich keine Daten speichern, sie sind außerhalb der Funktion gleich 0. Gibt es eine Möglichkeit, diese Variablen außerhalb dieser Methode zu speichern? – Tomek

+0

Ich habe die Antwort aktualisiert, bitte lassen Sie mich wissen, wenn es funktioniert. Wenn ja, bitte die Antwort akzeptieren – lib4