使用animation类来animation视图内的最佳方法是什么?

我已阅读了有关“animation”和“ 硬件加速”的内容,但我仍然不确定使用animation类的最有效方法是什么。 (为了这个问题,我不需要在Honeycomb之前支持设备,所以我想使用animation类。)

例如,说我有一个视图。 在这个视图中我有一个我想淡入的BitmapDrawable。视图中还有许多其他元素不会改变。

什么属性或对象最适合animation师使用? 可绘制? 在onDraw中绘制位图的绘图? 别的东西?

如何在硬件加速方面做到最高效? 这是否需要为animation的每一步调用invalidate或者是否有一种方法来为drawable创buildanimation并且不会导致animation的每一步都完全重绘视图的其余部分?

我猜想我认为一个最佳的情况是剩下的视图不必完全用软件重新绘制,而是硬件加速有效地淡化绘图。

任何build议或build议的方法指针?

谢谢!

Solutions Collecting From Web of "使用animation类来animation视图内的最佳方法是什么?"

通过使用Object Property Animators,基本上它们只是math函数,每X毫秒反复调用一个“setN()”方法,其中“N”是您想要更改的属性。

在alpha提供的示例中,两者都需要调用invalidate()来重绘您正在animation的视图。 不同的是当你在View对象上调用setAlpha()时,它会为你调用invalidate() 。 如果要将目标对象设置为用于绘制drawable的Paint对象,则仍然需要在View上调用invalidate() ,以便使用新的Paint参数重新Paint

理想情况下,您要将目标设置为最高级别的子级,因此重绘只发生在您想要设置animation的视图上。 例如,如果将目标设置为根视图,则将对整个ViewGroup中的每个子视图调用invalidate() ,然后调用ViewGroup中的每个子视图的draw() 。 如果将其设置为顶级ImageView ,则只会重绘ImageView

为了最好地利用硬件,您需要使用图层属性。 首先,你需要决定你想要animation的最顶层的父视图是什么。 如果您只想淡入Drawable ,那么它将是Drawable或包含View 。 如果你想淡化一切,那么它将是根视图。 无论你决定做什么animation,都将立刻应用到View中。

在启动Animator之前,在父视图上使用setLayerType() 。 将其设置为View#LAYER_TYPE_HARDWARE 。 然后设置一个AnimationListener并在animation完成后将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放入一个平面中。 把它放入硬件内存。 一次翻译整个视图。 然后,完成后,从内存中删除myParentView

编辑:

最后一点,Alpha会对CPU造成严重破坏。 如果你在half-alpha上有一些东西,并且在视图中翻译它,那么渲染比翻译视图更难。 谨慎使用它。

也许,您可以在原始视图上覆盖一个新的视图(仅包含animation制作者)。 新视图设置为“透明”。

你应该做的重置是无效的新视图没有你原来的看法。

经过您的查询后,我会build议请通过这个标准的文件 ,这是很好的,使您了解如何正确使用invalidate() 。 其次,android API已经提供了不同的方式来处理animation。

在这里 ,我希望你的疑惑将被清除。 请通过分节和相关的博客提到他们的。

希望这会帮助你。