转载请标明出处: 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);

运行结果:

更多相关文章

  1. Android(安卓)属性动画(Property Animation)介绍
  2. Android中Animator & Animation比较
  3. Android手势识别ViewFlipper触摸动画
  4. Android(安卓)屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最
  5. Android动画详细探究
  6. Android——转屏时禁止调用onCreate()
  7. 从零开始打造一个Android(安卓)3D立体旋转容器
  8. Android取消RecyclerView、ListView、ScrollView、HorizontalScr
  9. Android中图像变换Matrix的原理、代码验证和应用(一)

随机推荐

  1. android手势左右滑动
  2. android 计时器,倒计时
  3. [置顶] Android [Dex Loader] Unable to
  4. 【Android】Toast显示乱码解决办法
  5. android PopupWindow例程
  6. Android 电话流程:接电话/挂电话/拨电话
  7. Android Tips Round-Up, Part 4
  8. Android:BaseMultiItemQuickAdapter打造嵌
  9. android弹出dialog后activity背景变暗
  10. Android文件缓存的简单应用Acache