参考文献:
https://www.cnblogs.com/yuanhao-1999/p/11049875.html
工作原理
属性动画字如其名,是通过改变 View 的属性值来改变控件的形态,说白了就是通过反射技术来获取控件的一些属性如宽度、高度等的 get 和 set 方法,从而实现所谓的动画效果。所以,这就需要我们的 View (如自定义 View 中)具有 set 和 get 方法,如果没有则会导致程序的 Clash 。 具体步骤
首先,系统通过 get 方法获得属性值
系统在时间插值器的作用下,更变属性值
系统调用 set 方法,将属性值重新赋予控件
由此也可以看出:属性动画直接改变了控件的属性,所以动画结束后控件也就发生了永久性的变化。
使用 ObjectAnimator 实现四种动画
这里我打算通过使用 ObjectAnimator 实现四大动画框架:
alpha
scaleX/scaleY
translateX/translateY
rotation
给大家讲解下 ObjectAnimator 使用
private void iniAnimation(){
// 透明度动画
ObjectAnimator.ofFloat(mAlphaImage, "alpha", 1, 0, 1)
.setDuration(4000)
.start();
// 缩放
final AnimatorSet animatorSet = new AnimatorSet();
mScaleImage.setPivotX(mScaleImage.getWidth()+250);
mScaleImage.setPivotY(mScaleImage.getHeight()+250);
animatorSet.playTogether(
ObjectAnimator.ofFloat(mScaleImage, "scaleX", 1, 0)
.setDuration(2000),
ObjectAnimator.ofFloat(mScaleImage, "scaleY", 1, 0)
.setDuration(2000)
);
animatorSet.start();
// 平移 translation
final AnimatorSet translationAnimatorSet = new AnimatorSet();
translationAnimatorSet.playTogether(
ObjectAnimator.ofFloat(mTranslationImage, "translationX", 20, 100)
.setDuration(2000),
ObjectAnimator.ofFloat(mTranslationImage, "translationY", 20,100)
.setDuration(2000)
);
translationAnimatorSet.start();
// 利用 ObjectAnimator 实现旋转动画
final AnimatorSet rotateAnimationSet = new AnimatorSet();
rotateAnimationSet.playTogether(
ObjectAnimator.ofFloat(mRotationImage, "rotation",0, 360)
.setDuration(2000)
);
rotateAnimationSet.start();
}
能让动画直接与对应控件相关联,以使我们从监听动画过程中解放出来,谷歌
的开发人员在ValueAnimator的基础上,又派生了一个类ObjectAnimator:
⚫ public static ObjectAnimator ofFloat(Object target, String propertyName, float…
values)
✓ 第1个参数用于指定这个动画要操作的是哪个控件
✓ 第2个参数用于指定这个动画要操作这个控件的哪个属性
✓ 第3个参数是可变长参数,跟ValueAnimator中的可变长参数的意义一样,
是指上述属性值从哪变到哪。如
【ObjectAnimator.ofFloat(tv,“rotation”,0,180,0);】意思是控件指【tv】(假
设是TextView )的属性【 rotation 】从【0】变到【180】,从而实现了
旋转效果。
✓ 跟踪Android的JDK库可以证明,不光TextView没有,连它的父类View中也
没有这个属性。
✓ 那它是怎么来改变这个值的呢?其实,ObjectAnimator做动画,并不是根
据控件xml中的属性来改变的,而是通过指定属性所对应的set方法来改变
的。
✓ 比如,上面改变rotation的属性值,ObjectAnimator在做动画时就会到指定
控件(TextView)中去找对应的setRotation()方法来改变控件中对应的值。
同理,指定改变”alpha”属性值的时候,ObjectAnimator也会到TextView中去
找对应的setAlpha()方法。
✓ 跟踪JDK代码可知,TextView从View中继承过来几组set方法:
✓ //1、透明度:alphapublic void setAlpha(float alpha)
✓ //2、旋转度数:rotation、rotationX、rotationYpublic void
setRotation(float rotation)public void setRotationX(float rotationX)public
void setRotationY(float rotationY)
✓ //3、平移:translationX、translationYpublic void setTranslationX(float
translationX)public void setTranslationY(float translationY)
✓ //4、缩放:scaleX、scaleYpublic void setScaleX(float scaleX)public void
setScaleY(float scaleY)
⚫ 关于动画的插值器,了解即可