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

5

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

getLocationOnScreen()
getLocationInWindow()
getLeft()

然而,它们中没有一个实际返回我通过startAnimation()方法移动的View的当前位置,只返回原始位置。

因此,现在让我们创建一个View,在每次单击时向右移动10像素(我省略了布局,因为您可以在主XML中放置任何视图并为其添加onClickListner)。

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个回答

2
假设您使用的是 Android < 3.0,则您的问题可能与我在此处提出的问题类似。基本上,动画与视图本身是分开的,即 Android 动画一个视图的副本。这就是为什么getLocationOnScreen()总是返回0。它不是视图移动(动画),而是副本移动(动画)。如果您看到我的问题的答案,这个问题已经在后来的 Android 版本中得到了解决。

2

如果您想查看视图在动画期间/之后移动了多少像素,则可以打开动画的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在指定时间(在这种情况下,动画结束时)所移动的距离。


0

Android Gingerbread及以下版本上的动画实际上并不会以任何方式改变视图,只是改变了它的显示方式。

获取新位置的唯一方法是通过计算。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接