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

来源:互联网 发布:淘宝怎么修改退货金额 编辑:程序博客网 时间:2024/04/28 12:36
/* * 这个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;    }}
0 0
原创粉丝点击