属性动画:通过Animator执行动画进度过程中持续调用View的属性方法,实现View的平移、缩放、透明度、旋转动画。
对应的属性方法:
// 平移属性方法
public void setTranslationX(float translationX)
public void setTranslationY(float translationY)
// 透明度变化属性方法
public void setAlpha(@FloatRange(from=0.0, to=1.0) float alpha)
// 缩放属性变化方法
public void setScaleX(float scaleX)
public void setScaleY(float scaleY)
// 旋转属性变化动画
public void setRotation(float rotation)
public void setRotationY(float rotationY)
public void setRotationX(float rotationX)
以上是常用的属性方法,其本质上只是改变了View的展示,不会触发重新layout过程。
如果改成随着动画进度不断执行setLayoutParams是会让View持续调用requestLayout方法,进行重新测量、布局、绘制过程,View的实际坐标是会变化的。
每一个View对象都有一个RenderNode对象,View的属性方法的实现都是转调到View的RenderNode对象,比如setTranslationX方法的源码比如:
@RemotableViewMethod
public void setTranslationX(float translationX) {
if (translationX != getTranslationX()) {
invalidateViewProperty(true, false);
// 关键!!
mRenderNode.setTranslationX(translationX);
invalidateViewProperty(false, true);
invalidateParentIfNeededAndWasQuickRejected();
notifySubtreeAccessibilityStateChangedIfNeeded();
}
}
实际写代码验证,当触发平移动画、缩放动画、旋转动画、alpha动画是不会触发View的重新onMeasure、onLayout、onDraw过程的,只是生成matrix对RenderNode进行变换,不对View的真实坐标进行变化,RenderNode的方法都是用native实现的,所以性能上也是比较好的。
- View的width和height不会变化
- 不会重新layout
- 不会重新走onDraw