本章要点
Android的图形处理基础
Bitmap与BitmapFractory
继承View在Android中绘图
掌握Canvas、Paint、Path等绘图API
双缓冲机制
使用Matrix对图像进行几何变换
通过drawBitmapMesh方法扭曲图像
使用不同的Shader类渲染图形
逐帧动画
补间动画
属性动画
开发自定义补间动画
SurfaceView的绘图机制
继承SurfaceView开发动画
正如前面所介绍的,决定Android应用是否被用户接受的重要方面就是用户界面,为了提供友好的用户界面,就需要在应用中使用图片了。Android系统提供了丰富的图片功能支持,包括处理静态图片和动画等。
Android系统提供了ImageView显示普通的静态图片,也提供了AnimationDrawable来开发逐增动画,还可以通过Animation对普通图片使用补间动画。图形、图像处理不仅对Android系统的应用非常重要,而且Android对系统上益智游戏、2D游戏都需要大量的图像、图形处理。所谓游戏,本质就是提供更逼真的、能模拟某种环境的用户界面,并根据某种规则来响应用户操作,为了提供更逼真的用户界面,需要借助于图形、图像处理。
学习本章内容之后,读者应该能熟练掌握Android系统的图像、图像的处理,这样就可有在Android平台上开发出俄罗斯方块、五子棋等小游戏了。本章将会通过弹珠游戏、飞行棋游戏雏形来帮助读者掌握Android2D游戏开发的入门知识。
7.1 使用简单图片
前面说的Android应用已经大量的使用了简单图片,图片不仅仅可以使用ImageView来显示,也可以作为Button、Window的背景。从广义的调度来看,Android应用中的图片不仅包括*.png、*.jpg、*.gif等各种格式的位图,也包括使用XML资源文件定义的各种Drawable对象。
7.1.1 使用Drawable对象
为Android应用增加了Drawable资源之后,Android SDK会为这份资源在R清单文件中创建一个索引项:R.drawable.life_name。
接下来既可在XML资源文件中通过@drawable/file_name访问该Drawable对象,也可在Java代码中通过R.drawable.file_name访问该Drawable对象(int id)方法来实现。
由于前面已经介绍了大量关于Drawable的示例,故此不再给出示例。
7.1.2 Bitmap和BitmapFactory
Bitmap代表一个位图,BitmapDrawable里封装的图片就是一个Bitmap对象。开发者为了把一个Bitmap对象包装成BitmapDrawable对象,可以调用BitmapDrawable对象,可以调用BitmapDrawable的构造器:
如果需要获取BitmapDrawable所包装的Bitmap对象,则可调用BitmapDrawable的getBitmap()方法,如下面的代码所示:
除此之外,Bitmap还提供了一些静态方法来创建新的Bitmap对象,例如常用的方法。
(裁剪)
---createBitmap(Bitmap source,int x,int y,int with,int height):例如如下常用方法,坐标点(给定x、y)开始,从中“挖取”宽with、高height的一块出来,创建新的bitmap对象。
(缩放)
---craeteScaledBitmap(Bitmap src,int dsWith,int dsHeight,boolean fiter):对原位图src进行缩放,缩放成宽dstWight,高dstHeight的新位图。
(创建一个宽with、高height)的新位图
(从源位图sourse的指定坐标点(给定x,y)开始,从中“挖取”宽with、高height的一块出来。创建新的Bitmap对象。并按Matrix指定的规则进行变换)
BitmapFactroy是一个工具类,它提供了大量的方法,这些方法可用于从不同的数据源来解析、创建Bitmap对象。BitmapFactory包含了如下方法。
1 :从指定字节数组数组的offest位置开始,将长度为length的字节数据解析成Bitmap对象。
2 : 从pathName指定的文件中解析、创建Bitmap对象
3 : 用于从FileDescriptor对应的文件中解析、创建Bitmap对象。
4 : 用于根据给定的资源文件ID从指定资源中解析、创建Bitmap对象。
5 : 用于从指定输入流中解析、创建Bitmap对象。
大部分时候,我们只要把图片放在/res/drawable/目录下,就可以在程序中通过该图片对应的资源ID来获取封装该图片的Drawable对象。但由于手机系统的内存较小,如果系统不停的去解析、创建Bitmap对象,可能由于前面创建Bitmap所占的内存还没有回收,而导致程序运行时引发OutOfMemory错误。
Android为Bitmap提供了两个方案来判断是否已回收,以及强制Bitmap回收自己。
1 、boolean isRecycled():返回该Bitmap对象是否被回收。
2、 void recycle():强制一个Bitmap对象立即回收自己。
除此之外,如果Android应用需要访问其他存储路径(比如SD卡)里的图片,那么都需要借助于BitmapFactory来解析、创建Bitmap对象。
下面来开发一个查看/assets/目录下图片的查看器(如果你还不知道assets是什么?http://blog.csdn.net/qq629290/article/details/60126533)。该程序十分简单,只包含一个ImageView和按钮,当用户单击该按钮是程序会自动去搜索/assets/目录下的下一张图片。
此处不再给出界面布局文件,该程序代码如下:
7.2 绘图
除了使用已有的图片之外,Android应用还常常需要在运行时动态地生成图片,比如一个手机游戏,游戏界面看上去丰富多彩,而且可以随着用户动作改变,这就需要借助于Android的绘图支持了。
7.2.1 Android绘图基础:Canvas、Paint等
用过Swing编程经验的读者都知道,在Swing中绘图的思路是需要开发一个自定义类,该自定义类继承JPanel,并重写JPanel的Paint(Graphics g)方法即可。Android的绘图与此类推,Android的绘图应该继承View组件,并重写它的onDraw(Canvas canvas)方法即可。
重写onDraw(Canvas canvas)方法时涉及一个绘图API:Canvas,Canvas代表“依附”于指定View的画布,他提供了如表7.1所示的方法来绘制各种图形。
/