Is it possible to get real time coordinates of an ImageView while it is in Translate animation?

前端 未结 3 644
失恋的感觉
失恋的感觉 2021-01-11 14:18

I have an image of a bullet in an ImageView that does Translate animation.

I need to show real time coordinates to show how far it is from target in real time.

相关标签:
3条回答
  • 2021-01-11 14:33

    You can use an 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();
    

    Then fetch the animation values like this:

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

    If you add these values to the initial ImageView's coordinates, you'll get the current location.

    0 讨论(0)
  • 2021-01-11 14:34

    I had this idea: you can extend the standard TranslateAnimation and intercept every step of the animation by overriding the applyTransformation method.

    Take a look at this incomplete/untested snippet:

    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.
            */
        }
    }
    
    0 讨论(0)
  • 2021-01-11 14:45

    Here's a complete example based on what user3249477 and Vikram said:

        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);
            }
        });
    
    0 讨论(0)
提交回复
热议问题