美文网首页Android知识Android开发程序员
Android 属性动画Property Animation(中

Android 属性动画Property Animation(中

作者: 饱醉豚我去年买了个表 | 来源:发表于2017-02-21 15:43 被阅读267次

    Android 属性动画Property Animation(上)介绍了属性动画的概念以及相关的类和接口,本篇来看下具体肿么使用。

    • ValueAnimator
      ValueAnimator指定整形、浮点型或者颜色值作为动画值,在一定时间内平滑过渡。可以通过ofInt(),ofFloat(),或ofObject()来或得一个ValueAnimator,如:
    ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);
    animation.setDuration(1000);
    animation.start();
    

    当调用start()方法后,将一个浮点型值从0.0平滑过渡到1.0,时长1000毫秒。当然也可以自定义类型,如:

    ValueAnimator animation = ValueAnimator.ofObject(new MyTypeEvaluator(), startPropertyValue, endPropertyValue);
    animation.setDuration(1000);
    animation.start();
    

    上述代码没有实际效果,因为ValueAnimator并不直接作用于对象或属性,通常会通过这些计算的值来不断改变动画的对象,可以通过设置监听器并调用getAnimatedValue()来不断获得帧刷新的计算值。如:

     ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f);
      animator.setDuration(200);
      animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    float value = (float) animation.getAnimatedValue();
                    Log.e("TTT", "value is " + value);
                }
            });
      animator.start();
    

    Log输出:

    E/TTT: value is 0.0
    E/TTT: value is 0.0
    E/TTT: value is 0.15204361
    E/TTT: value is 0.36806342
    E/TTT: value is 0.5
    E/TTT: value is 0.63193655
    E/TTT: value is 0.7545208
    E/TTT: value is 0.85906315
    E/TTT: value is 0.93815327
    E/TTT: value is 0.98618495
    E/TTT: value is 1.0
    

    上面代码是从0.0过渡到1.0,ofFloat()方法中可以传入任意多个参数,如:ValueAnimator.ofFloat(0.0f, 0.5f, 0.75f, 1.0f)可以从0.0f过渡到0.5f,再过渡到0.75f,再过渡到1.0f。
    ValueAnimator通常还有下面的方法:

      //设置重复次数
     animator.setRepeatCount(1);
     //REVERSE 倒序播放  RESTART 重新播放
     animator.setRepeatMode(ValueAnimator.REVERSE);
     //延迟播放
     animator.setStartDelay(1000);
    //设置时间插值器为先加速后减速
     animator.setInterpolator(new DecelerateInterpolator());
    

    ValueAnimator 还可以用XML文件来写,这样写的好处是更容易被复用,为了和API 11之前的动画做区分,请将属性动画的XML文件放在res/animator/目录下,如新建一个value_animator.xml文件,示例:

    <?xml version="1.0" encoding="utf-8"?>
    <animator xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="1000"
        android:repeatCount="1"
        android:repeatMode="reverse"
        android:valueFrom="0.0"
        android:valueTo="1.0"
        android:valueType="floatType" />
    

    在代码中加载XML文件:

      //加载XML文件
      ValueAnimator animator = (ValueAnimator) AnimatorInflater.loadAnimator(this, R.animator.value_animator);
     //设置要执行动画的目标
     animator.setTarget(myObject);
     //动画执行
      animator.start();
    

    还可以使用 PropertyValuesHolderKeyframe标签创建一个多步的动画,如:

    <animator xmlns:android="http://schemas.android.com/apk/res/android"
              android:duration="1000"
              android:repeatCount="1"
              android:repeatMode="reverse">
        <propertyValuesHolder>
            <keyframe android:fraction="0f" android:value="0f"/>
            <keyframe android:fraction="0.5f" android:value="5f"/>
            <keyframe android:fraction="1f" android:value="0f"/>
        </propertyValuesHolder>
    </animator>
    

    解释一下PropertyValuesHolder和Keyframe:
    PropertyValuesHolder:顾名思义,就是属性值持有者,它保存了动画过程中所需要操作的属性和对应的值,我们通过ofFloat(Object target, String propertyName, float… values)构造的动画,ofFloat()的内部实现其实就是将传进来的参数封装成PropertyValuesHolder实例来保存动画状态。在封装成PropertyValuesHolder实例以后,后面的操作也是以PropertyValuesHolder为主的。
    **Keyframe:意为关键帧,设置了关键帧后,动画就可以在各个关键帧之间平滑过渡的,一个关键帧必须包含两个原素,第一时间点,第二位置,即这个关键帧是表示的是某个物体在哪个时间点应该在哪个位置上。fraction表示当前进度,value表示当前位置。 **如上面所示:
    <keyframe android:fraction="0f" android:value="0f"/>表示动画进度为0时,动画所在的数值位置为0;
    <keyframe android:fraction="0.5f" android:value="5f"/>表示动画进度为50%时,动画所在的数值位置为5;
    <keyframe android:fraction="1f" android:value="0f"/>表示动画完成时,动画所在的数值位置为0。

    上述XML代码也可以用代码表示:

    //创建关键帧
    Keyframe keyframe1 = Keyframe.ofFloat(0f, 0f);
    Keyframe keyframe2 = Keyframe.ofFloat(0.5f, 5f);
    Keyframe keyframe3 = Keyframe.ofFloat(1.0f, 0f);
    //创建PropertyValuesHolder 
    PropertyValuesHolder propertyValuesHolder = PropertyValuesHolder.ofKeyframe(propertyName, keyframe1, keyframe2, keyframe3);
    //创建ObjectAnimator 
    ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(target, propertyValuesHolder);
    //设置动画时长
    objectAnimator.setDuration(1000);
    //设置动画重复次数
    objectAnimator.setRepeatCount(1);
    //设置动画重复模式
    objectAnimator.setRepeatMode(ValueAnimator.REVERSE);
    //启动动画
    objectAnimator.start();
    

    如果想无限循环动画,调用setRepeatCount(ValueAnimator.INFINITE)即可。

    • AnimatorSet
      如果想使用组合动画,可以使用AnimatorSet将多个动画组合到一起:
    AnimatorSet bouncer = new AnimatorSet();
    bouncer.play(bounceAnim).before(squashAnim1);
    bouncer.play(squashAnim1).with(squashAnim2);
    bouncer.play(squashAnim1).with(stretchAnim1);
    bouncer.play(squashAnim1).with(stretchAnim2);
    bouncer.play(bounceBackAnim).after(stretchAnim2);
    ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
    fadeAnim.setDuration(250);
    AnimatorSet animatorSet = new AnimatorSet();
    animatorSet.play(bouncer).before(fadeAnim);
    animatorSet.start();
    

    执行顺序:
    1.执行bounceAnim动画
    2.同时执行squashAnim1, squashAnim2, stretchAnim1, stretchAnim2动画
    3.执行bounceBackAnim动画
    4.最后fadeAnim.

    下一篇:Android 属性动画Property Animation(下)

    相关文章

      网友评论

        本文标题:Android 属性动画Property Animation(中

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