您的位置:首页 > 移动开发 > Android开发

Android Api Demos登顶之路(六十六)Graphics-->Animation Drawable

2015-09-13 11:04 393 查看
/*
* 这个Demo演示了如何实现具有动画效果的Drawable
*/
public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new SampleView(this));
}

private class SampleView extends View{
private AnimationDrawable mDrawable;

public SampleView(Context context) {
super(context);
setFocusable(true);
setFocusableInTouchMode(true);

//获取Drawable对象并设置边界
Drawable dr=getResources().getDrawable(R.drawable.ic_launcher);
dr.setBounds(0, 0, dr.getIntrinsicWidth(), dr.getIntrinsicHeight());

//定义动画
Animation an=new TranslateAnimation(0, 100, 0, 200);
//设置动画持续时间
an.setDuration(2000);
//设置动画为无限循环
an.setRepeatCount(-1);
//初始化动画组件及其父容器的宽高
an.initialize(10, 10, 10, 10);

mDrawable=new AnimationDrawable(dr, an);
}

@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.WHITE);
//调用drawable的draw方法实现动画效果
mDrawable.draw(canvas);
//调用初始化方法,这样会再次调用mDrawable.draw(canvas),并更新UI;动画就会一直运行
invalidate();
}
}
}


AnimationDrawable

/*
* 定义一个动画Drawable。drawable表示一个“可以绘制在屏幕的对象”.
* 该类的核心就在于draw方法中,在该中通过完成对drawable和animation矩阵的运算,来实现动画效果。
*/
public class AnimationDrawable extends ProxyDrawable {
private Animation mAnimation;
private Transformation mTransformation = new Transformation();

public AnimationDrawable(Drawable target) {
super(target);
}

public AnimationDrawable(Drawable target, Animation animation) {
super(target);
this.mAnimation = animation;
}

public Animation getmAnimation() {
return mAnimation;
}

public void setmAnimation(Animation mAnimation) {
this.mAnimation = mAnimation;
}

public boolean hasStarted() {
return mAnimation != null && mAnimation.hasStarted();
}

public boolean hasEnded() {
return mAnimation != null && mAnimation.hasEnded();
}

@Override
public void draw(Canvas canvas) {
Drawable dr = getProxy();
if (dr != null) {
// 保存画布的状态信息
int sc = canvas.save();
Animation anim = mAnimation;
if (anim != null) {
//获取到动画运行的当前时间的动画信息
anim.getTransformation(
AnimationUtils.currentAnimationTimeMillis(),
mTransformation);
//将当前的矩阵与指定的矩阵进行运算
canvas.concat(mTransformation.getMatrix());
}
//循环调用身身,直到动画时间结束
dr.draw(canvas);
//恢复画布的状态信息
canvas.restoreToCount(sc);
}
}
}


ProxyDrawable

/*
* 定义一个代理Drawable只是简单地实现Drawable的一些方法
* 目的地当我们自定义一个Drawable的时候可以继承这个代理Drawable,就可以只去重写我们所关心的方法
* 而不必去实现所有的Drawable方法,简化了操作,也简洁了代码。
*/
public class ProxyDrawable extends Drawable {
private Drawable mProxy;
private boolean mMutated;

public ProxyDrawable(Drawable target) {
super();
this.mProxy = target;
}

public Drawable getProxy() {
return mProxy;
}

public void setProxy(Drawable mProxy) {
this.mProxy = mProxy;
}

@Override
public void draw(Canvas canvas) {
if (mProxy != null) {
mProxy.draw(canvas);
}
}

@Override
public int getIntrinsicWidth() {
return mProxy != null ? mProxy.getIntrinsicWidth() : -1;
}

@Override
public int getIntrinsicHeight() {
return mProxy != null ? mProxy.getIntrinsicHeight() : -1;
}

/*
* 设置drawable的透明度
*/
@Override
public void setAlpha(int alpha) {
if (mProxy != null) {
mProxy.setAlpha(alpha);
}
}

@Override
public void setColorFilter(ColorFilter cf) {
if (mProxy != null) {
mProxy.setColorFilter(cf);
}
}

//获取drawable的透明度
@Override
public int getOpacity() {
return mProxy!=null ? mProxy.getOpacity():PixelFormat.TRANSLUCENT;
}

@Override
public void setFilterBitmap(boolean filter) {
if (mProxy != null) {
mProxy.setFilterBitmap(filter);
}
}

@Override
public void setDither(boolean dither) {
if (mProxy != null) {
mProxy.setDither(dither);
}
}

/*
* 从同一个资源中载入的所有的Drawable实例在默认的情况下都会共用一个state,改变一个实例的state其它所有的实例也会变化,
* 当我们需要改变某个实例的state而不改变其它实例的state时使用此方法。
*/
@Override
public Drawable mutate() {
//判断一下如果实例不为空且还没有发生变化,并且从父类中返回的是本实例,则调用该实例的该方法
if (mProxy != null && !mMutated && super.mutate()==this) {
mProxy.mutate();
mMutated=true;
}
return this;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: