Android 动画系列之自定义补间动画

Posted Airsaid

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 动画系列之自定义补间动画相关的知识,希望对你有一定的参考价值。

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

前言

上一篇写了补间动画的使用,由于篇幅原因,就把自定义补间动画单独拿出来了。这一篇继续写补间动画~

在上一篇中写到了android提供了Animation类作为补间动画的抽象基类,并提供了四个子类:ScaleAnimation 、TranslateAnimation、AlphaAnimation、RotateAnimation分别实现了四种基本动画形式:缩放改变、位置改变、透明度改变和旋转改变。
但是我们在实际项目开发中,也有可能遇到更复杂的动画形式。比如说:三维旋转等。那么这个时候Android自己提供的就不能满足我们的需求了。我们需要自己来定义一个补间动画。

其实自定义补间动画并不难,我们只需要继承Animation抽象类,继承Animation类的关键是要重写该抽象类的applyTransformation(float interpolatedTime, Transformation t)方法,该方法中的两个参数说明如下:

  • interpolatedTime:代表了动画的时间进行比。不管动画实际的持续时间如何,当动画播放时,该参数总是自动从0变化到1。

  • Transformation :代表了补间动画在不同时刻对图形或组件的变形程度。

从上面的介绍可以看出,实现自定义补间动画的重点就在于重写applyTransformation方法时根据interpolatedTime时间来动态的计算动画对图形的变形程度

Transformation代表了对图片或视图的变形程度,该对象里封装了一个Matrix对象,对它所包装的Matrix对象进行旋转、位置、倾斜等变换时,Transformation将会控制所对于的图片或者视图进行相应的变换。

下面以一个自定义三维旋转的补间动画为例,演示下自定义补间动画的使用。

使用

首先需要介绍一个类:Camera。这个Camera并非代表手机的摄像头,而是一个空间变换工具,作用有点类似于Matrix,但是比Matrix更加强大。
Camera提供了如下常用方法:
* getMatrix(Matrix matrix):将Camera所做的变换应用到指定的Matrix上。
* rotateX(float deg):使目标组件沿X轴旋转。
* rotateY(float deg):使目标组件沿Y轴旋转。
* rotateZ(float deg):使目标组件沿Z轴旋转。
* translate(float x, float y, float z):使目标组件在三维空间里进行位移变换。
* applyToCanvas(Canvas canvas):把Camera所做的变换应用到Canvas上。

下面的程序里利用Camera来自定义在三维空间的动画,该程序的自定义动画类代码如下:

/**
 * 作者:周游
 * 时间:2016/06/05 13:03
 * 描述:自定义补间动画演示(三维旋转动画)
 */
public class CustomTweenAnimation extends Animation {

    private float mCenterX;
    private float mCenterY;
    private int mDuration;

    private Camera mCamera = new Camera();

    public CustomTweenAnimation(float x, float y, int duration) {
        this.mCenterX = x;
        this.mCenterY = y;
        this.mDuration = duration;
    }

    @Override
    public void initialize(int width, int height, int parentWidth, int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
        // 设置动画持续时间
        setDuration(mDuration);
        // 设置动画结束后效果保留
        setFillAfter(true);
        // 设置匀速变换
        setInterpolator(new LinearInterpolator());
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        super.applyTransformation(interpolatedTime, t);
        mCamera.save();
        // 根据interpolatedTime时间来控制x、y、z轴上的偏移
        mCamera.translate(100.0f - 100.0f * interpolatedTime, 150.0f * interpolatedTime - 150
                , 80.0f - 80.0f * interpolatedTime);
        // 设置根据interpolatedTime时间在x轴上旋转不同角度
        mCamera.rotateX(360 * interpolatedTime);
        // 设置根据interpolatedTime时间在y轴上旋转不同角度
        mCamera.rotateY(360 * interpolatedTime);
        // 获取Transformation参数的Matrix对象
        Matrix matrix = t.getMatrix();
        // 将Camera所做的变换应用到Transformation的Matrix上
        mCamera.getMatrix(matrix);
        matrix.preTranslate(-mCenterX, -mCenterY);
        matrix.postTranslate(mCenterX, mCenterY);
        mCamera.restore();
    }
}

启动动画:

CustomTweenAnimation customTweenAnimation = new CustomTweenAnimation(50, 50, 5000);
mTextView.startAnimation(customTweenAnimation);

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

以上是关于Android 动画系列之自定义补间动画的主要内容,如果未能解决你的问题,请参考以下文章

Android动画基础

Android补间动画(附带Demo案例)

Android逐帧动画和补间动画

Android 中的动画有哪几类,它们的特点和区别是啥

android中补间动画怎样循环执行

Android中的动画具体解释系列——飞舞的蝴蝶