如何更改由animateLayoutChanges机制使用的动画?

24

我有一个RecyclerView,用户在其中选择一个项目。 选择后,在文本之前会出现某些视图(请参见图像)。 我想对其出现进行动画处理。

Graphical representation

项目布局中的animateLayoutChanges属性可以完美地完成任务,但无法实现视图出现的动画类型 - 它只是淡入。 我想要它从0到100%大小缩放,我认为它被称为“弹出”动画。

如果我禁用animateLayoutChanges并使用XML动画,那么它可以工作,但附近的文本不再进行动画处理(它应该滑动以适应视图及其边距的空间)。它立即向右移动,然后播放动画。 反向动画更糟,因为文本在视图消失之前重叠。

因此,我需要以某种方式结合默认机制和自己的动画。 最简单的方法是实现这一点而不需要深入自定义动画?

3个回答

43

在错误的地方进行了许多搜寻之后,我自己找到了答案。希望能对某些人有所帮助。

animateLayoutChanges 属性如果被启用,则利用 LayoutTransition 的实例在 ViewGroup 中完成其工作。

因此,为了更改动画,您可以创建一个 LayoutTransition 的实例,为您需要更改的转换设置 Animator,然后通过 setLayoutTransition() 将该实例分配给 ViewGroup

在我的情况下,结果为:

Animator scaleDown = ObjectAnimator.ofPropertyValuesHolder((Object)null, PropertyValuesHolder.ofFloat("scaleX", 1, 0), PropertyValuesHolder.ofFloat("scaleY", 1, 0));
scaleDown.setDuration(300);
scaleDown.setInterpolator(new OvershootInterpolator());

Animator scaleUp = ObjectAnimator.ofPropertyValuesHolder((Object)null, PropertyValuesHolder.ofFloat("scaleX", 0, 1), PropertyValuesHolder.ofFloat("scaleY", 0, 1));
scaleUp.setDuration(300);
scaleUp.setStartDelay(300);
scaleUp.setInterpolator(new OvershootInterpolator());

LayoutTransition itemLayoutTransition = new LayoutTransition();
itemLayoutTransition.setAnimator(LayoutTransition.APPEARING, scaleUp);
itemLayoutTransition.setAnimator(LayoutTransition.DISAPPEARING, scaleDown);

ViewGroup av = (ViewGroup)v.findViewById(R.id.animated_layout);
av.setLayoutTransition(itemLayoutTransition);

更多信息请参阅LayoutTransition参考文档


1
你能否展示完整的代码吗?这段代码对我似乎不起作用。 - android developer
实际上,我已经有一段时间没有编写Android代码了,但是,仍然可以从我的档案中挖掘出来 :) 如果您熟悉RecyclerView(来自android.support.v7库),则此要点应该对您有所帮助:https://gist.github.com/mrnateriver/cd988f6ca745ebad7db7cc16581069ee 这不是RecyclerView.Adapter的完整实现,但它应该让您了解自定义动画的工作原理。 - mrnateriver
我希望能够得到一个普通布局(例如LinearLayout)的解决方案。 - android developer
2
为了使这个例子工作,你需要传递视图实例(需要被动画化的)而不是 null 给调用 (ofPropertyValuesHolder((Object) null – 将 (Object) null 替换为你的 view - konata

2
我发现可以通过这种方式设置动画类型和持续时间。
rootLayout.layoutTransition.enableTransitionType(LayoutTransition.CHANGING)
rootLayout.layoutTransition.setDuration(3000)

其中 rootLayout 是布局,animationLayoutChanges = true 表示启用布局动画


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接