Android: ¿Hay alguna forma de obtener la última posición de View después de TranslateAnimation?

Conozco varias formas de obtener valores de ubicación de una vista.

getLocationOnScreen() getLocationInWindow() getLeft() 

Sin embargo, ninguno de ellos realmente devuelve la ubicación actual del método View I moved by startAnimation (), pero sólo la ubicación original.

Por lo tanto, ahora vamos a hacer una vista que se mueve a la derecha por 10 píxeles en cada clic (estoy omitiendo el diseño, ya que sólo puede colocar cualquier vista en su XML principal y darle onClickListener).

 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 veis, esto no funciona como yo quería, ya que getLocationOnScreen () siempre devuelve el mismo valor (en mi caso, 0), y no refleja el valor que usé en TranslateAnimation …

¿Alguna idea?

Asumiendo que usted está usando Android <3.0 entonces su pregunta puede estar en una vena similar a la mía que pregunté aquí . Básicamente las animaciones están separadas de la vista en sí, 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 (animado) fue la copia que se movió (animado). Si ves las respuestas a mi pregunta este problema se ha abordado en versiones posteriores de Android.

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

He aquí un ejemplo con 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) { } }); 

Puedo no ser exactamente correcto en los índices del arsenal para éstos, utilice definitivamente Matrix.toString () y mire los valores usted mismo. XTraveled y yTraveled le dará la cantidad de distancia recorrida por TranslateAnimation en el momento indicado (en este caso, al final de la animación).

Animaciones en android pan de jengibre y por debajo de realmente no cambiar la vista de ninguna manera, sólo cambiar la forma en que se muestra.

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

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.