170 likes | 342 Views
第六章 图形与图像处理. 倚动软件工厂实验室. 结构导图. 简单图片与逐帧动画. Android 系统提供了 ImageView 用于显示静态图片,也提供了 AnimationDrawable 来开发逐帧动画,还可以使用 Animation 对普通图片使用补间动画。 逐帧动画很适合于表演细腻的动画。例如:人物走路、说话,动物的奔跑、跳跃以及精致的 3D 效果等等。下面以一个综合的示例来示范简单图片和逐帧动画,程序运行效果如下图所示。 【 示例代码: codes6Bitmap_AnimationTest】. 简单图片. 逐帧动画. 简单图片与逐帧动画.
E N D
第六章图形与图像处理 倚动软件工厂实验室
简单图片与逐帧动画 • Android系统提供了ImageView用于显示静态图片,也提供了AnimationDrawable来开发逐帧动画,还可以使用Animation对普通图片使用补间动画。 • 逐帧动画很适合于表演细腻的动画。例如:人物走路、说话,动物的奔跑、跳跃以及精致的3D效果等等。下面以一个综合的示例来示范简单图片和逐帧动画,程序运行效果如下图所示。【示例代码:codes\06\Bitmap_AnimationTest】 简单图片 逐帧动画
简单图片与逐帧动画 简单图片:前一个ImageView用于显示整个图片,鼠标在图片上点击后,会在后一个ImageView中显示该图片的局部细节。 逐帧动画:点击动画开始后,马就开始奔跑;点击动画停止,马就停止在该时刻的动作;再次点击开始,马又从第一幅图片开始奔跑。
简单图片与逐帧动画 简单图片 (1) Drawable对象 • 在Android中操作图片是通过Drawable类来完成的,Drawable类有很多子类,如BitmapDrawable类用于操作位图,ColorDrawable类用于操作颜色,ShapeDrawable类用于操作形状。Android不允许图片资源的文件名中出现大写字母,且不能以数字开头。 • 需要指出的是,R.drawable.draw1只是一个int类型的常量,代表该Drawable对象的ID,如果在Java程序中需要获得实际的Drawable对象,则可以调用Activity从android.content.ContextWrapper继承的getResources () 方法再调用Resources的getDrawable(int ID)方法来获取。
简单图片与逐帧动画 (2)Bitmap和BitmapFactory Bitmap用于表示一张位图,BitmapDrawable用于封装一个Bitmap对象。 如果想将Bitmap对象包装成BitmapDrawable对象,可以调用BitmapDrawable的构造方法。 BitmapDrawable bd=new BitmapDrawable (Bitmap bitmap) ; Bitmap bitmap=bd.getBitmap ( ) ; 如果需要获取BitmapDrawable包装的Bitmap对象,可以调用BitmapDrawable的getBitmap ( ) 方法。
简单图片与逐帧动画 Bitmap提供了一些常用方法。
简单图片与逐帧动画 注意:由于手机系统的内存较小,如果系统不停地解析创建Bitmap对象,可能会出现之前创建的Bitmap对象占用的内存尚未回收而导致程序运行时引发OutofMemory错误,这时候就需要用到recycle ()来强制回收。
简单图片与逐帧动画 BitmapFactory是一个工具类,该类所有的方法都是静态方法,这些方法可以从不同的数据源来解析、创建Bitmap对象,如资源ID、路径、文件和数据流等方式。BitmapFactory主要包含了以下方法。BitmapFactory类常用方法如下:
简单图片与逐帧动画 逐帧动画 • 创建逐帧动画的一般方法是:先在程序中存放逐帧动画的素材,再在res文件夹下创建一个anim文件夹,再在该文件夹下创建一个XML文档,在<animation-list…/>元素中添加<item…/>元素来定义动画的全部帧。 <?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot=["true"|"false"]> <item android:drawable="…" android:duration="…"/> </animation-list> • oneshot用于定义动画是否循环播放,为true则不循环,为false则循环播放。 • <item…/>元素中需要指定图片资源(drawable)和该图片的持续时间(duration)。 • 注意:Android也支持在代码中创建逐帧动画,调用AnimationDrawable的addFrame (Drawable frame, int duration) 方法即可,类似于使用XML方法创建时的<item…/>。
自定义绘图 除了可以使用程序中的图片资源外,Android应用还可以自行绘制图形,也可以在运行时动态地生成图片,比如游戏中人物的移动等。下面以一个自定义绘图的程序来进行示范,程序运行效果如图所示。 【示例代码:codes\06\CanvasTest】
自定义绘图 Canvas和Paint 在Swing编程中,绘图的一般思路是:自定义一个类,并让该类继承JPanel,然后重写JPanel的paint (Graphics g) 方法即可。 Android的绘图与此类似,自定义一个类,并让该类继承View,然后重写View的onDraw (Canvas canvas) 方法即可。 在Android应用中,Canvas和Paint是两个绘图的基本类,使用这两个类就几乎可以完成所有的绘制工作。 Canvas:画布,2D图形系统最核心的一个类,用于处理onDraw () 方法。 Canvas类主要实现了屏幕的绘制过程,其中包含了很多实用的方法,比如绘制一条路径、区域、贴图、画点、画线、渲染文本,Canvas常用方法包括以下几种: drawBitmap (Bitmap bitmap, float left, float top, Paint paint) :绘制位图 drawCircle (float cx, float cy, float radius, Paint paint) :绘制圆形
自定义绘图 Paint:画笔,用于设置绘制的样式、颜色等信息。Paint类常用方法有: setAlpha (int a) :设置透明度 setColor (int color) :设置颜色 drawRect (float left, float top, float right, float bottom, Paint paint) :绘制矩形 drawRoundRect(RectF rect, float rx, float ry, Paint paint) :绘制圆角矩形 drawText (String text, float x, float y, Paint paint) :绘制字符串 drawPoint (float x, float y, Paint paint) :绘制一个点 注意:画笔样式(Style)有三种STROKE、FILL和FILL_AND_STROKE,STROKE为空心,FILL为实心。
自定义绘图 Shader Android中提供了Shader类专门用来渲染图像以及一些几何图形,Shader本身是一个抽象类,它包括以下几个子类,分别是BitmapShader、ComposeShader、LinearGradient、RadialGradient和SweepGradient。 BitmapShader主要用来渲染图像,LinearGradient 用来进行线性渲染,RadialGradient 用来进行环形渲染,SweepGradient 用来进行梯度渲染,ComposeShader则是一个混合渲染,可以和其它几个子类组合起来使用。 Shader类的使用,都需要先创建一个Shader对象(通过子类的构造方法),然后通过Paint的setShader (Shader shader) 方法设置渲染对象,然后再绘制时使用这个Paint对象即可。
自定义绘图 Path和PathEffect Path用于规划路径,主要用于绘制复杂的几何图形。对于Android游戏开发或者说2D绘图中来讲Path 路径可以用强大这个词来形容。在Photoshop中我们可能还记得使用钢笔工具绘制路径的方法。 Path类常用方法如下:
自定义绘图 PathEffect是用来为路径添加效果,可以应用到任何Paint中从而影响线条绘制的方式,也可以改变一个形状的边角的外观并且控制轮廓的外表。Android包含了多种PathEffect,包括以下六个子类: CornerPathEffect :使用圆角来代替尖角,从而对图形尖锐的边角进行平滑处理 。 DashPathEffect :创建一个虚线的轮廓(短横线/小圆点) DiscretePathEffect:与DashPathEffect相似,但是添加了随机性,需要指定每一段的长度和与原始路径的偏离度。 PathDashPathEffect :定义一个新的路径,并将其用作原始路径的轮廓标记。 SumPathEffect:添加两种效果,将两种效果结合起来。 ComposePathEffect :在路径上先使用第一种效果,再在此基础上应用第二种效果。 注意:DashPathEffect只对Paint的Style设为STROKE 或STROKE_AND_FILL时有效。