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
- Android Api Demos登顶之路(六十六)Graphics-->Animation Drawable
- Android Api Demos登顶之路(六十五)Graphics-->AlphaBitmap
- Android Api Demos登顶之路(六十七)Graphics-->Arcs
- Android Api Demos登顶之路(六十八)Graphics-->DecodeBitmap
- Android Api Demos登顶之路(七十一)Graphics-->Cliping
- Android Api Demos登顶之路(七十三)Graphics-->Compass
- Android Api Demos登顶之路(七十四)Graphics-->CreateBitmap
- Android Api Demos登顶之路(七十五)Graphics-->GradientDrawable
- Android Api Demos登顶之路(七十六)Graphics-->ShapeDrawable
- Android Api Demos登顶之路(七十七)Graphics-->FingerPaint
- Android Api Demos登顶之路(七十八)Graphics-->MeansureText
- Android Api Demos登顶之路(七十九)Graphics-->PathEffects
- Android Api Demos登顶之路(八十)Graphics-->PathFillTypes
- Android Api Demos登顶之路(八十一)Graphics-->Patterns
- Android Api Demos登顶之路(八十二)Graphics-->Picture
- Android Api Demos登顶之路(八十三)Graphics-->Point
- Android Api Demos登顶之路(八十四)Graphics-->PolyToPoly
- Android Api Demos登顶之路(八十五)Graphics-->PurgeableBitmap
- 设计模式-行为型之命令模式
- OpenCV3中的SURF特征点的寻找和匹配
- Next Permutation
- UNRECOGNIZED SELECTOR SENT TO INSTANCE 问题快速定位的方法
- python学习——itertools模块
- Android Api Demos登顶之路(六十六)Graphics-->Animation Drawable
- QT window 和linux下的双编译
- ADS解决xxxis an undefined model
- qt中添加C语言源码若干问题
- 【硬件测试】华为2016校招·硬件技术工程师机考试题
- eclipse 开发环境下,提示 String cannot be resolved to a type
- MySQL之——主从server-id不生效,The server is not configured as slave
- 小猫统计——根据Excel文件或者文本文件自动建表
- Java、Spring 国际化