4

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

android:animateLayoutChanges="true" 

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

我真的很想要一种将动画更改为我真正认为是自然的方式的方法:添加视图时,它的高度逐渐从零变为其全尺寸,所以首先你只看到顶部,而不会改变阿尔法。当移除一个视图时,它的高度逐渐变为它的全尺寸为零,因此在动画快结束时您只看到顶部,而无需更改 alpha。

我怎样才能在 Android 中做到这一点?(注意:用户可以在其他视图的动画结束之前同时点击几个按钮并导致多个元素快速连续出现/消失 - 或者甚至在它仍然出现的时候让某些东西出现)。

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

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

4

1 回答 1

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);
于 2016-03-02T12:48:29.887 回答