1:Graphics类开发
在Android中需要通过graphics来来显示2D图形。
Graphics中包括了:
Canvas(画布)、
Paint(画笔)、
Color(颜色)、
Bitmap(图像)、
2D几何图形等常用类。
Graphics具有绘制点、线、颜色、图像处理、2D几何图形等功能。
以下是其中几个类的详细介绍。
【Paint】
要绘图,首先得调整画笔,将画笔调整好之后,再将图像绘制到画布上。
Android中的画笔是Paint类,
Paint中包含了很多方法对其属性进行设置,主要方法如下:
setAntiAlias:设置画笔的锯齿效果
setColor:设置画笔的颜色
setARGB:设置画笔的a,r,p,g的值
setAlpha:设置Alpha值
setTextSize:设置字体大小
setStyle:设置画笔的风格,空心或者实心
setStrokeWidth:设置空心的边框宽度
getColor:得到画笔的颜色
getAlpha:得到画笔Alpha的值
【Color】
Color类则更加简单,主要定义了一些颜色变量,以及对颜色的转换等。
同时还提供了Color.rgb方法将整型的颜色转换成Color类型,
如Color.red方法可以提取出红色的值。
【Canvas】
画笔调整好之后,现在需要绘制到画布上,这就得用到Canvas类了。
在Android中,既然把Canvas当做画布,那么就可以在画布上绘制我们想要的东西。除了在画布上绘制之外,还需要设置一些关于画布的属性,
比如,画布的颜色、尺寸等。
下面来分析Android中Canvas有哪些功能。
首先,Canvas提供了如下一些方法:
Canvas():创建了一个空的画布,可以使用setBitmap()方法来设置绘制的具体画布。
Canvas(Bitmap bitmap):以bitmap对象创建一个画布,则将内容都绘制在bitmap上,因此bitmap不得为NULL。
Canvas(GL gl):在绘制3D效果时使用,与OpenGL相关。
drawColor:设置Canvas的背景颜色
setBitmap:设置具体画布
clipRect:设置显示区域,即设置裁剪区。
isOpaque:检测是否支持透明
rotate:旋转画布
setViewport:设置画布中显示窗口
skew:设置偏移量
在游戏开发中,我们有可能需要对某个精灵执行旋转、缩放和一些其他操作。我们可以通过旋转画布来实现,但是在旋转画布时会旋转画布上的所有对象,而我们只是需要旋转其中的一个,这时就需要用到sava方法来锁定需要操作的对象,在操作之后通过restore方法来解除锁定。
【2D图形绘制】
在调整好画笔,设置好画布之后,就需要在画布上绘制内容了。
下面主要说明一下Android中可以绘制哪些基本的几何图形。
【字符串绘制 DrawText】
Android中提供了一系列的drawText方法来绘制字符串,
在绘制字符串之前需要设置画笔对象,包括字符串的尺寸、颜色等属性。
使用FontMetrics来规划字体的属性,
可以通过getFontMetrics方法来获得系统字体的相关内容。
在处理字符串时候的常用方法有:
setTextSize:设置字符串的尺寸
setARGB:设置颜色(ARGB)
getTextWidths:取得字符串的宽度
setFlags(Paint.ANTI_ALIAS_FLAG):消除锯齿
当然要取得字符串的宽度还可以使用measureText方法,
得到字符串宽度,可以使用如下代码:
FontMetrics fm=m_paint.getFontmetrics();
M_iFontHeight = (int)Math.ceil(fm.descent-fm.top)+2;
【Bitmap图像绘制】
在Android中,项目目录下的“res\drawable”用来放置该项目的一些图片资源,
那么如何来显示这些资源呢?
Android中提供了Bitmap来存放这些资源,
如下代码可以提供一个资源索引获得其图像对象Bitmap。
((BitmapDrawable)getResources().getDrawable(资源索引)).getBitmap()
然后使用drawBitmap方法将图片显示到屏幕上。
如下代码将一个名为Bitmap的Bitmap对象显示在(x,y)坐标上。
canvas.drawBitmap(bitmap,x,y,null);
Bitmap还提供了一些方法,
比如getHeight方法和getWidth方法可以获得这个图片的高度和宽度。
【Matrix图像旋转】+ camera
在Android中进行图像旋转需要使用Matrix,
Matrix的操作,
总共分为translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)四种,
每一种变换在Android的API里都提供了set, post和pre三种操作方式,
除了translate,其他三种操作都可以指定中心点。
Matrix没有结构体,它必须被初始化,通过reset方法或set方法来实现。
通过setRotate设置旋转角度,
用createBitmap创建了一个经过旋转等处理的Bitmap对象,
然后将Bitmap绘制到屏幕上,于是就实现了旋转操作。
【图像缩放postScale】
和旋转一样,不同的是缩放需要使用Matrix的postScale方法来设置图像缩放的倍数。
【针对像素的操作】
Android中Bitmap同样提供了操作像素的方法,
可以通过getPixels方法来获得该图像的像素并放到一个数组中,
我们处理这个像素数组就可以了,
最后通过setPixels设置这个像素数组到Bitmap中。
在Android中,每一个图像像素通过一个4字节整数来实现:
最高位字节用作Alpha通道,255代表完全不透明,0代表完全透明;
接下来的一个字节是Red红色通道,255代表完全是红色。
依此类推,接下来的两个字节相应的实现绿色和蓝色的通道。
【渐变渲染Shader】
Android中提供了Shader类专门用来渲染图像以及一些几何图形,
Shader下面包括几个直接子类,
分别是BitmapShader、ComposeShader、LinearGradient、RadialGradient、SweepGradient。BitmapShader主要用来渲染图像,
LinearGradient用来进行线性渲染,
RadialShader用来进行环形渲染,
SweepShader用来进行梯度渲染,
ComposeShader则是一个混合渲染,可以和其他几个子类组合起来使用。
如果需要将一张图片裁剪成椭圆或圆形等形状展示给用户,
这时需要使用BitmapShader类来裁剪,我们随时可以看到一些渐变的效果,
而在Android中可以使用LinearGradient、SweepGradient、RadialGradient很轻松的来完成。
Shader类的使用,都需要先构建Shader对象,
然后通过Paint的setShader方法来设置渲染对象,
然后在绘制时使用这个Paint对象即可,
当然,用不同的渲染时需要构建不同的对象。
【SurfaceView双缓冲】
双缓冲技术是游戏开发中的一个重要技术。
主要原理:
当一个动画争先显示时,程序又在改变它,
前画面还没有显示完,程序又请求重新绘制,
这样屏幕就会不停地闪烁。
为了避免这种闪烁,可以使用双缓冲技术,
将要处理的图片都在内存中处理好之后,再将其显示到屏幕上。
这样显示出来的总是完整的图像,不会出现闪烁现象。
Android中的SurfaceView类其实就是一个双缓冲机制。
因此,开发游戏时可能会比较多地使用SurfaceView类来完成,
这样效率更高,而且SurfaceView类的功能也更加完善。
双缓冲的核心技术就是先通过setBitmap方法将要绘制的所有图形绘制到一个Bitmap上,
然后再来调用drawBitmap方法绘制出这个Bitmap,显示在屏幕上。