使用对象属性动画器,基本上它们只是数学函数,每 X 毫秒重复调用一次“setN()”方法,其中“N”是您要更改的属性。
在 alpha 示例中提供的示例中,两者都需要调用invalidate()
来重绘您正在制作动画的视图。不同之处在于,当您调用对象时,它会调用setAlpha()
您。如果您要将目标 Object 设置为用于绘制可绘制对象的对象,您仍然需要调用它,以便它将使用新参数重绘。View
invalidate()
Paint
invalidate()
View
Paint
理想情况下,您希望将目标设置为您可以设置的最高级别的子级,以便重绘仅发生在您要设置动画的视图上。例如,如果您将目标设置为根视图,它将调用invalidate()
整个 ViewGroup 中的每个子视图,然后依次调用 ViewGroup 中的每个子视图draw()
。如果将其设置为顶级ImageView
,则只会ImageView
重绘。
为了最好地利用硬件,您需要使用图层属性。首先,您需要决定要设置动画的最顶层父视图是什么。如果您只想淡化Drawable
,那么它将是Drawable
或 包含View
。如果您想淡化所有内容,那么它将是根视图。无论您决定制作什么动画,都将立即应用于View
整体。
setLayerType()
在启动 Animator 之前在父视图上使用。将其设置为View#LAYER_TYPE_HARDWARE
。然后设置一个AnimationListener
并将 LayerType 重置为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();
在这种情况下,如果您要myParentView
使用该translateX
属性进行翻译,那么它会将图层myParentView
及其所有子级放入一个平面中。放入硬件内存。一次翻译整个视图。然后,完成后,myParentView
从内存中删除。
编辑:
最后一点,Alpha 对 CPU 造成严重破坏。如果你有一些半 alpha 的东西并在 View 中翻译它,它会比你简单地翻译 View 更难渲染。谨慎使用它。