我可以更改Android的LayoutTransition的行为以消除淡入淡出但保持高度动画吗?

时间:2015-04-09 22:27:38

标签: android user-interface android-layout android-animation layouttransition

使用此属性添加布局转换很容易:

android:animateLayoutChanges="true" 

但是,您获得的动画并不能创造令人愉悦的用户体验。当元素被添加到布局中时(我使用简单的垂直LinearLayout)或者从变为可见时,我认为这是一个令人讨厌的两阶段过程。首先,房间是为新元素准备的(其他一切都被推下来)。然后,当有足够的空间时,新视图就会消失。同样,当视图被移除或从可见变为消失时,首先它会淡出,然后由它声称的房间逐渐缩小为零。

我真的想要一种方法将动画更改为我真正认为的自然方式:添加视图时,其高度逐渐从零变为其完整大小,因此首先您只看到顶部,没有改变阿尔法。移除视图时,其高度会逐渐变为其完整大小为零,因此在动画结束时,您只能看到顶部,而不会更改Alpha。

如何在Android中完成此操作? (注意:用户可以同时点击几个按钮,并在其他视图的动画结束之前快速连续出现/消失多个元素 - 甚至在它仍然出现时显示某些内容)。

另一个问题可能不是这个问题:为什么这不是默认的?

(如果可能,可以指定稍微不同的行为,首先只显示视图的底部,而不是顶部,就像新视图从上面的视图下滑下来一样?)

1 个答案:

答案 0 :(得分:2)

您必须编写自己的动画师并进行设置。 代码:

 final ViewGroup profileParent = (ViewGroup) view.findViewById(R.id.profileParent);
    LayoutTransition transition = new LayoutTransition();
    Animator appearingAnimation = ObjectAnimator.ofFloat(null, "translationY", 600/*profileParent.getHeight()*/, 0);
    appearingAnimation.addListener(new AnimatorListenerAdapter() {
        public void onAnimationEnd(Animator anim) {
            View view = (View) ((ObjectAnimator) anim).getTarget();
            view.setTranslationY(0f);
        }
    });
    Animator disappearingAnimation = ObjectAnimator.ofFloat(null, "translationY", 0, 600/*profileParent.getHeight()*/);
    appearingAnimation.addListener(new AnimatorListenerAdapter() {
        public void onAnimationEnd(Animator anim) {
            View view = (View) ((ObjectAnimator) anim).getTarget();
            view.setTranslationY(0f);
        }
    });
    transition.setAnimator(LayoutTransition.APPEARING, appearingAnimation);
    transition.setDuration(LayoutTransition.APPEARING, 300);
    transition.setStartDelay(LayoutTransition.APPEARING, 0);

    transition.setAnimator(LayoutTransition.DISAPPEARING, disappearingAnimation);
    transition.setDuration(LayoutTransition.DISAPPEARING, 300);
    transition.setStartDelay(LayoutTransition.DISAPPEARING, 0);

    profileParent.setLayoutTransition(transition);