当ImageView正在执行平移动画时,是否有可能获取其实时坐标?

13

我有一个在ImageView中进行平移动画的子弹图像。

我需要实时显示坐标以展示其与目标的距离。

ImageView myimage = (ImageView)findViewById(R.id.myimage);    
Animation animation = new TranslateAnimation(100, 200, 300, 400);
animation.setDuration(1000);
myimage.startAnimation(animation);
animation.setRepeatCount(Animation.INFINITE);

在使用TranslateAnimation时,是否可以获取图像的实时x和y坐标?

如果无法使用TranslateAnimation,是否有其他方法可以在运动过程中实时获得图像的坐标?

我尝试过 -

int x = myimage.getLeft();
int y = myimage.getTop(); 

int[] firstPosition = new int[2];
myimage.measure(View.MeasureSpec.EXACTLY, View.MeasureSpec.EXACTLY);
myimage.getLocationOnScreen(firstPosition);
int x = firstPosition[0];
int y = firstPosition[1];

但在两种方式中,它都会给出ImageView的初始静态坐标。


我不知道如何以编程方式实现,但在这种情况下,您总是可以使用数学 :) - Ispas Claudiu
是的,使用数学是一种终极方法,但我正在寻找在Android中是否有其他方法来实现它。看看Android是否有任何特定的函数或解决方法。 - Gissipi_453
你需要什么时候以及为什么需要这些坐标? - Amrut Bidri
@AmrutBidri,一张子弹的图像进行了翻译动画。我需要实时显示坐标,以展示它距离目标有多远。我还在学习Android,这只是练习代码。 - Gissipi_453
那是我的一个大错误。我以为原来的问题已经被删除了。有什么办法可以纠正这个错误吗?@StephanBranczyk - Gissipi_453
显示剩余3条评论
3个回答

8

这是一个完整的例子,基于用户user3249477和Vikram所说的:

    final TextView positionTextView = (TextView)findViewById(R.id.positionTextView);
    ImageView myimage = (ImageView)findViewById(R.id.imageView);    

    ObjectAnimator translateXAnimation= ObjectAnimator.ofFloat(myimage, "translationX", 0f, 100f);
    ObjectAnimator translateYAnimation= ObjectAnimator.ofFloat(myimage, "translationY", 0f, 100f);     
    translateXAnimation.setRepeatCount(ValueAnimator.INFINITE);      
    translateYAnimation.setRepeatCount(ValueAnimator.INFINITE);

    AnimatorSet set = new AnimatorSet();
    set.setDuration(1000);
    set.playTogether(translateXAnimation, translateYAnimation);
    set.start();

    translateXAnimation.addUpdateListener(new AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            imageXPosition = (Float)animation.getAnimatedValue();
        }
    });

    translateYAnimation.addUpdateListener(new AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            imageYPosition = (Float)animation.getAnimatedValue();
            String position = String.format("X:%d Y:%d", (int)imageXPosition, (int)imageYPosition);
            positionTextView.setText(position);
        }
    });

1
明白了怎么做。非常感谢。我在编写Android方面只有一个月的经验,看来我还需要学习很多。 - Gissipi_453
2
没问题 - 很高兴能帮到你 :) - Spiri
我正在按钮点击事件中使用TranslateAnimation。请问您能否解释一下在平移动画结束后如何获取视图的当前位置? - Akash Attal

3
您可以使用一个ObjectAnimator(API 11+):
ImageView iv = (ImageView)findViewById(R.id.markerRed);

// Create animators for x and y axes
ObjectAnimator oax = ObjectAnimator.ofFloat(iv, "translationX", 0f, 100f);
ObjectAnimator oay = ObjectAnimator.ofFloat(iv, "translationY", 0f, 100f);
oax.setRepeatCount(Animation.INFINITE);
oay.setRepeatCount(Animation.INFINITE);

// Combine Animators and start them together
AnimatorSet set = new AnimatorSet();
set.setDuration(1000);
set.playTogether(oax, oay);
set.start();

接着像这样获取动画数值:

Log.e("TAG", "X: " + oax.getAnimatedValue() + " Y:" + oay.getAnimatedValue());

如果你将这些值添加到初始 ImageView 的坐标中,就会得到当前位置。

oax.getAnimatedValue() 和 oay.getAnimatedValue() 仍然只返回初始坐标,没有更新。 - Gissipi_453
@Gissipi_453 你是如何以及何时调用它的?动画必须已经开始并处于动画中间。 - Simas
OP可以使用ValueAnimatorPropertyValuesHolder来控制View.TRANSLATION_XView.TRANSLATION_Y。在使用ValueAnimator时,可以使用addUpdateListener(...)添加一个AnimatorUpdateListener - Vikram

3
我有一个想法:你可以扩展标准的TranslateAnimation,并通过重写applyTransformation方法来拦截动画的每一步。
看一下这个不完整/未经测试的片段:
private class ObservableTranslateAnimation extends TranslateAnimation{

    private float matrixValues[] = new float[9];
    private float actualDx;
    private float actualDy;

    public ObservableTranslateAnimation(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    // ... more constructors 

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        super.applyTransformation(interpolatedTime, t);
        //After that super is called, the matrix gets updated!

        //get the current matrix and extract what you need
        t.getMatrix().getValues(matrixValues);
        actualDx = matrixValues[Matrix.MTRANS_X];
        actualDy = matrixValues[Matrix.MTRANS_Y];

        /*
          Notify someone here (a listener?), or just read the values of actualDx, actualDy from outside
          You can also play around with the other Matrix values.
        */
    }
}

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