美文网首页
第七章 图形与图像处理

第七章 图形与图像处理

作者: AndYMJ | 来源:发表于2017-11-08 21:58 被阅读0次

    本章要点

    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所示的方法来绘制各种图形。

    /

    相关文章

      网友评论

          本文标题:第七章 图形与图像处理

          本文链接:https://www.haomeiwen.com/subject/qqiemxtx.html