其实动画的的本质,就是通过不断改变matrix的值,然后View根据matrix,不断的重绘制,从而形成连续变化的效果。
所以我们要自定义我们的动画,其实就是如何设置这个matrix的值的问题。view的显示都是通过这个matrix
的值来确定,包括坐标,大小等
关于android.graphics.Matrix的详细介绍请看:matrix 详细介绍
当我们给View注册一个Animation对象的时候,就可以获得这个View的 transformation matrix,这个animation的一个回调方法,
protected void applyTransformation(float interpolatedTime, Transformation t)
可以拿到这个matrix,从而我们就可以在这个方法中修改这个matrix值,来实现我们想要的动画。通过源码我们知道,其实系统提供的四种tween动画也是这么实现的。
下面看一个缩放的动画小例子:
package com.example.liaoli.animationdome.animation; import android.graphics.Matrix; import android.util.Log; import android.view.animation.Animation; import android.view.animation.DecelerateInterpolator; import android.view.animation.Transformation; /** * Created by liaoli on 2015/12/28. */ public class CustomAnimation_1 extends Animation { private static final String TAG = "CustomAnimation_1"; @Override public void initialize(int width, int height, int parentWidth, int parentHeight) { super.initialize(width, height, parentWidth, parentHeight); setDuration(1000); setInterpolator(new DecelerateInterpolator()); setFillAfter(true); } /** * 系统会不断的调用此方法来同步动画,每次参数interpolatedTime都会变化, * 值从0-1,表示动画进展,当interpolatedTime的值为1时表示动画结束。 * 参数Transformation t ,可以获得当前参数Transformation Matrix的信息, * 我们的目的,或者说动画的本质就是修改这个矩阵的值。每次传入的都是单位矩阵 * 这是我们最初的那个矩阵,没有发生动画之前的那个矩阵 * 根据动画进行的进度(interpolatedTime)。我们会给矩阵设置不同的值 * 当view在paint时,新的matrix起作用,形成动画效果。 * * * @param interpolatedTime 是怎么产生的?这个值是我们设置的插值器在 * getTransformation(long currentTime, Transformation outTransformation) * 根据时间生成的, * @param t 是个什么东西?Transformation 类包含一个透明度属性 和一个Matrix * 透明度就是view的透明度,注意此Matrix是没有播放动画时view对应的Matrix * 其实就是一个3x3的单位矩阵 */ @Override protected void applyTransformation(float interpolatedTime, Transformation t) { //super.applyTransformation(interpolatedTime, t); Matrix matrix = t.getMatrix(); Log.e(TAG,"----------start----------"); Log.e(TAG,"interpolatedTime = " + interpolatedTime); Log.e(TAG,"interpolatedTime = " + interpolatedTime); Log.e(TAG,"Transformation t = " + t); Log.e(TAG,"Transformation t matrix= " + matrix); /** * * 缩放, * interpolatedTime的值是从0变到1, * 这里我们长和宽的缩放值都为interpolatedTime,则缩放的效果则为从没有缩放到View原本的大小, * 我们可以任意定义这个两个值, * 不过最好与interpolatedTime,产生关联,应为这样动画才能持续,线性的或者非线性的, * 都可以。 * */ matrix.setScale(interpolatedTime, interpolatedTime); Log.e(TAG, "Transformation t matrix= " + matrix); Log.e(TAG,"---------- end ----------"); }
在view上使用该动画
CustomAnimation_3 customAnimation_3 = new CustomAnimation_3(); lv = (ListView)findViewById(R.id.lv); lv.startAnimation(customAnimation_3);
效果: