2012-06-16 18 views
5

Conozco múltiples formas de obtener valores de ubicación de una Vista.Android: ¿Hay alguna forma de obtener la última posición de View después de TranslateAnimation?

getLocationOnScreen() 
getLocationInWindow() 
getLeft() 

Sin embargo, ninguno de ellos realmente devuelve la ubicación actual de la vista me movía por startAnimation método(), pero sólo la ubicación original.

Por lo tanto, ahora hagamos una Vista que se mueve 10 píxeles hacia la derecha en cada Clic (estoy omitiendo el diseño, ya que puede colocar cualquier vista en su XML principal y ponerlo enClickListener).

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); 
} 

} 

Como se puede ver, esto no funciona como era mi intención, ya que getLocationOnScreen() devuelve siempre el mismo valor (en mi caso, 0), y doen't refleja el valor que utilicé en TranslateAnimation ..

¿Alguna idea?

Respuesta

2

Suponiendo que estés usando Android < 3.0, entonces tu pregunta puede ser similar a la mía. Pedí here. Básicamente, las animaciones son independientes de la vista, es decir, Android anima una copia de su vista. Es por eso que getLocationOnScreen() siempre devuelve 0. No es la vista que se ha movido (animada) sino la copia que se movió (animada). Si ves las respuestas a mi pregunta, este problema se ha abordado en versiones posteriores de Android.

+0

Gracias un montón. – Quv

0

Las animaciones en gingerbread android no modifican la vista de ninguna manera, solo cambian la forma en que se muestra.

la única forma de obtener la nueva posición es calculandola.

+0

Gracias. Usaría una matriz y lo calcularía solo ... – Quv

2

Bueno, si está tratando de ver cuántos píxeles ha cambiado la vista durante/después de su animación, puede abrir el objeto Transformation en la animación.

Aquí hay un ejemplo usando el AnimationListener:

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) { 
     } 
    }); 

Puede que no sea exactamente correcta en los índices de matriz para estos, sin duda utilizar Matrix.toString() y mirar a los valores usted mismo. xTraveled y yTraveled te indicarán la distancia recorrida por TranslateAnimation en el momento indicado (en este caso, al final de la animación).

Cuestiones relacionadas