这个例子的示例代码有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)实现
@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);
}
}
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,这样动画就会一直运行下去。
分享到:
相关推荐
NULL 博文链接:https://kakukemeit.iteye.com/blog/1806388
android apidemos代码的示例解析,讲的挺全的
最新版ApiDemos Android SDK 中带有很多例子,其中ApiDemo 详细介绍了Android 平台主要API,分成了 · App · Content · Graphics · Media · OS · Text · Views 几个大类,每个大类又分为几个小类,...
Android ApiDemos apk, 包括Android presentation双屏异显 demon, App>Activity>Presentation
最新Android apidemos
API Demos 是 Google 为了 Android 开发者所提供的一个 Android API 合集,其中包含了很多的 API 范例,同时遵循了良好的代码规范,是一个值得开发者研究和学习的典型。android的ApiDemos,需要解压缩后使用。
android APIdemos,android 源码简单使用demos
Oracle Solaris 9 -man pages section 6: Demos-18
该Api Demos 源码是基于Android6.0 ,Eclipse下的,可以直接使用Android studio 导入工程即可。
Oracle Solaris 9 man pages section 6: Demos-18
Oracle Solaris 8 man pages section 6: Demos-38
Android 系统原生应用API示例程序集合,是初学Android 开发的重要参考资料 https://github.com/longtaoge
AndroidDemosStudio AndroidDemos ------- Android Studio
Android官网ApiDemos源码 供大家学习参考之用
api-ai-ios-sdk_demos api-ai-ios-sdk_demos的演示应用语音或文本>目的/操作> Json “为应用程序,设备和网络构建智能语音界面” 基于 获取示例以构建遇到问题因此将其提取到独立项目中在创建帐户,然后使用设置示例...
全文检索jar包资源:资源中包括从网上找到并下载的jar包资源,包括四个jar包:Lucene-core-2.0.0、Lucene-core-2.3.0、Lucene-demos-2.3.0、je-analysis-1.5.3。
github上有个开源工程repo:princeton-vl/RAFT,其中一部分模型文件存在google drive中,国内同学不好获取,因此将模型文件上传到csdn中。
API-Demos-api-16-android4.1:android api api
Android ApiDemos2.1版本,sdk自带的sample。
android示例源码 有需要的可下载看一下吧