Android 动画系列之补间(Tween)动画详解

转载请标明出处: http://blog.csdn.net/Airsaid/article/details/51591239
本文出自:周游的博客

前言

上一篇博客中写了逐帧动画(Frame)的使用,Android中除了支持逐帧动画(Frame)之外,也提供了对补间(Tween)动画的支持。补间动画就是指开发者只需要指定动画的开始、结束等“关键帧”,而动画的变化的“中间帧”则由系统计算并补齐。这也是“补间”二字的来意。

补间动画对应的类是:Animation。由于Animation是个抽象类,所以我们在使用的时候需要使用它的子类,补间动画的继承关系见下图:
这里写图片描述

Java类名 XML关键字 描述信息
ScaleAnimation <scale> 渐变尺寸伸缩动画效果
TranslateAnimation <translate> 画面转换位置移动动画效果
AnimationSet <set> 一个持有alpah、scale、translate、rotate或者其他set元素的容器
AlphaAnimation <alpha> 渐变透明度动画效果
RotateAnimation <rotate> 画面转移旋转动画效果

接下来详细的介绍一下补间动画的使用。

开发环境

  • IDE版本:AndroidStudio2.0
  • 物理机版本:Win7旗舰版(64位)

补间动画的属性

Animation的属性

JAVA方法 XML属性 解释
setDetachWallpaper(boolean) android:detachWallpaper 是否在壁纸上运行
setDuration(long) android:duration 设置动画持续时间,单位为毫秒
setFillAfter(boolean) android:fillAfter 控件动画结束时控件是否保持动画最后状态
setFillBefore(boolean) android:fillBefore 控件动画结束时控件是否还原到开始动画前的状态
setFillEnable(boolean) android:fillEnable(boolean) 与android:fillBefore效果相同
setInterpolator(boolean) android:interpolator 设置插值器(指定的动画效果,如:回弹等)
setRepeatCount(int) android:repeatCount 重复次数
setRepeatMode(int) android:repeatMode 重复类型:reverse倒序回放、restart从头播放
setStartOffset(long) android:startOffset 调用start函数后等待开行运行的时间,单位为毫秒
setZadjustment(int) android:zAdjustment 表示被设置动画的内容运行时在Z轴的位置(top/bottom/normal),默认为normal

由于Animation类是其抽象父类,那么我们在使用补间动画无论是哪一种都已经具备了以上属性。
下面是每一种补间动画的特有属性:

Alpha属性

JAVA方法 XML属性 解释
AlphaAnimation(float fromAlpha,…) android:fromAlpha 动画开始的透明度(0.0到1.0,0.0是全透明,1.0是不透明)
AlphaAnimation(…, float toAlpha) androdi:toAlpha 动画结束的透明度(同上)

Rotate属性

JAVA方法 XML属性 解释
RotateAnimation(float fromDegrees, …) android:fromDegress 旋转开始角度,正代表顺时针度数,负代表逆时针度数
RotateAnimation(…, float toDegress) android:toDegress 旋转结束角度(同上)
RotateAnimation(…, …, float pivotX, …) android:pivotX 缩放起点X坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)
RotateAnimation(…, …, …, pivotY) android:pivotY 缩放起点Y坐标(同上)

Scale属性

JAVA方法 XML属性 解释
ScaleAnimation(float fromX, …) android:fromXScale 初始X轴缩放比例,1.0表示无变化
ScaleAnimation(…, float toX) android:toXScale 结束X轴缩放比例
ScaleAnimation(…, …, float fromY, …) androd:fromYScale 初始Y轴缩放比例
ScaleAnimation(…, …, …, float toY) android:toYScale 结束Y轴缩放比例
ScaleAnimation(…, float pivotX, …) android:pivotX 缩放起点X轴坐标(同上)
ScaleAnimation(…, float pivotY) android:pivotY 缩放起点Y轴坐标(同上)

Translate属性

JAVA方法 XML属性 解释
TranslateAnimation(float fromXDelta, …) android:fromXDelta 平移起始点X轴坐标
TranslateAnimation(…, float toXDelta) android:toXDelta 平移结束点X轴坐标
TranslateAnimation(…, float fromYDelta, …) android:fromYDelta 平移起始点Y轴坐标
TranslateAnimation(…, float toYDelta) android:toYDelta 平移结束点Y轴坐标

AnimationSet属性

AnimationSet类比较特殊,因为该类是以上4类的组合容器管理类,没有自己特有的属性,它的属性继承自它的父类:Animation。
我们在使用的时候需要注意,当我们在对set标签设置属性的时候,那么其标签下的所有控件都会产生影响。

补间动画的使用

我们可以在代码以及XML中使用补间动画,Android官方文档中推荐我们使用XML文件定义补间动画,因为它更可读,可重复使用,并且支持swappable than hard-coding的动画。

代码中使用补间动画

XML布局中定义了五个按钮,分别对于如下的点击事件:

public void alpha(View v){
    AlphaAnimation anim = new AlphaAnimation(0.0f, 1.0f);
    anim.setDuration(1000);
    v.startAnimation(anim);
}

public void rotate(View v){
    RotateAnimation anim = new RotateAnimation(0.0f, -360f, v.getWidth()/2, v.getHeight()/2);
    anim.setDuration(1000);
    v.startAnimation(anim);
}

public void scale(View v){
    ScaleAnimation anim = new ScaleAnimation(1.0f, 0.0f, 0.0f, 1.0f, v.getWidth() / 2, v.getHeight() / 2);
    anim.setDuration(1000);
    v.startAnimation(anim);
}

public void translate(View v){
    TranslateAnimation anim = new TranslateAnimation(0.0f, 10.0f, 100f, 200f);
    anim.setDuration(1000);
    v.startAnimation(anim);
}
public void set(View v){
    AnimationSet anim = new AnimationSet(this, null);
    AlphaAnimation alpha = new AlphaAnimation(0.0f, 1.0f);
    anim.setDuration(1000);
    RotateAnimation rotate = new RotateAnimation(0.0f, -360f, v.getWidth()/2, v.getHeight()/2);
    anim.setDuration(1000);
    anim.addAnimation(alpha);
    anim.addAnimation(rotate);
    v.startAnimation(anim);
}

运行效果:
这里写图片描述

XML中定义补间动画资源(AnimationDrawable)

定义补间动画的XML资源应该放在/res/anim/路径下,当我们创建好项目,默认是不会有anim这个目录的,自己创建一个就行了。
设置补间动画的语法格式如下:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="持续时间"
    android:interpolator="@[package:]anim/interpolator_resource"
    android:shareInterpolator="boolean">

    <alpha
        android:fromAlpha="float"
        android:toAlpha="float" />

    <scale
        android:fromXScale="float"
        android:fromYScale="float"
        android:pivotX="float"
        android:pivotY="float"
        android:toXScale="float"
        android:toYScale="float" />

    <translate
        android:fromXDelta="float"
        android:fromYDelta="float"
        android:toXDelta="float"
        android:toYDelta="float" />

    <rotate
        android:fromDegrees="float"
        android:pivotX="float"
        android:pivotY="float"
        android:toDegrees="float" />

</set>

上面的语法,包含了大量的fromXX..toXX..属性,这些属性就用于定义View的开始状态和结束状态,当进行缩放变换(scale)、旋转变换(rotate)时,还需要指定pivotX、pivotY两个属性,这两个属性指定变换的中心点,也就是基于哪个点进行缩放、旋转。duration则指定的动画的持续时间。

除此之外,上面的<alpha../>、<scale../>、<transslate../>、<rotate../>都可指定一个android:interpolator属性,该属性指定动画的变化速度,可以实现匀速、正加速、负加速、无规则加速等,Android系统的R.anim类中包含了大量的常量,它们定义了不同的动画速度,其中包括:
* linear_interpolator:匀速变换。
* accelerate_interpolater:加速变换。
* decelerate_interpolater:减速变换。
下面详细讲解一下Interpolator的使用。

补间(Tween)动画与Interpolator

Interpolator在学校学习的时候翻译为了:“插值器“。它的具体作用是为了控制在动画期间需要动态“补入”多少帧,具体在动画运行的哪些时候补入帧。
Interpolator根据指定算法计算出整个动画所需要动态插入帧的密度和位置。简单来说,Interpolator负责控制动画的变化速度,这就使得基本的动画效果(Alpha、Scale、Translate、Rotate)能以匀速变化、加速、减速、抛物线等各种速度变化。

Interpolator是一个接口,它定义了所有Interpolator都必须实现的方法:float getInterpolator(float input),开发者完全可以通过实现Interpolator来控制动画的变化速度。Android为Interpolator提供了如下几个实现类,分别用于实现不同的动画变化速度。

  • LinearInterpolator:动画以匀速改变。
    这里写图片描述
  • AccelerateInterpolator:在动画开始的地方改变速度较慢,然后开始加速。
    这里写图片描述
  • AccelerateDecelerateInterpolator:在动画开始、结束的地方速度较慢,中间的时候加速。
    这里写图片描述
  • CycleInterpolator:动画循环播放指定的次数,变化速度按正弦曲线改变。
    这里写图片描述
  • DecelerateInterpolator:在动画开始的地方改变速度较快,然后开始减速。
    这里写图片描述

以上Interpolator演示动画资源文件:

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

    <translate
        android:fromYDelta="0"
        android:toYDelta="1000" />

</set>

在代码中通过AnimationUtils.loadAnimation()方法加载了动画资源文件:

Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim_interpolator);
mImage.startAnimation(animation);

继续下一篇: 自定义补间动画

发布了55 篇原创文章 · 获赞 117 · 访问量 30万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 精致技术 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览