使用此属性添加布局转换很容易:
android:animateLayoutChanges="true"
但是,您获得的动画并不能创造令人愉悦的用户体验。当元素被添加到布局中时(我使用简单的垂直LinearLayout)或者从变为可见时,我认为这是一个令人讨厌的两阶段过程。首先,房间是为新元素准备的(其他一切都被推下来)。然后,当有足够的空间时,新视图就会消失。同样,当视图被移除或从可见变为消失时,首先它会淡出,然后由它声称的房间逐渐缩小为零。
我真的想要一种方法将动画更改为我真正认为的自然方式:添加视图时,其高度逐渐从零变为其完整大小,因此首先您只看到顶部,没有改变阿尔法。移除视图时,其高度会逐渐变为其完整大小为零,因此在动画结束时,您只能看到顶部,而不会更改Alpha。
如何在Android中完成此操作? (注意:用户可以同时点击几个按钮,并在其他视图的动画结束之前快速连续出现/消失多个元素 - 甚至在它仍然出现时显示某些内容)。
另一个问题可能不是这个问题:为什么这不是默认的?
(如果可能,可以指定稍微不同的行为,首先只显示视图的底部,而不是顶部,就像新视图从上面的视图下滑下来一样?)
答案 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);