繁体   English   中英

使用动画师类在视图内为可绘制对象设置动画的最佳方法是什么?

[英]What is the optimal way to animate a drawable within a view using the animator classes?

我已经阅读了有关属性动画硬件加速的内容,但仍不确定使用动画类的最有效方法是什么。 (出于这个问题,我不需要在Honeycomb之前支持设备。因此,我想使用动画器类。)

例如,假设我有一个视图。 在此视图中,我有一个想要淡入的BitmapDrawable。视图中还有许多其他元素不会更改。

哪种属性或对象最适合与动画师一起使用? 可绘制的? 我在onDraw中使用位图绘制的绘画? 还有吗

如何通过硬件加速使其最有效? 这是否需要为动画的每个步骤调用invalidate或是否有办法仅对可绘制对象进行动画处理,而不会导致对动画的每个步骤完全重绘视图的其余部分?

我想我想一个最佳的情况是视图的其余部分不必在软件中完全重绘,而是硬件加速有效地使可绘制对象褪色。

对建议的方法有什么建议或指示吗?

谢谢!

通过使用对象属性动画器,基本上它们只是数学函数,每隔X毫秒重复调用“ setN()”方法,其中“ N”是要更改的属性。

在alpha情况下提供的示例中,两者都需要调用invalidate()来重绘正在设置动画的View。 区别在于,当您在View对象上调用setAlpha()时,它将为您调用invalidate() 如果将目标对象设置为用于绘制可绘制对象的Paint对象,则仍然需要在View上调用invalidate() ,以便它将使用新的Paint参数重新Paint

理想情况下,您要将目标设置为可以设置的最高级别的子级,以便仅在要设置动画的视图上进行重绘。 例如,如果将目标设置为根View,它将在整个ViewGroup中的每个子对象上调用invalidate() ,从而在ViewGroup中的每个子对象上调用draw() 如果将其设置为顶级ImageView ,则仅ImageView将被重绘。

为了最好地利用硬件,您需要使用“图层”属性。 首先,您需要确定要设置动画的最顶层父视图。 如果只想淡化Drawable ,则它将为Drawable或包含View 如果要淡化所有内容,则将成为根视图。 无论您决定进行动画处理的内容如何,​​都将立即应用于整个View

在启动Animator之前,请在父视图上使用setLayerType() 将其设置为View#LAYER_TYPE_HARDWARE 然后设置一个AnimationListener并在动画制作完成后将View#LAYER_TYPE_SOFTWARE重置为View#LAYER_TYPE_SOFTWAREView#LAYER_TYPE_NONE

myParentView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
myObjectAnimator.addListener(new ViewAnimator.AnimatorListener() {
  public void onAnimationEnd(Animator animation) {
    myParentView.setLayerType(View.LAYER_TYPE_NONE);
  }
  public void onAnimationRepeat(Animator animation) {
  }
  public void onAnimationStart(Animator animation) {
  }
  public void onAnimationCancel(Animator animation) {
    myParentView.setLayerType(View.LAYER_TYPE_NONE, null);
  }
}
myObjectAnimator.start();

在这种情况下,如果要使用translateX属性转换myParentView ,则它将myParentView层及其所有子级放置在一个平面中。 将其放入硬件内存。 一次翻译整个视图。 然后,完成后,从内存中删除myParentView

编辑:

最后一点,Alpha对CPU造成了严重破坏。 如果您在半alpha上有东西并在视图中进行翻译,则比仅翻译视图要难得多。 谨慎使用。

也许,您可以在原始视图上覆盖一个新视图(仅包含动画器)。 新视图设置为透明。

如果没有原始视图,则应该执行的重置操作会使新视图无效。

完成查询后,我建议您仔细阅读该标准文档 ,它使您了解如何正确使用invalidate() 其次,Android API已经提供了不同的方式来在不同情况下处理动画。

在这里 ,希望您的大部分疑虑都能消除。 请仔细阅读各个小节,并在其中提及相关博客。

希望这会帮助你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM