Android:有没有办法在TranslateAnimation之后获得View的最新位置?

时间:2012-06-16 14:44:52

标签: android location translate-animation

我知道获取视图位置值的多种方法。

getLocationOnScreen()
getLocationInWindow()
getLeft()

但是,它们都没有实际返回由startAnimation()方法移动的View的当前位置,而只返回原始位置。

所以,现在让我们在每个Click上创建一个向右移动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中使用的值...

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

假设您正在使用Android< 3.0然后你的问题与我的问题类似,我问here。基本上动画与视图本身是分开的,即Android动画制作视图的副本。这就是getLocationOnScreen()总是返回0的原因。不是移动(动画)的视图是移动(动画)的副本。如果您看到我的问题的答案,则此问题已在Android的更高版本中得到解决。

答案 1 :(得分:2)

好吧,如果您想要查看视图在动画期间/之后移动了多少像素,那么您可以在动画上打开转换对象。

以下是使用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在指定时间(在这种情况下,在动画结束时)行进的距离。

答案 2 :(得分:0)

Android姜饼及其下方的动画不会以任何方式改变视图,只会改变它的显示方式。

获得新职位的唯一方法是计算它。