这个例子的示例代码有ProxyDrawable.java,AnimateDrawable.java和AnimateDrawables.java。

Android 包android.graphics.drawable 中定义了一个Drawable 为所有Drawable的抽象基类。表示一个“可以绘制在屏幕的对象”。通常的情况下是从资源文件中读取各种不同类型的Drawable。和View不同的是Drawable不能接受处理事件不能和用户交互。Android自定义的Drawable有下列几种类型:

  • Bitmap: 代表PNG或是JPEG图像。
  • Nine Patch: PNG图像的一种扩展用法,多用来定义按钮边框,可以缩放。
  • Shape: 简单的矢量几何图形。
  • Layers: drawable 的集合组件,可以由多层Drawable叠加组合而成。
  • States: drawable 的集合组件,可以从多个Drawable选择其一(一种状态)。
  • Levels: drawable的集合组件, 可以根据Drawable的Level属性选择其一。
  • Scale: drawable的集合组件, 使用一个Drawable但可以根据当前Level缩放Drawable。

此外也可以自定义Drawable,本例自定义了ProxyDrawable ,处理添加了一些检测基本上是和它代理的Drawable提供同样的功能。AnimateDrawable 是真正使用的自定义Drawable,它使用了Animation类来提供动画效果。

Android动画分为两种类型,一种称为“tweened”动画,主要是通过坐标变换:平移,旋转,缩放,色彩变化来显示动画效果,另外一种为“帧动画”由一幅一幅的图像连续显示而成。“tweened”动画由android.view.animation包中定义类来完成,而“帧动画”主要由AnimationDrawable 实现。

下面看看AnimateDrawable的void draw(Canvas canvas)实现

@Overridepublic 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); }}

canvas.save()和canvas.restoreToCount(sc);是用来保存和回复Canvas的状态(Maxtrix等属性),因为我们需要修改Canvas的Matrix属性,canvas.concat方法都会和当前Canvas的Matrix进行矩阵运算,如果我么不保存之前的Matrix属性,每次都会很上次矩阵运算的结果相乘,对应本例来说,每次平移的距离会越来越大。

注:对于AnimateDrawable来说,Animation可以是任意类型:平移,缩放,旋转等。AnimateDrawables 中使用的是平移TranslateAnimation。

Animation an = new TranslateAnimation(0, 100, 0, 200);an.setDuration(2000);an.setRepeatCount(-1);an.initialize(10, 10, 10, 10);

平移变换动画,定义了X,Y方向变化的范围X[0,100] ,Y[0,200],持续时间2秒。setRepeatCount为-1表示无限次。an.initialize(10, 10, 10, 10)对于TranslateAnimation来说无多大实际意义,只要void initialize(int width, int height, int parentWidth, int parentHeight) 中width,height不为0即可。

AnimateDrawables 的onDraw 方法:

@Override protected void onDraw(Canvas canvas) { canvas.drawColor(Color.WHITE);  mDrawable.draw(canvas); invalidate();}

onDraw里面又调用了invalidate方法,又会触发onDraw,这样动画就会一直运行下去。

AnimateDrawables_第1张图片" width="650" title="20110520002" class="aligncenter size-full wp-image-1374" style="border:1px solid black;">



更多相关文章

  1. Android的动画简单学习
  2. Android(安卓)图片缩放引起的OOM异常全篇
  3. Android(安卓)动画之补间动画(View Animation)
  4. Android使用glide加载gif动画设置播放次数
  5. 移动端页面的特点
  6. Android(安卓)属性动画ValueAnimator与插值器详解
  7. Android(安卓)动画效果(一)
  8. Android(安卓)popupwindow在指定控件正下方滑动弹出效果
  9. Android面试题(数据存储、view篇)

随机推荐

  1. Android4.0 设置系统默认输入法
  2. android 透明对话框
  3. Android的第一个程序运行
  4. linux下android开发环境的配置
  5. android camera 布局分析
  6. Lottie-移动动画效果框架
  7. Android(安卓)源码编译make的错误处理
  8. android中webview开启了硬件加速后会出现
  9. android上传图片到服务器,求服务器那边和a
  10. android实用代码