private static class SampleView extends View {
private AnimateDrawable mDrawable;
public SampleView(Context context) {
super(context);
setFocusable(true);
setFocusableInTouchMode(true);
//从资源中得到一个Drawable对象
Drawable dr = context.getResources().getDrawable(R.drawable.beach);
//设置drawable对象的矩形范围,用于绘制的范围,矩形可大可小,但是一定是全幅图片。
dr.setBounds(0, 0, dr.getIntrinsicWidth()/2, dr.getIntrinsicHeight()/2);
/**
* 四个参数 fromXDelta, toXDelta, fromYDelta, toYDelta
* 起始X坐标,结束X坐标,起始Y坐标,结束Y坐标
*/
Animation an = new TranslateAnimation(0, 100, 0, 200);
an.setDuration(2000);//每次动画完成时间,在2000毫秒
an.setRepeatCount(4);//动画的重复次数(第一次不计算在内),如果小于0,则一直循环。
an.initialize(10, 10, 10, 10);//这个初始化,不理解?代码不能注释,否则动画失效
mDrawable = new AnimateDrawable(dr, an);//构建一个动画的drawAble对象
an.startNow();//启动动画特效
}
/**
* simpleView 显示,绘制
*/
@Override protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.WHITE);
mDrawable.draw(canvas);//调用drawAble对象的draw方法
invalidate();//实时更新,代码注释后,动画失效,只停留在初始化状态中,不停的调用onDraw
}
}
AnimateDrawable .java中的draw方法
/**
* 绘制drawAble
*/
@Override
public void draw(Canvas canvas) {
Drawable dr = getProxy(); //drawAble资源图片
if (dr != null) {
int sc = canvas.save();
//用来保存Canvas的状态,save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作。
Animation anim = mAnimation;
if (anim != null) {
anim.getTransformation(
AnimationUtils.currentAnimationTimeMillis(),
mTransformation);
//动画里最重要的方法是 getTransformation (currentTime, outTransformation),
//该方法根据当前间 (currentTime) 和 interpolator,计算当前的变换,在 outTransformation 中返回。
canvas.concat(mTransformation.getMatrix());//矩阵
}
dr.draw(canvas);//根据canvas 绘制drawAble
canvas.restoreToCount(sc);
//用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响。
//save和restore要配对使用(restore可以比save少,但不能多),如果restore调用次数比save多,会引发Error
}
}