【问题标题】:How to change animations used by animateLayoutChanges mechanism?如何更改 animateLayoutChanges 机制使用的动画?
【发布时间】:2016-05-12 12:20:48
【问题描述】:

我有一个RecyclerView,用户在其中选择了一个项目。选择后,某些视图在文本之前变得可见(见图)。我想为它的外观制作动画。

项目布局上的animateLayoutChanges 属性完美地完成了这项工作,除了视图外观的动画类型 - 它淡入。我希望它从 0 缩放到 100% 大小,我相信它被称为“弹出”动画.

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

所以我需要以某种方式将默认机制和我自己的动画结合起来。 在不深入研究自定义动画的情况下,最简单的方法是什么?

【问题讨论】:

    标签: android animation layout


    【解决方案1】:

    在错误的地方挖掘了很多之后,我自己找到了答案。可能会对某人有所帮助。

    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 reference documentation 中的更多信息。

    【讨论】:

    • 你能显示完整的代码吗?似乎对我不起作用。
    • 自从我上次为 Android 编码以来实际上已经有一段时间了,但仍然设法从我的档案中挖掘出来 :) 如果你熟悉 RecyclerView(来自 android.support.v7 库)这个gist 应该可以帮助您:gist.github.com/mrnateriver/cd988f6ca745ebad7db7cc16581069ee 它不是 RecyclerView.Adapter 的完整实现,但它应该让您了解自定义动画的工作原理
    • 我希望有一个正常布局的解决方案(例如,LinearLayout)
    • 为了使这个示例工作,您需要将视图实例(需要动画)而不是 null 传递给调用 (ofPropertyValuesHolder((Object) null – 将 (Object) null 替换为您的 view .
    【解决方案2】:

    你可以用 animateLayoutChange 做同样的事情,看下面的文章

    https://proandroiddev.com/the-little-secret-of-android-animatelayoutchanges-e4caab2fddec

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-26
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2018-10-16
      • 2022-08-07
      相关资源
      最近更新 更多