Android Animation——view animation

边银龙
2023-12-01

分类

  • Alpha 透明
  • Scale 缩放
  • Translation 位移
  • Rotation 旋转

Interpolator

interpolator是用来控制动画进度的,即动画的速率变化。常见的有以下几类:

Java 类res引用(@android:anim/)含义
AccelerateInterpolatoraccelerate_interpolator在动画开始的地方速率改变比较慢,然后开始加速
DecelerateInterpolatordecelerate_interpolator在动画开始的地方速率改变比较慢,然后开始减速
AccelerateDecelerateInterpolatoraccelerate_decelerate_interpolator在动画开始与结束的地方速率改变比较慢,在中间的时侯加速
AnticipateInterpolatoranticipate_interpolator开始的时候向后然后向前甩
OvershootInterpolatorovershoot_interpolator向前甩一定值后再回到原来位置
AnticipateOvershootInterpolatoranticipate_overshoot_interpolator开始的时候向后然后向前甩一定值后返回最后的值
CycleInterpolatorcycle_interpolator动画循环播放特定的次数,速率改变沿着正弦曲线
BounceInterpolatorbounce_interpolator动画结束的时候弹起
LinearInterpolatorlinear_interpolator在动画的以均匀的速率改变

四种动画实践

四种动画的实现方式有两种:

  1. 利用xml方式来实现:

    • 在res/anim目录下创建资源文件(root element为set),然后在其内添加标签alpha(透明)、scale(缩放)、translate(位移)以及rotate(旋转)中的一种或者多者混合
    • 利用AnimationUtils类的loadAnimation来获取动画
    • 调用view的startAnimation方法运行动画
  2. 利用java代码来实现:

    • 直接使用java类:AlphaAnimationScaleAnimationTranslateAnimation 以及RotateAnimation,对其进行初始化以及设置。
    • 调用view的startAnimation方法运行动画

AlphaAnimation 透明动画

xml实现方式

1. 在res/anim目录创建文件alpha文件如下:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fillAfter="false"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator">
    <alpha
        android:fromAlpha="1.0"
        android:toAlpha="0.0"
        android:repeatCount="3"
        android:repeatMode="reverse" />
</set>

android:duration表示动画运行时长

android:fillAftertrue表示view保持动画结束时的状态,false表示动画结束时,view变回执行动画前的状态。

android:interpolator可以参考前面的Interpolator表格的res引用(@android:anim/)

android:fromAlpha表示动画开始时控件的透明度

android:toAlpha表示动画结束时控件的透明度

android:repeatCount表示重复次数,注:只有配置在alpha标签内才有效,如果配置在set标签内则设置无效。

android:repeatMode表示动画重复的模式,分为reverse和restart两种。reverse表示动画结束状态反向执行到动画初始状态,restart表示重新从动画初始状态执行到动画结束状态。注:只有配置在alpha标签内才有效,如果配置在set标签内则设置无效。

注:在xml文件中,repeatCount和repeatMode属性需要设置alpha内才有效,而设置在set内是无效的

2. 在java文件中加载动画

public void runAlphaAnimation(View view){
        Animation animation = AnimationUtils.loadAnimation(this,R.anim.alpha);
        animation.setInterpolator(new LinearInterpolator());
        //animation.setRepeatCount(1);
        //animation.setRepeatMode(Animation.REVERSE);
        animation.setFillAfter(false);
        animation.setDuration(2000);
        imageView.startAnimation(animation);
    }

我们可以看到xml的属性在java代码中也有相关的方法来进行设置。在这里有一点需要注意下,由于我们这里加载的资源是上面的res/anim/alpha.xml文件,其root element为set标签。因此当我们对返回的animation对象使用setRepeatCount和setRepeatMode方法的时候,其本质是为set设置相关属性,此时你就会发现setRepeatCount设置无效了。与之相对,如果我们加载下面的xml文件,setRepeatCount就可以正常使用了。

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromAlpha="1.0"
    android:toAlpha="0.0"
    android:repeatCount="3"
    android:repeatMode="reverse">
</alpha>

java代码实现

直接初始化AlphaAnimation对象并设置,即可。

public void runAlphaAnimation(View view){
        AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f,0.0f);
        alphaAnimation.setDuration(2000);
        alphaAnimation.setInterpolator(new AccelerateDecelerateInterpolator());
        imageView.startAnimation(alphaAnimation);
    }

初始化对象方法public AlphaAnimation(float fromAlpha, float toAlpha)其参数和xml的属性相对应。animation的相关设置方法(如setDuration,setInterpolator,setRepeatCount,setRepeatMode等)都和xml中的属性相对应。

ScaleAnimation 缩放动画

xml实现方式

1. 在res/anim目录创建文件scale文件如下:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="3000"
    android:fillAfter="true">

    <scale
        android:fromXScale="1.0"
        android:toXScale="1.4"
        android:fromYScale="1.0"
        android:toYScale="0.6"
        android:pivotX="50%"
        android:pivotY="50%"/>
</set>

android:fromXScale表示初始X轴缩放比例,1.0f为正常大小。

android:toXScale表示结束X轴缩放比例,1.0f为正常大小。

android:fromYScale表示初始Y轴缩放比例,1.0f为正常大小。

android:toYScale表示结束Y轴缩放比例,1.0f为正常大小。

android:pivotX表示view的缩放中心的横坐标,其值主要有以下三种:

  • Animation.ABSOLUTE:"50"表示以当前View左上角坐标加50px为初始点
  • Animation.RELATIVE_TO_SELF:="50%"表示以当前View的左上角加上当前View宽高的50%做为初始点。
  • Animation.RELATIVE_TO_PARENT:="50%p"表示以当前View的左上角加上父控件宽高的50%做为初始点。

android:pivotY表示view的缩放中心的纵坐标,具体参数同android:pivotX

2. 在java文件中加载动画

public void runAlphaAnimation(View view){
        Animation animation = AnimationUtils.loadAnimation(this,R.anim.scale);
        animation.setInterpolator(new LinearInterpolator());
        animation.setFillAfter(false);
        animation.setDuration(2000);
        imageView.startAnimation(animation);
    }

java代码实现

public void runScaleAnimation(View view){
        ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 1.4f,1.0f,0.6f,
                Animation.RELATIVE_TO_SELF, 0.5f,
                Animation.RELATIVE_TO_SELF, 0.5f);
        scaleAnimation.setDuration(2000);
        imageView.startAnimation(scaleAnimation);
    }

初始化构造方法:public ScaleAnimation(float fromX, float toX, float fromY, float toY,int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) 其中 pivotXType和pivotYType的参数值有Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF和Animation.RELATIVE_TO_PARENT。

TranslateAnimation 位移动画

xml实现方式

在res/anim目录创建文件translate文件如下:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="3000"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator">

    <translate
        android:fromXDelta="0"
        android:toXDelta="300"
        android:fromYDelta="0"
        android:toYDelta="100"/>
</set>

android:fromXDelta表示起始点横坐标,具体参数如下:

  • Animation.ABSOLUTE:"50"表示以当前View左上角坐标加50px为初始点
  • Animation.RELATIVE_TO_SELF:"50%"表示以当前View的左上角加上当前View宽高的50%做为初始点。
  • Animation.RELATIVE_TO_PARENT:"50%p"表示以当前View的左上角加上父控件宽高的50%做为初始点。

android:toXDelta表示结束点横坐标,同上。

android:fromYDelta表示起始点纵坐标,同上。

android:toYDelta表示结束点纵坐标,同上。

2. 在java文件中加载动画

public void runAlphaAnimation(View view){
        Animation animation = AnimationUtils.loadAnimation(this,R.anim.translate);
        animation.setInterpolator(new LinearInterpolator());
        animation.setFillAfter(false);
        animation.setDuration(2000);
        imageView.startAnimation(animation);
    }

java代码实现

public void runTranslateAnimation(View view){
        TranslateAnimation translateAnimation = new TranslateAnimation(0.0f,50.0f,0.0f,50.f);
        translateAnimation.setDuration(2000);
        imageView.startAnimation(translateAnimation);
    }

初始化构造方法:public TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)

RotateAnimation 旋转动画

xml实现方式

1. 在res/anim目录创建文件rotate文件如下:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="3000"
    android:interpolator="@android:anim/bounce_interpolator">

    <rotate
        android:fromDegrees="0"
        android:toDegrees="120"
        android:pivotX="50%"
        android:pivotY="50" />
</set>

android:fromDegrees表示旋转开始角度,正代表顺时针度数,负代表逆时针度数。

android:toDegrees表示旋转结束角度,正代表顺时针度数,负代表逆时针度数。

android:pivotX表示旋转中心X轴坐标。具体参数如下:

  • Animation.ABSOLUTE:"50"表示以当前View左上角坐标加50px为初始点
  • Animation.RELATIVE_TO_SELF:"50%"表示以当前View的左上角加上当前View宽高的50%做为初始点。
  • Animation.RELATIVE_TO_PARENT:"50%p"表示以当前View的左上角加上父控件宽高的50%做为初始点。

android:pivotY表示旋转中心Y轴坐标。具体参数同上。

2. 在java文件中加载动画

public void runAlphaAnimation(View view){
        Animation animation = AnimationUtils.loadAnimation(this,R.anim.rotate);
        animation.setInterpolator(new LinearInterpolator());
        animation.setFillAfter(false);
        animation.setDuration(2000);
        imageView.startAnimation(animation);
    }

java代码实现

public void runRotationAnimation(View view){
        RotateAnimation rotateAnimation = new RotateAnimation(0.0f,60.0f,
                Animation.RELATIVE_TO_SELF, 0.5f,
                Animation.RELATIVE_TO_SELF, 0.5f);
        rotateAnimation.setDuration(2000);
        imageView.startAnimation(rotateAnimation);
    }

初始化构造方法:public RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)其中 pivotXType和pivotYType的参数值有Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF和Animation.RELATIVE_TO_PARENT。具体和前面说的xml对应。

四种动画混合实践

前面介绍了四种动画单一使用的情况。接下来简单说下四种动画混合使用的情况。其实现方式还有有两种:xml实现以及java代码实现。

xml代码实现

在res/anim目录创建mix.xml文件,如下:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5000"
    android:shareInterpolator="false">
    <translate
        android:fromXDelta="0"
        android:toXDelta="300"/>
    <rotate
        android:fromDegrees="0"
        android:toDegrees="360"
        android:pivotX="50%"
        android:pivotY="50%"/>
</set>

在java文件中加载动画

public void runMixAnimation(View view){
        Animation animation = AnimationUtils.loadAnimation(this, R.anim.mix);
        imageView.startAnimation(animation);
    }

java代码实现

public void runMixAnimation(View view){
        AnimationSet set = new AnimationSet(false);
        TranslateAnimation translateAnimation = new TranslateAnimation(0,300,0,0);
        set.addAnimation(translateAnimation);
        RotateAnimation rotateAnimation = new RotateAnimation(0,360,
                Animation.RELATIVE_TO_SELF, 0.5f,
                Animation.RELATIVE_TO_SELF, 0.5f);
        set.addAnimation(rotateAnimation);
        set.setDuration(5000);
        imageView.startAnimation(set);
    }

对比两种实现方式,我们会发现:

  1. xml中的set标签对应着java代码中的AnimationSet

  2. xml中的alphascaletranslaterotate,标签对应着java代码中的AlphaAnimationScaleAnimationTranslateAnimationRotateAnimation

易出错的地方

有些方法(如setRepeatCount,setRepeatMode等)只对AlphaAnimation(或者xml中alpha标签)有效,而对AnimationSet(或者xml中set标签)无效。因此建议,对于只有对于只有一种效果的动画,其xml的root element最好就设为alpha,scale之类的,而不要设为set。

 类似资料:

相关阅读

相关文章

相关问答