Android: Есть ли способ получить последнюю позицию View после TranslateAnimation?

Я знаю несколько способов получить значения местоположения View.

getLocationOnScreen() getLocationInWindow() getLeft() 

Однако ни одно из них фактически не возвращает текущее местоположение View I, перемещенного методом startAnimation (), но только исходное местоположение.

Итак, теперь давайте сделаем представление, которое перемещается вправо на 10 пикселей на каждом клике (я опускаю макет, так как вы можете просто разместить любой вид в своем основном XML и дать ему 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); } } 

Как вы видите, это не работает так, как я предполагал, поскольку getLocationOnScreen () всегда возвращает одно и то же значение (в моем случае, 0) и не отражает значение, которое я использовал в TranslateAnimation …

Есть идеи?

Предполагая, что вы используете Android <3.0, тогда ваш вопрос может быть похож на мой, который я задал здесь . В основном анимация отделена от самого представления, т.е. Android оживляет копию вашего представления. Вот почему getLocationOnScreen() всегда возвращает 0. Это не перемещенное (анимированное) представление, это была перемещенная (анимированная) копия. Если вы увидите ответы на мой вопрос, этот вопрос был рассмотрен в более поздних версиях Android.

Ну, если вы пытаетесь увидеть, сколько пикселей сдвинулось во время / после анимации, вы можете открыть объект Transformation в анимации.

Вот пример использования 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) { } }); 

Я могу быть не совсем точным в индексах массивов для них, определенно использую Matrix.toString () и самостоятельно оцениваю значения. XTraveled и yTraveled дадут вам расстояние, пройденное TranslateAnimation в указанное время (в этом случае, в конце анимации).

Анимации на android gingerbread и ниже на самом деле не меняют вид каким-либо образом, только изменяют способ его отображения.

Единственный способ получить новую позицию – вычислить ее.