属性(Property)动画

本文深入解析了属性动画与补间动画的区别,重点介绍了属性动画的强大功能,包括如何改变任意对象的属性值,以及如何通过ValueAnimator和ObjectAnimator创建复杂的动画效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



属性动画与补间动画的区别:
最大的区别是补间动画就算控件移动到任何位置,控件本身位置还是不变。
而属性动画是直接改变控件的位置。

从某种角度看,属性动画是增强版的补间动画,其强大体现在两方面
  1. 补间(tween)动画只能定义两个关键帧在透明度、旋转、倾斜、位移这4个方面的变化,而属性动画可以定义任何属性的变化。
  2. 补间动画只能对 UI 组件执行动画,而属性动画几乎可以对任何对象执行动画。

需要的属性:
android:duration :动画持续时间。默认值 300 毫秒。
android:interpolator :动画插值方式。与补间动画中插值属性作用类似。
    插值器android:interpolator也要定义在set节点才有效
android:repeatCount :动画重复次数。repeatCount在AnimationSet中不起作用
android:repeatMode :重复方式。指定动画结束后,从头重播还是反向播放。
<set.../> 元素组合 :动画集。可将多个属性动画合并为一组,既可使之依次播放,也可使之同步播放。
帧刷新频率。指定每帧播放时间。默认值 10 毫秒。帧刷新频率。指定每帧播放时间。默认值 10 毫秒。


属性动画API:
  • Animator :提供了创建属性动画的基类,通常用于被继承并重写其相关方法。
  • ValueAnimator :属性动画主要的时间引擎,定义了属性动画的大部分核心功能,包括计算各个帧的相关属性值、负责处理更新事件,按属性值的类型控制计算规则
  • ObjectAnimator :是 ValueAnimator 子类,允许程序员对指定对象的属性执行动画。实际应用中因其简单更为常用。
  • AnimatorSet :是 Animator 的子类,用于组合多个 Animator,并指定多个 Animator 是依次播放还是同步播放。


使用 ValueAnimator 创建动画
  • 调用 ValueAnimator 的 ofInt()、ofFloat() 或 ofObject() 静态方法创建 ValueAnimator 实例。
  • 调用 ValueAnimator 的 setXxx() 设置动画持续时间、插值方式、重复次数等。
  • 调用 ValueAnimator 的 start() 方法启动动画。
  • 为 ValueAnimator 注册 AnimatorUpdateListener 监听器,用以监听 ValueAnimator 计算出来的值的改变(可通过 getAnimatedValue() 方法获取当前帧的值),并将这些值应用到指定对象。

使用 ObjectAnimator 创建动画
  • ObjectAnimator 可直接将 ValueAnimator 在动画过程中计算出来的值应用到指定对 象的指定属性上,不需要注册监听器。
  • 使用 ObjectAnimator 的 ofInt()、ofFloat() 或 ofObject() 静态方法创建 ValueAnimator 实例时需要指定具体的对象及其属性名。

  • //参数
       // iView.setTranslationY(3);
        /**
         * 参数一:设置动画的对象 条件:一定要保证对象拥有getter setter方法 因为拥有getter setter方法的东西才能说是一个属性
         * 参数二:设置属性动作的名称 iView.setTranslationY(3);
         * 参数三:view的坐标起点
         * 参数四:坐标的结束点
         */
        ObjectAnimator ofFloat = ObjectAnimator.ofFloat(iView, "TranslationY", 0, 500);
ofFloat.start();


  • 使用 ObjectAnimator 需注意:
须为该对象对应的属性提供 setter 方法,例如 setAlpha(float value) 方法
调用 ObjectAnimator 的 ofInt()、ofFloat() 或 ofObject() 工厂方法时 values... 参数只提供了一个结束值。因而该对象应为该属性提供一个 getter 方法以返回一个开始值。
如果动画的对象是 View,为了能显示动画效果,可能还需在 onAnimationUpdate() 事件监听方法中调用 View.invalidate() 方法来刷新屏幕不过 View 定义的 setter 方法(如 setAlpha()、setTranslationX() )都会自动调用 invalidate() 方法来的显示。(比如对 Drawable 对象的 color 属性执行动画)。
监听:addUpdateListener :监听对象属性值变化
监听:addListener :监听动画执行状态


使用属性动画:

  • 定义属性动画有如下两种方式:
    • 使用 ValueAnimator 或 ObjectAnimator 的静态工厂方法来创建动画。
    • 使用资源文件来定义动画。
      • 第一步:在res/animator目录下创建文件anim_file.xml
anima_file.xml
    • 第二步,在代码中加载动画文件

Animator loadAnimator = AnimatorInflater.loadAnimator(this, R.animator.anima_file);
      loadAnimator.setTarget(iView);
      loadAnimator.start();

  • 使用属性动画的详细步骤:
    1. 创建 ValueAnimator 或 ObjectAnimator 对象——从 XML 资源文件加载动画资源或调用两者的静态工厂方法来创建均可。
    2. 根据需要为 Animator 对象设置属性。
    3. 如果需要监听 Animator 的动画开始事件、动画结束事件、动画重复事件、动画值改变事件,并提供相关响应处理代码,则应为 Animator 注册事件监听器。
    4. 如果有多个动画需要依次或同步播放,应使用 AnimatorSet 组合这些动画。
    5. 调用 Animator 的 start() 方法启动动画。

长宽 同时缩小 到原来一半
public void scale(View cView) {
//      iView.setScaleX(0.1f);
        //定义动画
        ObjectAnimator ofFloat = ObjectAnimator.ofFloat(iView, "ScaleX", 1, 0.5f);
        //持续时间
        ofFloat.setDuration(1000);
        //监听变化  但是一定要在start方法之前
        ofFloat.addListener(new AnimatorListener() {
             @Override
             public void onAnimationStart(Animator animation) {
                 // 动画开始
             }
             @Override
             public void onAnimationRepeat(Animator animation) {
                 // 重复
             }
             @Override
             public void onAnimationEnd(Animator animation) {
                 // 动画结束
             }
             @Override
             public void onAnimationCancel(Animator animation) {
                 // 动画取消
             }
        });
        //ValueAnimator 专用侦听,用来监听属性改变
        ofFloat.addUpdateListener(new AnimatorUpdateListener() {
             /**
              * 当属性值发生改变的时候调用
              */
             @Override
             public void onAnimationUpdate(ValueAnimator animation) {
                 // 获取动画执行的百分比
                 float animatedFraction = animation.getAnimatedFraction();
                 Log.i("TAG", "-------onAnimationUpdate-----"+animatedFraction);
                 float value = 1-animatedFraction*0.5f;
                 iView.setScaleY(value);
             }
        });
        ofFloat.start();
       
    }


set用法

//目的  把左上角图片移动到右下角
    //使用set动画xy轴都移动
    public  void set(View cView) {
        //获取屏幕高度 宽度
        DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
        int widthPixels = displayMetrics.widthPixels;
        int heightPixels = displayMetrics.heightPixels;
        //定义xy方向的移动
        ObjectAnimator ofFloatX = ObjectAnimator.ofFloat(iView, "TranslationX", 0,widthPixels-iView.getWidth());
//      ofFloatX.setInterpolator(new acc);
        ObjectAnimator ofFloatY = ObjectAnimator.ofFloat(iView, "TranslationY", 0,heightPixels-iView.getHeight());
        //3定义
        AnimatorSet set = new AnimatorSet();
        //4通过add加载
        set.playTogether(ofFloatX,ofFloatY);
        //设置持续时间
//      set.setDuration(4000);
        set.start();
       
    }
















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值