2014-08-28 88 views
2

我的布局中有一个按钮。我使用带有translationX动画的ObjectAnimator为该按钮的位置设置动画。Android:是否有一个视图的.TranslationX()更改侦听器

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

现在我想为该按钮的TranslationX提供一个监听器,以便在按钮的TranslationX位置发生变化时通知它。

回答

2

两种可能的方法:

1)覆盖onLayout()在视图中手动比较和检测位置的变化。

2)使用onLayoutChangeListener您查看:

button.addOnLayoutChangeListener(new OnLayoutChangeListener() { 
    @Override 
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, 
        int oldTop, int oldRight, int oldBottom) { 
     // Check your new position vs the old one 
    } 
}); 
+0

嗨,我已经尝试了'addOnLayoutChangeListener'但它仅在按钮移动的开始和结束时返回位置,但不在移动时返回。 – 2014-08-28 11:12:00

+0

然后尝试onLayout():) – Jitsu 2014-08-28 11:31:05

+0

我想知道为什么没有直接用于TranslationX的Listener。我可以做onLayout(),但现在我必须创建一个单独的类并扩展视图。 – 2014-08-28 11:45:52

1

这里有一个简单的方法我发现这样做你以后:

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

btnAnimator.setDuration(animationSpeed).start(); 
+0

是的。一堆谢谢。它按照需要工作。虽然我在寻找除了动画按钮之外的其他情况下的侦听器,但这对我来说非常合适。 – 2014-08-28 12:27:15

+0

但是,这将工作的其他类型的动画进行意见?动画师在LayoutTransition对象上设置什么? – 2017-11-28 19:19:12

相关问题