在翻译animation中,是否有可能获得ImageView的实时坐标?

我有一个ImageView中的子弹的图像做翻译animation

我需要显示实时坐标来实时显示目标距离多远。

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的初始静态坐标。

下面是一个基于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); } }); 

您可以使用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(); 

然后像这样获取animation值:

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

如果将这些值添加到初始ImageView的坐标,您将获得当前位置。

我有这个想法:你可以扩展标准的TranslateAnimation并通过覆盖applyTransformation方法来拦截animation的每一步。

看看这个不完整/未经testing的代码片段:

 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. */ } }