Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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.

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

Is it possible to get real time x and y coordinates of the image while it is doing TranslateAnimation ?

And if its not possible using TranslateAnimation, is there any other way that gives real time coordinates of image while in motion ?

I tried -

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

and

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

but in both the ways, its giving the initial static coordinate of the ImageView.

like image 780
Gissipi_453 Avatar asked Feb 16 '15 08:02

Gissipi_453


3 Answers

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);
        }
    });
like image 191
Spiri Avatar answered Dec 14 '22 22:12

Spiri


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.

like image 34
Simas Avatar answered Dec 15 '22 00:12

Simas


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.
        */
    }
}
like image 28
bonnyz Avatar answered Dec 14 '22 22:12

bonnyz