5

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

getLocationOnScreen()
getLocationInWindow()
getLeft()

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

因此,现在让我们创建一个在每次单击时向右移动 10 个像素的视图(我省略了布局,因为您可以将任何视图放在主 XML 中并在单击侦听器上提供它)。

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 中使用的值...

任何想法?

4

3 回答 3

2

假设您使用的是 Android < 3.0,那么您的问题可能与我在这里提出的问题相似。基本上,动画与视图本身是分开的,即 Android 会为您的视图副本设置动画。这就是为什么getLocationOnScreen()总是返回 0。移动(动画)的不是视图,而是移动(动画)的副本。如果您看到我的问题的答案,此问题已在更高版本的 Android 中得到解决。

于 2012-06-16T15:33:43.343 回答
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 在指定时间(在本例中为动画结束时)行进的距离。

于 2012-08-16T20:13:45.337 回答
0

android姜饼及以下的动画并没有真正改变视图,只是改变了它的显示方式。

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

于 2012-06-16T16:06:15.613 回答