Android 安卓:有没有办法在翻译动画后获得最新的视图位置?

Android 安卓:有没有办法在翻译动画后获得最新的视图位置?,android,location,translate-animation,Android,Location,Translate Animation,我知道获取视图位置值的多种方法 getLocationOnScreen() getLocationInWindow() getLeft() 但是,它们实际上都不会返回我通过startAnimation()方法移动的视图的当前位置,而只返回原始位置 因此,现在让我们创建一个视图,在每次单击时向右移动10个像素(我省略了布局,因为您可以在主XML中放置任何视图并将其设置为onClickListener) 正如您所看到的,这并不是我想要的,因为getLocationOnScreen()总是返回相同的

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

getLocationOnScreen()
getLocationInWindow()
getLeft()
但是,它们实际上都不会返回我通过startAnimation()方法移动的视图的当前位置,而只返回原始位置

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

正如您所看到的,这并不是我想要的,因为getLocationOnScreen()总是返回相同的值(在我的例子中为0),并且不反映我在TranslateImation中使用的值


有什么想法吗?

假设你使用的是安卓<3.0,那么你的问题可能与我问的问题类似。基本上,动画与视图本身是分开的,即Android为视图的副本制作动画。这就是为什么
getLocationOnScreen()
总是返回0。移动(动画)的不是视图,而是副本。如果你看到我问题的答案,这个问题已经在Android的更高版本中得到解决。

Android姜饼和下面的动画不会以任何方式真正改变视图,只会改变视图的显示方式


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

如果您试图查看视图在动画期间/之后移动了多少像素,则可以在动画上打开变换对象

下面是使用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在指定时间(在本例中,是在动画结束时)移动的距离量

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) {
        }
    });