2012-06-16 8 views
5

Ich kenne mehrere Möglichkeiten, um Standortwerte einer Ansicht zu erhalten.Android: Gibt es eine Möglichkeit, die neueste Position von View nach TranslateAnimation zu erhalten?

getLocationOnScreen() 
getLocationInWindow() 
getLeft() 

jedoch keiner von ihnen gibt tatsächlich die aktuelle Position der Ansicht I von startAnimation() -Methode bewegt, sondern nur die ursprüngliche Lage.

So, jetzt machen wir eine Ansicht, die sich um 10 Pixel auf jeden Klick nach rechts bewegt (Ich unterlasse das Layout, da Sie einfach jede Ansicht in Ihrem Haupt-XML platzieren und onClickListener geben können).

public class AndroidTestActivity extends Activity implements OnClickListener { 
LinearLayout testView; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    testView = (LinearLayout) this.findViewById(R.id.test); 
    testView.setOnClickListener(this); 
} 

public void onClick(View v) { 
    int[] pLoS = new int[2]; 
    testView.getLocationOnScreen(pLoS); 
    TranslateAnimation move = new TranslateAnimation(pLoS[0], pLoS[0] + 10, 0f, 0f); 
    move.setFillAfter(true); 
    move.setFillEnabled(true); 
    testView.startAnimation(move); 
} 

} 

Wie Sie sehen, das nicht funktioniert, wie ich gedacht, da getLocationOnScreen() liefert immer den gleichen Wert (in meinem Fall, 0), und doen't den Wert widerspiegeln ich in TranslateAnimation verwendet ..

Irgendeine Idee?

Antwort

2

Angenommen, Sie verwenden Android < 3.0 dann könnte Ihre Frage in einer ähnlichen Richtung zu mir sein, fragte ich here. Grundsätzlich sind Animationen von der Ansicht selbst getrennt, d. H. Android animiert eine Kopie Ihrer Ansicht. Deshalb gibt getLocationOnScreen() immer 0 zurück. Es ist nicht die Ansicht, die sich bewegt hat (animiert), es war die Kopie, die sich bewegte (animierte). Wenn Sie die Antworten auf meine Frage sehen, wurde dieses Problem in späteren Versionen von Android behoben.

+0

Vielen Dank. – Quv

0

Animationen auf Android Lebkuchen und unten ändern nicht wirklich die Ansicht in irgendeiner Weise, ändern Sie nur die Art, wie es angezeigt wird.

Die einzige Möglichkeit, die neue Position zu erhalten, besteht darin, sie zu berechnen.

+0

Danke. Ich würde ein Array verwenden und es selbst berechnen ... – Quv

2

Nun, wenn Sie versuchen zu sehen, wie viele Pixel die Ansicht während/nach ihrer Animation verschoben hat, können Sie das Transformationsobjekt in der Animation öffnen.

Hier ist ein Beispiel für die AnimationListener mit:

animation.setAnimationListener(new Animation.AnimationListener() { 
     @Override 
     public void onAnimationStart(Animation animation) { 
     } 

     @Override 
     public void onAnimationEnd(Animation animation) { 
      Transformation trans = new Transformation(); 
      // startTime + duration = end of animation 
      int endTime = animation.getStartTime()+animation.getDuration(); 
      animation.getTransformation(endTime, trans); 

      Matrix transformationMatrix = trans.getMatrix(); 
      float[] matrixVals = new float[9]; 
      transformationMatrix.getValues(matrixVals); 
      float xTraveled = matrixVals[2]; 
      float yTraveled = matrixVals[5]; 
      // do something with them here... 
     } 

     @Override 
     public void onAnimationRepeat(Animation animation) { 
     } 
    }); 

ich nicht genau richtig für diese in den Array-Indizes sein kann, verwenden Sie auf jeden Fall Matrix.toString() und Blick auf die Werte selbst. xTraveled und yTraveled geben Ihnen die Entfernung an, die die TranslateAnimation zum angegebenen Zeitpunkt zurücklegt (in diesem Fall am Ende der Animation).

Verwandte Themen