2D图形开发(二) (高级).pdf

上传人:爱问知识人 文档编号:3329520 上传时间:2019-08-13 格式:PDF 页数:30 大小:2.25MB
返回 下载 相关 举报
2D图形开发(二) (高级).pdf_第1页
第1页 / 共30页
2D图形开发(二) (高级).pdf_第2页
第2页 / 共30页
2D图形开发(二) (高级).pdf_第3页
第3页 / 共30页
2D图形开发(二) (高级).pdf_第4页
第4页 / 共30页
2D图形开发(二) (高级).pdf_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《2D图形开发(二) (高级).pdf》由会员分享,可在线阅读,更多相关《2D图形开发(二) (高级).pdf(30页珍藏版)》请在三一文库上搜索。

1、2D2D图形开发(二)图形开发(二) Android平台手机应用开发技术培训 高级.第16讲 学习目标: 目标学员: 课程时长:45分钟 有JAVA语言基础的开发者或在校计 算机相关专业大学生 学习和了解Android的2D图形框架。 掌握基本Android绘画对象Drawable, 以及动画对象Animation的使用。 了解Matrix的基本使用方法。 课程简介课程简介 Drawable介绍 Animation介绍 Matrix介绍 课程目录课程目录 项目演练 课程简介 首先,本次课程将介绍Android提供一个定制的2D图形库,它可以用来表示 被绘画的物体,位于android.graph

2、ics.drawable包下面。 其次,还会介绍Android下2D动画的类库,它可以用来定义常见的几种动画 类型,例如位移,渐变,旋转等等。位于android.view.animation包下面。 最后,我们还会额外补充一些关于Matrix方面的内容。 课程简介 DrawableDrawable介绍介绍 Animation介绍 Matrix介绍 课程目录课程目录 项目演练 Drawable介绍 android.graphics.drawable这个包里包含一系列可用于绘画的对象。它们是 Android绘图最基础的部分。 这些对象不仅可用于简单的绘画,还可以被动画类用来展示成动画。或者与 其它

3、类组合,完成新的功能(例如游戏中的精灵)。 android.graphics.drawable包的核心,就是Drawable这个抽象类。它可以表 示任何可以被绘画的物体。 Drawable为各种类型的底层资源(图片,形状等)提供了通用的绘画相关的 API。并且,这些API只用于描述被绘画的元素,不包含任何事件以及与用户 交互方面的功能。 Drawable介绍 Drawable可以有多种不同的形式: Bitmap,位图,最简单的Drawable ,可以是一个PNG或JPEG 图像。 Nine Patch: 对PNG格式的扩展,可以指定如何伸长的图片格式。 Shape: 图形。包含简单的绘制命令,

4、与位图相比,绘制的图形可以轻 易的改变尺寸,而位图则不能轻易做到(缩放会影响质量,并且耗时)。 Layers,层。可以在上面绘制其它的Drawable 。 States,状态。可以从一组基于状态的Drawable中选择一个。 Levels,等级。可以从一组基于级别的Drawable中选择一个。 Scale,缩放。它的尺寸由当前的级别决定的。 Drawable介绍 Drawable为被绘制物件提供了大量的通用接口: setBounds(Rect),指定对象在哪里绘制,以及有多大的尺寸。此外可 以通过getIntrinsicHeight()和getIntrinsicWidth()方法获得对象的最佳

5、尺寸。 getPadding(Rect) ,返回对象内部的内容框架的信息。例如一个按钮控 件,它会返回其内部放置文本的空白区域的大小。 setState(int),告诉对象什么状态被绘制( focused , selected等)。 一般的对象都会根据状态显示不同的外观。 setLevel(int),提供一个连续的等级。并且可以基于当前的等级来改变 外观。例如进度条,音量控制。 Drawable.Callback,对象可以通过该接口回调来完成一个动画,所有 的Drawable对象都支持这个接口来使动画工作。 (以上是Drawable最重要的方法,其它内容请参考文档。) ShapeDrawabl

6、e介绍 ShapeDrawable继承自Drawable,可以绘画一些原始的形状。目前支持的形 状位于android.graphics.drawable.shapes目录并包含以下几种形状: ArcShape(弧形),OvalShape(椭圆),PathShape(轨迹), RectShape(矩形),RoundRectShape(圆角矩形) 如下代码在自定义视图中画了一个椭圆形: private class MyView extends View private ShapeDrawable shape = new ShapeDrawable(new OvalShape(); public M

7、yView(Context context) super(context); shape.getPaint().setColor(0xff74AC23); shape.setBounds(10, 10, 10 + 50, 10 + 50); protected void onDraw(Canvas canvas) super.onDraw(canvas); shape.draw(canvas); BitmapDrawable介绍 BitmapDrawable继承自Drawable,可以用于绘画图片。 如下代码在自定义视图中画出了资源中的icon图片: private class MyView

8、extends View private BitmapDrawable bitmap = new BitmapDrawable( BitmapFactory.decodeResource(getResources(), R.drawable.icon); public MyView(Context context) super(context); bitmap.setBounds(10, 10, 10 + 50, 10 + 50); protected void onDraw(Canvas canvas) super.onDraw(canvas); bitmap.draw(canvas); L

9、ayerDrawable介绍 LayerDrawable继承自Drawable,可以管理一组其他的Drawable,这些 Drawable被按照次序绘制(索引号最大的成员会被在顶部绘制)。 如下代码将两个Drawable放到了一个LayerDrawable中。这样LayerDrawable 中的元素就可以被认为是被捆绑到了一起。 使用时只要对LayerDrawable进行操作,就会影响到其内部的元素。我们可 以利用这种组合的方式,来共同处理一批Drawable。例如我们需要同时对一 些Drawable做同样的动画时,显然不应该分别对它们做动画。 ShapeDrawable item1 = ne

10、w ShapeDrawable(new OvalShape(); item1.getPaint().setColor(0xff74ACFF); BitmapDrawable item2 = new BitmapDrawable( BitmapFactory.decodeResource(getResources(), R.drawable.icon); LayerDrawable layer = new LayerDrawable(new Drawable item1, item2 ); layer.setBounds(x, y, x + width, y + height); Drawabl

11、e总结 到此,我们讲解了两个最基本的Drawable以及一个简单的组合型Drawable。 它们的使用方法都非常的简单。 也许有的同学会有疑问。Drawable所做的事情,用上一次课程介绍的Canvas 也一样能做到。而且,很可能在内存和速度方面都更有优势。那么我们为什 么还需要Drawable呢? 这是一种设计上的考虑,抽象出Drawable(可绘画的物体)的概念之后,不 仅有利于接口的规范和统一。在剥离掉与绘画无关的方法之后,Drawable对 象更容易与其它2D操作方法完成组合,完成新的功能。 最好的例子就是Drawable与动画框架的(下面将要介绍)组合。Drawable负 责绘画,A

12、nimation负责定义动画,两者各司其职又互不影响。可以不断的利 用类的组合技巧,派生出新的动画类。这些都是直接使用Canvas底层API难 以做到的。 课程简介 Drawable介绍 AnimationAnimation介绍介绍 Matrix介绍 课程目录课程目录 项目演练 Animation介绍 正如Drawable是对可绘画物体的抽象,Animation则可以理解为对动画本质的 抽象。动画相关类位于android.view.animation包下面。 目前Android支持下面几种动画的基本类型: 透明度动画(AlphaAnimation) 旋转动画(RotateAnimation)

13、缩放动画(ScaleAnimation) 位移动画(TranslateAnimation) 动画集合(AnimationSet) 除了使用这些基本动画类型以外,一般都会用它们组合出更复杂的动画来实 现绚丽的效果。 AlphaAnimation介绍 AlphaAnimation,可以实现透明度渐变(淡入淡出等效果)。 任何Animation类都具有动画持续时间(duration)的属性。 duration结合具 体动画的特性就可以完成一个具体动画的定义。例如AlphaAnimation,只需 要定义从某个alpha值到另一个目标alpha值,需要持续多长时间即可。 下面的代码将创建一个持续2秒,

14、从完全透明到不透明的透明渐变动画。 最后只需在视图(View)中定义动画,并且调用View的startAnimation方法, 就可以对该视图播放动画。但是需要注意, startAnimation方法不能在窗体显 示之前被调用(例如startAnimation方法被放到onCreate里)。 AlphaAnimation alpha = new AlphaAnimation(0.0f, 1.0f); alpha.setDuration(2000); AlphaAnimation介绍 Android还支持使用XML的方式将动画作为资源去定义。它们被放到res/xml 目录下。下面仍旧是创建一个2

15、秒的渐变动画: 同时,在代码中可以使用AnimationUtil工具类来帮助载入动画 AlphaAnimation alpha = (AlphaAnimation) AnimationUtils.loadAnimation(thisthis, R.anim.alpha) RotateAnimation介绍 RotateAnimation,可以实现旋转动画效果。它的使用与AlphaAnimation基本 一致。只是它变动的不是alpha值,而是角度值。 可以使用下面代码定义一个顺时针旋转一周的旋转动画 该动画将绕对象的原点(0,0)进行旋转。我们也可以使用下面的构造方法 定义一个绕(10,10)

16、点旋转的动画。 ( RotateAnimation其它的用法,跟之前的AlphaAnimation一致) RotateAnimation rotate = new RotateAnimation(0, 360); rotate.setDuration(2000); RotateAnimation rotate = new RotateAnimation(0, 360,10,10); rotate.setDuration(2000); AnimationSet介绍 AnimationSet,动画集合。它让我们可以组合多个动画的效果,制作更复杂 的动画。 AnimationSet自身也是一个Ani

17、mation,因此,一个动画集合也可以跟其它动 画或动画集合一起,组成一个新的更大的动画集合。 下面定义了一个透明渐变动画和一个旋转动画,并且放到了一个动画集合中。 AlphaAnimation alpha = new AlphaAnimation(0.0f, 1.0f); alpha.setDuration(2000); RotateAnimation rotate = new RotateAnimation(0, 360); rotate.setDuration(3000); AnimationSet set = new AnimationSet(true); set.addAnimati

18、on(alpha); set.addAnimation(rotate); startAnimation(set); 课程简介 Drawable介绍 Animation介绍 MatrixMatrix介绍介绍 课程目录课程目录 项目演练 Matrix 首先要注意,Android中有两个Matrix对象。一个是在OpenGL中使用的 android.opengl.Matrix,另一个才是我们需要讲解的android.graphics.Matrix 。 android.graphics.Matrix是一个3 3的矩阵,可用于描述如何对坐标系进行变 换(简单的说就是可以利用矩阵定义旋转,位移,扭曲,翻转

19、等等操作)。 下面先来举两个矩阵操作的例子: 左图是缩放矩阵,变换后宽度w变为scale * w,高度h变为scale*y 右图是旋转矩阵,绕原点逆时针旋转度角的变换公式是 x = xcos ysin 与 y = xsin + ycos Matrix Matrix提供了以下的方法,来帮助开发者完成矩阵的变换。 setTranslate(float dx, float dy) 平移。dx和dy代表xy方向上的距离。 setScale(float sx, float sy, float px, float py) 放大。sx和sy代表sy方向上的缩放分量,px和py代表坐标轴的 原点。 setSk

20、ew(float kx, float ky, float px, float py) 斜切。kx和ky代表斜率, px和py代表坐标轴的原点。 setRotate(float degrees, float px, float py) 旋转。 Degrees代表角度, px和py代表坐标轴的原点。 此外,对应的还有postTranslate等以post为前缀的方法,以及preTranslate等 以pre为前缀的方法,post代表矩阵左乘操作,pre代表右乘。当我们需要同 时应用多种变换的时候,需要用到Matrix的这些方法。 Matrix 使用时只需创建Matrix对象即可。下面就利用Matr

21、ix完成了一个位移操作,然 后可以将Matrix对象作为Canvas绘图的参数使用。 也可以直接将该Matrix应用到Canvas上 由于对Matrix的设置效果可以叠加,所以如果要重复使用一个Matrix时,别忘 了在必要的时候reset,以免以前的设置影响后面的设置。 Matrix mMatrix = new Matrix(); mMatrix.setTranslate(100, 290); canvas.drawBitmap(img, mMatrix, mPaint); canvas.setMatrix(mMatrix); mMatrix.reset(); 课程简介 Drawable介绍

22、 Animation介绍 Matrix介绍 课程目录课程目录 项目演练项目演练 项目演练 本次演练,将完成Drawable,Animation,以及Matrix的基本的练习。 我们继续延续上次课程的Android2D项目,为其补充三个演示类: TestDrawableActivity,TestAnimationActivity,TestMatrixActivity。并且在 主界面Android2DActivity中为它们添加对应的菜单项。 首先,我们在TestDrawableActivity中完成Drawable的演练。 如下是关键代码: ShapeDrawable item1 = new S

23、hapeDrawable(new OvalShape(); item1.getPaint().setColor(0xff74ACFF); BitmapDrawable item2 = new BitmapDrawable(BitmapFactory .decodeResource(getResources(), R.drawable.icon); layer = new LayerDrawable(new Drawable item1, item2 ); layer.setBounds(x, y, x + width, y + height); 项目演练 现在来完成动画的演练TestAnima

24、tionActivity。这里使用了 AnimationDrawable,它是一个Drawable,可以用来逐帧播放动画。 第一步,将动画图片放到res/drawable目录,然后在res/anim中创建如下动画 文件(这是一个图片的序列)。 . 项目演练 第二步在TestAnimationActivity中定义一个视图,然后创建刚才定义的 AnimationDrawable 。 注意, AnimationDrawable的start方法不能在容器视图未显示的时候被调用。 所以要小心启动动画方法的摆放位置。 AnimationDrawable animDrawable = (Animation

25、Drawable) getResources().getDrawable(R.anim.run); animDrawable.start(); 项目演练 第三步在TestAnimationActivity中使用Animation的子类分别实现几种不同的 动画效果。并且在点击屏幕时播放该这些动画。 第三步在TestAnimationActivity中使用Animation的子类分别实现几种不同的 动画效果。并且在点击屏幕时播放该这些动画。 AlphaAnimation alpha = new AlphaAnimation(0.0f, 1.0f); alpha.setDuration(2000);

26、 RotateAnimation rotate = new RotateAnimation(0, 360); rotate.setDuration(3000); AnimationSet set = new AnimationSet(true); set.addAnimation(alpha); set.addAnimation(rotate); startAnimation(set); 项目演练 到此,我们完成了关于Drawable, Animation,以及Matrix等内容的演练。 这些内容都比较丰富,远远不是几个 课时就能熟练的掌握。尤其是Drawable, 甚至可以看成是Android的UI制作中的 基本类型。 Matrix的内容也很丰富。它的功能远不止 我们演示的那么多。但因为其技术门槛 较高,无法在这么简短的时间内做讲解。 希望有兴趣的同学能够自行查阅和学习 相关文档。 总结 Drawable的使用 Animation的使用 Camera及Matrix的使用 本课程到此结束,谢谢!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/环境 > 装饰装潢


经营许可证编号:宁ICP备18001539号-1