分析android动画模块
主要思路
Tween 动画序列图
使用样例
下面的代码是一个 view,系统创建 view 时会调用 onCreate 方法,该方法定义了一个 TranslateAniamtion,指定了移动起点和终点,动画持续时间为 1s,最后调用 startAnimation 将该动画保存在 View 的成员 mCurrentAnianmtion 中并启动动画。
注意,在 View 中需要定义成员变量 mCurrentAnimation 和 mTransformation ,分别记录当前的动画和变换。另外需要定义成员函数 startAnimation 启动动画。
class MyView extends View { Animation mCurrentAnimation = null; Transformation mTransformation = new Transformation; private void setAnimation(Animation animation) { mCurrentAnimation = animation; if (animation != null) { animation.reset(); } } public void startAnimation(Animation animation) { animation.setStartTime(animation.START_ON_FIRST_FRAME); setAnimation(animation); invalidate(); } onDraw (Canvas canvas) { long curTime = SystemClock.uptimeMillis (); if (mCurrentAniamtion == null){ canvas.drawBitmap (b, x, y, mPaint); } else { if (!mCurrentAnimation.isInitialized()) //initialize animation mCurrentAnimation.initialize (w, h, pw, ph); boolean more = mCurrentAnimation.getTransformation (curTime, mTransformation); if(more) { Matrix m = canvas.getMatrix(); canvas.setMatrix (mTransformation.getMatrix()); canvas.drawBitmap (b, x, y, mPaint); canvas.setMatrix (m); this.invalidate (); } else { mCurrentAnimation = null; this.invalidate (); } } } void onCreate (){ Animation anim = new TranslateAnimation (10, 20, 0, 0); anim.setDuration (1000); // 1s anim.setInterpolator (new AcceleratInterpolator(3.0f)); startAniamtion (anim); }}