属性(Property)动画



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

从某种角度看,属性动画是增强版的补间动画,其强大体现在两方面
  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 .set TranslationY (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();
       
    }
















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值