'Android: Is there a .TranslationX() change listener for a view

I have a button in my layout. And I am animating the position of that button using ObjectAnimator with translationX animation.

ObjectAnimator btnAnimator = ObjectAnimator.ofFloat(myBtn, "translationX", 
        ViewHelper.getTranslationX(myBtn), 0);

btnAnimator.addListener(new AnimatorListener() {
    @Override
    public void onAnimationCancel(Animator arg0) {}

    @Override
    public void onAnimationEnd(Animator arg0) {
        Log.i("TAG","Animation Finished");
    }

    @Override
    public void onAnimationRepeat(Animator arg0) {}

    @Override
        public void onAnimationStart(Animator arg0) {}
});
btnAnimator.setDuration(animationSpeed).start();

Now I would like to have a listener for the TranslationX of that button to notify whenever the TranslationX position of the button changes.



Solution 1:[1]

Here's an easy way I found to do what you're after:

btnAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        Log.e("TAG", "translateX: "+animation.getAnimatedValue("translationX"));
    }
});

btnAnimator.setDuration(animationSpeed).start();

Solution 2:[2]

I used this and it worked as a decent way of listening for changes of the view translation.

var previousTranslationX = view.translationX
var previousTranslationY = view.translationY
view.viewTreeObserver.addOnDrawListener {
  if (previousTranslationX != view.translationX || 
      previousTranslationY != view.translationY) {
    previousTranslationX = view.translationX
    previousTranslationY = view.translationY

    dispatchViewTranslationUpdated(view)
  }
}

Solution 3:[3]

Simply register a callback to be invoked when the view tree is about to be drawn.
Note: This listener almost called every time the view is drawn!

public class MyView extends View {
    private float oldScaleX;
    public MyView(Context context) {
        super(context);

        getViewTreeObserver().addOnDrawListener(new ViewTreeObserver.OnDrawListener() {
            @Override
            public void onDraw() {
                // Many things can invoke this method! We don't know why view going 
                // to be redrawn, So we must determine the cause ourselves.
                float newScaleX=getScaleX();
                if (oldScaleX!=newScaleX) {
                        scaleXUpdated();
                        oldScaleX=newScaleX;
                    }

            }
        });

    }

    private void scaleXUpdated() {
        Log.e(TAG,"scaleX updated "+getScaleX);
    }

}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Simas
Solution 2 Nivaldo Bondança
Solution 3