7

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

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

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

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

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

对推荐方法有任何建议或指示吗?

谢谢!

4

3 回答 3

4

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

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

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

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

setLayerType()在启动 Animator 之前在父视图上使用。将其设置为View#LAYER_TYPE_HARDWARE。然后设置一个AnimationListener并将 LayerType 重置为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();

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

编辑:

最后一点,Alpha 对 CPU 造成严重破坏。如果你有一些半 alpha 的东西并在 View 中翻译它,它会比你简单地翻译 View 更难渲染。谨慎使用它。

于 2012-11-02T15:03:24.623 回答
1

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

你应该做的重置是无效的,没有原始视图的新视图。

于 2012-11-08T01:59:40.370 回答
1

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

在这里,我希望您的大部分疑问都将得到解决。请浏览他们提到的小节和相关博客。

希望这会帮助你。

于 2012-11-08T10:45:28.667 回答