【问题标题】:Start multiple ViewPropertyAnimators at the same time同时启动多个 ViewPropertyAnimator
【发布时间】:2014-10-02 17:48:33
【问题描述】:

使用 Animator 类,您可以简单地调用类似以下的内容来同时播放多个动画:

AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(animatorsArray);
animatorSet.start();

但我找不到任何类似的东西可以与 ViewPropertyAnimator 一起使用。

(仅供参考。我正在尝试为多个 listView 项设置动画)

【问题讨论】:

  • 那你为什么不使用Animator类?!
  • @Jakob 你有没有找到这样做的方法?我正在考虑做同样的事情,到目前为止我能想到的唯一方法是在 Runnable 中添加一个 withStartAction 来启动另一个动画。
  • 或者你可以使用 ViewPropertyAnimatorCompatSet。你知道,项目规模等等。

标签: android animation android-animation


【解决方案1】:

我知道这个问题已经有一年多了,但由于我需要同样的东西并且我想出了一个解决方案,所以我决定分享它:

我创建了一个ObjectAnimator 包装器,您可以以与使用ViewPropertyAnimator 几乎完全相同的方式使用它。而且,您仍然可以使用ObjectAnimator 对象,这样您就可以编写您的AnimatorSet

包装器可用here

示例(为mTestView设置相同参数的动画):

  1. ViewPropertyAnimator

mTestView.animate().withLayer().alphaBy(0.3f).rotationX(27);
  1. ViewPropertyObjectAnimator(我的包装)

ObjectAnimator objectAnimator = 
    ViewPropertyObjectAnimator.animate(mTestView).withLayer().alphaBy(0.3f).rotationX(27).get();

您有一个ObjectAnimator,您可以只使用start() 或在AnimatorSet 内部使用。

【讨论】:

  • 我认为重要的是要指出 Bartek 的包装器只为您提供与 ViewPropertyAnimator 相同的语法,但不提供相同的优化。正如文档所述,ViewPropertyAnimator 相对于 ObjectAnimator 的主要优势在于前者在使视图无效和仅重绘所需部分时更加优化。
  • 是的,这是真的。我的包装器的主要目标是在您实际需要ObjectAnimator 时减少编写相同类型的“包装器代码”的开销。我不认为它可以替代ViewPropertyAnimator。感谢您澄清@CarloConserva!
【解决方案2】:

我建议使用上面提到的 withStartAction。

进一步阅读 Android 文档中的ViewPropertyAnimator 页面

public ViewPropertyAnimator withStartAction (Runnable runnable) 在 API 级别 16 中添加

指定下一个动画运行时发生的动作。如果 在这个 ViewPropertyAnimator 上设置了一个 startDelay,然后 动作将在 startDelay 到期后运行,当实际 动画开始。此方法与 withEndAction(Runnable) 一起是 旨在帮助编排 ViewPropertyAnimator 动画与应用程序中的其他动画或动作。

我即将自己使用它,看起来它正在工作。

我将所有动画代码添加到 Runnable 中,将多个 Runnables 添加到 ArrayList 中,准备就绪后,我循环遍历 ArrayList 并在所有这些上调用 run()。

【讨论】:

  • 谢谢拉斯。如果您想将一组动画链接在一起,然后继续播放,这是一个很好的解决方案。但是,如问题中所述,我希望为多个 listView 项目设置动画,并且这些动画将同时运行。不过,我会给你一个 +1,或者它叫什么。
  • 好的,我确定我在我的代码中使用了该命令,但是,我正在做的是将我的动画放在一个可运行文件中,然后将这些可运行文件添加到一个可运行文件数组中。然后我循环遍历数组并使用 run() 启动它们。我不确定这是否适用于您的情况,因为我一次只能运行两个或三个动画,因此在我的情况下,循环或多或少会立即处理。但是,如果你有几百个动画要同时运行,那么它们似乎不会这样做(尽管你有一个列表视图,所以你不能有那么多动画)
猜你喜欢
  • 2023-03-06
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
相关资源
最近更新 更多