通过ValueAnimator和ViewPropertyAnimator translationX

时间:2015-10-12 15:53:49

标签: android android-layout android-animation android-view

我是Android动画的初学者。我在RelativeLayout中有很少的视图,我希望改变视图位置。我有哪些选择以及它们有何不同?

我试过以下:

view.animate()
.translationX(toX)
.setDuration(duration);

RelativeLayout.MarginLayoutParams params = (RelativeLayout.MarginLayoutParams) view.getLayoutParams();
ValueAnimator animator = ValueAnimator.ofInt(params.rightMargin, 100);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator valueAnimator) {
        params5.rightMargin = (Integer) valueAnimator.getAnimatedValue();
    }
});

两者都会改变视图的位置。任何人都可以解释我这两种方法的区别。我有什么其他选择,哪个是首选。

2 个答案:

答案 0 :(得分:2)

view.animate()
.translationX(toX)
.setDuration(duration);

我认为它是首选的,因为它不会像第二次更新那样调用每个更新上的measure()和layout()。

总的来说:
- translationX旨在规范孩子在其父母中的位置 - 通过改变边距参数来执行动画不是一个好主意(它意味着设置一次,如果有的话很少改变)

答案 1 :(得分:1)

第一个是最好的解决方案。它专门为动画创建,因此它是最优化的版本。 你必须记住,如果你为一个视图设置动画,那么每次移动都会重新计算整个布局(显然是为了翻译,但不是为了alpha),所以你必须保持布局树尽可能平坦。如果可以尝试避免RelativeLayout s,因为它们在每一帧(https://youtu.be/HXQhu6qfTVU)被测量两次。 您可以在此处查看很多关于性能问题的精彩视频:https://www.youtube.com/watch?v=ORgucLTtTDI&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE