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; } }
相关文章推荐
- android sdk环境安装
- 异步任务
- Android NDK and OpenCV Development With Android Studio
- Android事件处理机制轻量级源码分析
- Android中sqlite的应用
- 解决android studio adb not responding 的问题
- Android读写assets、raw、sdard和工程文件的方法
- Android 最热的高速发展框架XUtils
- android:src
- 处理运行时状态的改变
- android 有效载荷大图,避OOM
- android SQLite学习手册
- 还在用XListView?试试更漂亮的AutoLoadListView吧!
- 收集的Android开源框架及其地址
- Android 屏幕适配dp,sp
- Android(java)学习笔记238:多媒体之图片画画板案例
- Android中获取内外存储卡位置的方法
- android 编译环境 libgl1-mesa-glx:i386相关安装后ubuntu启动失败
- Android开发框架xUtils简介(附有不使用findViewById的方法)
- Android中146种颜色对应的xml色值