Android 动画实现 从基础到自定义

1. 基础使用

由于是继承了ValueAnimator类

所以使用的方法十分类似:XML 设置 / Java设置

1.1 Java设置

ObjectAnimator animator = ObjectAnimator.ofFloat(Object object, String property, float ....values);

// Object object:需要操作的对象 // String property:需要操作的对象的属性 // float …values:动画初始值 & 结束值(不固定长度) // 若是两个参数a,b,则动画效果则是从属性的a值到b值 // 若是三个参数a,b,c,则则动画效果则是从属性的a值到b值再到c值 // 以此类推

anim.setDuration(500);

// 设置动画运行的时长

anim.setStartDelay(500);

// 设置动画延迟播放时间

anim.setRepeatCount(0);

// 设置动画重复播放次数 = 重放次数+1

// 动画播放次数 = infinite时,动画无限重复

anim.setRepeatMode(ValueAnimator.RESTART);

// 设置重复播放动画模式

// ValueAnimator.RESTART(默认):正序重放

// ValueAnimator.REVERSE:倒序回放

animator.start();

// 启动动画

1.2 XML 设置

步骤1:在路径 res/animator 的文件夹里创建动画效果.xml文件

此处设置为res/animator/set_animation.xml

步骤2:设置动画参数

set_animation.xml

// ObjectAnimator 采用 标签

/>

在Java代码中启动动画

Animator animator = AnimatorInflater.loadAnimator(context, R.animator.view_animation);

// 载入XML动画

animator.setTarget(view); // 设置动画对象

animator.start(); // 启动动画

1.3 使用实例

此处先展示四种基本变换:平移、旋转、缩放 & 透明度

a. 透明度

mButton = (Button) findViewById(R.id.Button);

// 创建动画作用对象:此处以Button为例

ObjectAnimator animator = ObjectAnimator.ofFloat(mButton, "alpha", 1f, 0f, 1f);

// 表示的是:

// 动画作用对象是mButton

// 动画作用的对象的属性是透明度alpha

// 动画效果是:常规 - 全透明 - 常规

animator.setDuration(5000);

animator.start();

b. 旋转

mButton = (Button) findViewById(R.id.Button);

// 创建动画作用对象:此处以Button为例

ObjectAnimator animator = ObjectAnimator.ofFloat(mButton, “rotation”, 0f, 360f);

// 表示的是:

// 动画作用对象是mButton

// 动画作用的对象的属性是旋转alpha

// 动画效果是:0 - 360

animator.setDuration(5000);

animator.start();

c. 平移

mButton = (Button) findViewById(R.id.Button);

// 创建动画作用对象:此处以Button为例

float curTranslationX = mButton.getTranslationX(); // 获得当前按钮的位置 ObjectAnimator animator = ObjectAnimator.ofFloat(mButton, “translationX”, curTranslationX, 300,curTranslationX);

// 表示的是:

// 动画作用对象是mButton

// 动画作用的对象的属性是X轴平移(在Y轴上平移同理,采用属性"translationY"

// 动画效果是:从当前位置平移到 x=1500 再平移到初始位置

animator.setDuration(5000);

animator.start();

d. 缩放

mButton = (Button) findViewById(R.id.Button);

// 创建动画作用对象:此处以Button为例

ObjectAnimator animator = ObjectAnimator.ofFloat(mButton, “scaleX”, 1f, 3f, 1f); // 表示的是: // 动画作用对象是mButton // 动画作用的对象的属性是X轴缩放 // 动画效果是:放大到3倍,再缩小到初始大小 animator.setDuration(5000); animator.start();

2. 通过自定义对象属性实现动画效果

在上面的讲解,我们使用了属性动画最基本的四种动画效果:透明度、平移、旋转 & 缩放

2.1 具体使用

对于属性动画,其拓展性在于:不局限于系统限定的动画,可以自定义动画,即自定义对象的属性,并通过操作自定义的属性从而实现动画。

那么,该如何自定义属性呢?本质上,就是:

为对象设置需要操作属性的set() & get()方法

通过实现TypeEvaluator类从而定义属性变化的逻辑

类似于ValueAnimator的过程

2.2 实例讲解

下面,我将用一个实例来说明如何通过自定义属性实现动画效果

实现的动画效果:一个圆的颜色渐变

自定义属性的逻辑如下:(需要自定义属性为圆的背景颜色)

步骤1:设置对象类属性的set() & get()方法

设置对象类属性的set() & get()有两种方法:

通过继承原始类,直接给类加上该属性的 get()& set(),从而实现给对象加上该属性的 get()& set()

通过包装原始动画对象,间接给对象加上该属性的 get()& set()。即 用一个类来包装原始对象

此处主要使用第一种方式进行展示。

关于第二种方式的使用,会在下一节进行详细介绍。

MyView2.java

public class MyView2 extends View {

// 设置需要用到的变量

public static final float RADIUS = 100f;// 圆的半径 = 100

private Paint