使用动画师类在视图中设置drawable动画的最佳方法是什么?

cot*_*aws 7 animation android drawing hardware-acceleration

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

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

什么属性或对象最好与动画师一起使用?可画的?我在onDraw中绘制位图的颜料?别的什么?

如何通过硬件加速实现最高效?这是否需要为动画的每个步骤调用invalidate,或者是否有一种方法可以为drawable设置动画并且不会导致视图的其余部分在动画的每个步骤中完全重绘?

我想我认为最佳情况是视图的其余部分不必在软件中完全重绘,而是硬件加速有效地淡化了drawable.

有关推荐方法的建议或指示吗?

谢谢!

Dee*_*eeV 4

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

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

理想情况下,您希望将目标设置为最高级别的子级,以便重绘仅发生在您想要设置动画的视图上。例如,如果您将目标设置为根视图,它将调用invalidate()整个 ViewGroup 中的每个子视图,进而调用draw()ViewGroup 中的每个子视图。如果将其设置为顶层ImageView,则只会ImageView重绘。

为了最好地利用硬件,您需要使用层属性。首先,您需要决定要设置动画的最顶层父视图是什么。如果您只想淡出Drawable,那么它将是Drawable或 包含View。如果您想淡出所有内容,那么它将是根视图。View无论您决定制作什么动画,都将立即应用于整个动画。

setLayerType()在启动 Animator 之前在父视图上使用。将其设置为View#LAYER_TYPE_HARDWARE. 然后设置AnimationListenerLayerType 并在动画制作完成后将其重置为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();
Run Code Online (Sandbox Code Playgroud)

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

编辑:

最后一点要注意的是,Alpha 对 CPU 造成了严重破坏。如果您在半阿尔法上有一些东西并将其平移到视图上,那么渲染将比简单地平移视图更困难。谨慎使用它。