Android 属性动画框架 ObjectAnimator、ValueAnimator

参考文献:
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)
⚫ 关于动画的插值器,了解即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭雅琦hh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值