[英]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_SOFTWARE
或View#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上有东西并在视图中进行翻译,则比仅翻译视图要难得多。 谨慎使用。
也许,您可以在原始视图上覆盖一个新视图(仅包含动画器)。 新视图设置为透明。
如果没有原始视图,则应该执行的重置操作会使新视图无效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.