美文网首页
属性动画的基本用法

属性动画的基本用法

作者: 李俊的博客 | 来源:发表于2016-06-24 11:40 被阅读50次

    Android 3.0版本开始,系统给我们提供了一种全新的动画模式,属性动画(property animation),它的功能非常强大,弥补了之前补间动画的一些缺陷,几乎是可以完全替代掉补间动画了。

    补间动画的缺陷:
    1、补间动画只能够作用在View上;
    2、补间动画只能够实现移动、缩放、旋转和淡入淡出这四种动画操作;
    3、补间动画只是改变了View的显示效果而已,而不会真正去改变View的属性。

    属性动画机制实际上是一种不断地对值进行操作的机制,并将值赋值到指定对象的指定属性上,可以是任意对象的任意属性。

    使用Java代码定义属性动画

    ValueAnimator

    属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。除此之外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等。

    示例演示

    // 获取ValueAnimator实例
    // 0f, 5f, 3f, 10f为给定的值
    ValueAnimator anim = ValueAnimator.ofFloat(0f, 5f, 3f, 10f);
    // 设置动画持续时间
    anim.setDuration(300);
    // 添加监听器
    anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
                    // 获取当前值
            float currentValue = (float) animation.getAnimatedValue();
            Log.d(TAG, "currentValue: " + currentValue);
        }
    });
    anim.start();       
    

    运行结果

    D/MainActivity: currentValue: 0.0
    D/MainActivity: currentValue: 0.11853263
    D/MainActivity: currentValue: 1.7715302
    D/MainActivity: currentValue: 2.659067
    D/MainActivity: currentValue: 3.818223
    D/MainActivity: currentValue: 4.9866004
    D/MainActivity: currentValue: 4.469303
    D/MainActivity: currentValue: 3.9685845
    D/MainActivity: currentValue: 3.365308
    D/MainActivity: currentValue: 10.0
    

    ValueAnimator的常用方法:
      1)ValueAnimator.ofFloat()方法:添入float类型的值
      2)ValueAnimator.ofInt()方法:添入int类型的值
      3)ValueAnimator.ofObject()方法:添入Object对象
      4)anim.setStartDelay()方法:设置动画延迟播放的时间
      5)anim.setRepeatCount()方法:设置动画循环播放的次数
      6)anim.setRepeatMode()方法:设置动画循环播放的模式,循环模式(RESTART:重新播放、REVERSE:倒序播放)

    ObjectAnimator

    ObjectAnimator继承自ValueAnimator它是可以直接对任意对象的任意属性进行动画操作的,比如说View的alpha属性。

    1)淡入淡出

    ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);  
    animator.setDuration(5000);  
    animator.start();  
    

    2)旋转

    ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);  
    animator.setDuration(5000);  
    animator.start();  
    

    3)移动

    float curTranslationX = textview.getTranslationX();  
    ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "translationX", 
    curTranslationX, -500f, curTranslationX);  
    animator.setDuration(5000);  
    animator.start();  
    

    4)缩放

    ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "scaleY", 1f, 3f, 1f);  
    animator.setDuration(5000);  
    animator.start(); 
    
    AnimatorSet

    实现组合动画功能主要需要借助AnimatorSet这个类。
      1)play(Animator anim)方法:播放动画
      2)after(Animator anim)方法:将现有动画插入到传入的动画之后执行
      3)after(long delay)方法:将现有动画延迟指定毫秒后执行
      4)before(Animator anim)方法:将现有动画插入到传入的动画之前执行
      5)with(Animator anim)方法:将现有动画和传入的动画同时执行

    ObjectAnimator moveIn = ObjectAnimator.ofFloat(textview, "translationX", -500f, 0f);  
    ObjectAnimator rotate = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);  
    ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);  
    AnimatorSet animSet = new AnimatorSet();  
    animSet.play(rotate).with(fadeInOut).after(moveIn);  
    animSet.setDuration(5000);  
    animSet.start();  
    
    Animator监听器

    1)AnimatorListener

    anim.addListener(new Animator.AnimatorListener() {
            // 在动画开始的时候调用
        @Override
        public void onAnimationStart(Animator animation) {
                    
        }
    
            // 在动画结束的时候调用
        @Override
        public void onAnimationEnd(Animator animation) {
    
        }
    
            // 在动画被取消的时候调用
        @Override
        public void onAnimationCancel(Animator animation) {
    
        }
    
            // 在动画重复执行的时候调用
        @Override
        public void onAnimationRepeat(Animator animation) {
    
        }
    });
    

    2)AnimatorListenerAdapter

    anim.addListener(new AnimatorListenerAdapter() {  
         // 在动画结束的时候调用
        @Override  
        public void onAnimationEnd(Animator animation) {  
        }  
    }); 
    

    使用XML定义属性动画

    如果想要使用XML来编写动画,要在res目录下面新建一个animator文件夹,所有属性动画的XML文件都应该存放在这个文件夹当中。

    在XML文件中一共可以使用如下三种标签:
      <animator> 对应代码中的ValueAnimator
      <objectAnimator>对应代码中的ObjectAnimator
      <set>对应代码中的AnimatorSet

    编写
    res/animator/anim_file

    <animator xmlns:android="http://schemas.android.com/apk/res/android"  
        android:valueFrom="0"  
        android:valueTo="100"  
        android:valueType="intType"/>  
    
    <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"  
        android:valueFrom="1"  
        android:valueTo="0"  
        android:valueType="floatType"  
        android:propertyName="alpha"/>  
    
    <set xmlns:android="http://schemas.android.com/apk/res/android"  
        android:ordering="sequentially" >  
      
        <objectAnimator  
            android:duration="2000"  
            android:propertyName="translationX"  
            android:valueFrom="-500"  
            android:valueTo="0"  
            android:valueType="floatType" >  
        </objectAnimator>  
      
        <set android:ordering="together" >  
            <objectAnimator  
                android:duration="3000"  
                android:propertyName="rotation"  
                android:valueFrom="0"  
                android:valueTo="360"  
                android:valueType="floatType" >  
            </objectAnimator>  
      
            <set android:ordering="sequentially" >  
                <objectAnimator  
                    android:duration="1500"  
                    android:propertyName="alpha"  
                    android:valueFrom="1"  
                    android:valueTo="0"  
                    android:valueType="floatType" >  
                </objectAnimator>  
                <objectAnimator  
                    android:duration="1500"  
                    android:propertyName="alpha"  
                    android:valueFrom="0"  
                    android:valueTo="1"  
                    android:valueType="floatType" >  
                </objectAnimator>  
            </set>  
        </set>  
    </set>  
    

    使用

    Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);  
    animator.setTarget(view);  
    animator.start();  
    

    参考

    Android属性动画完全解析(上),初识属性动画的基本用法

    相关文章

      网友评论

          本文标题:属性动画的基本用法

          本文链接:https://www.haomeiwen.com/subject/jzuodttx.html