Graphics

1Graphics类开发

Android中需要通过graphics来来显示2D图形。
Graphics中包括了:
Canvas(画布)、
Paint(画笔)、
Color(颜色)、
Bitmap(图像)、
2D几何图形等常用类。
Graphics具有绘制点、线、颜色、图像处理、2D几何图形等功能。
以下是其中几个类的详细介绍。

 

Paint

要绘图,首先得调整画笔,将画笔调整好之后,再将图像绘制到画布上。
Android中的画笔是Paint类,
Paint中包含了很多方法对其属性进行设置,主要方法如下:

setAntiAlias:设置画笔的锯齿效果

setColor:设置画笔的颜色

setARGB:设置画笔的arpg的值

setAlpha:设置Alpha

setTextSize:设置字体大小

setStyle:设置画笔的风格,空心或者实心

setStrokeWidth:设置空心的边框宽度

getColor:得到画笔的颜色

getAlpha:得到画笔Alpha的值

 

Color

Color类则更加简单,主要定义了一些颜色变量,以及对颜色的转换等。
同时还提供了Color.rgb方法将整型的颜色转换成Color类型,
Color.red方法可以提取出红色的值。

 

Canvas

画笔调整好之后,现在需要绘制到画布上,这就得用到Canvas类了。
Android中,既然把Canvas当做画布,那么就可以在画布上绘制我们想要的东西。除了在画布上绘制之外,还需要设置一些关于画布的属性,
比如,画布的颜色、尺寸等。
下面来分析AndroidCanvas有哪些功能。
首先,Canvas提供了如下一些方法:

 

Canvas():创建了一个空的画布,可以使用setBitmap()方法来设置绘制的具体画布。

CanvasBitmap bitmap):以bitmap对象创建一个画布,则将内容都绘制在bitmap上,因此bitmap不得为NULL

CanvasGL gl):在绘制3D效果时使用,与OpenGL相关。

drawColor:设置Canvas的背景颜色

setBitmap:设置具体画布

clipRect:设置显示区域,即设置裁剪区。

isOpaque:检测是否支持透明

rotate:旋转画布

setViewport:设置画布中显示窗口

skew:设置偏移量

 

在游戏开发中,我们有可能需要对某个精灵执行旋转、缩放和一些其他操作。我们可以通过旋转画布来实现,但是在旋转画布时会旋转画布上的所有对象,而我们只是需要旋转其中的一个,这时就需要用到sava方法来锁定需要操作的对象,在操作之后通过restore方法来解除锁定。

 

2D图形绘制】

在调整好画笔,设置好画布之后,就需要在画布上绘制内容了。
下面主要说明一下Android中可以绘制哪些基本的几何图形。

 

【字符串绘制 DrawText

Android中提供了一系列的drawText方法来绘制字符串,
在绘制字符串之前需要设置画笔对象,包括字符串的尺寸、颜色等属性。
使用FontMetrics来规划字体的属性,
可以通过getFontMetrics方法来获得系统字体的相关内容。

 

在处理字符串时候的常用方法有:

setTextSize:设置字符串的尺寸

setARGB:设置颜色(ARGB

getTextWidths:取得字符串的宽度

setFlagsPaint.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

((BitmapDrawablegetResources().getDrawable(资源索引).getBitmap()

然后使用drawBitmap方法将图片显示到屏幕上。
如下代码将一个名为BitmapBitmap对象显示在(xy)坐标上。

canvas.drawBitmapbitmapxynull);

Bitmap还提供了一些方法,
比如getHeight方法和getWidth方法可以获得这个图片的高度和宽度。

 

 

Matrix图像旋转】+ camera

Android中进行图像旋转需要使用Matrix
Matrix的操作,
总共分为translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)四种,
每一种变换在AndroidAPI里都提供了set, postpre三种操作方式,
除了translate,其他三种操作都可以指定中心点。

Matrix
没有结构体,它必须被初始化,通过reset方法或set方法来实现。
通过setRotate设置旋转角度,
createBitmap创建了一个经过旋转等处理的Bitmap对象,
然后将Bitmap绘制到屏幕上,于是就实现了旋转操作。

 

【图像缩放postScale

和旋转一样,不同的是缩放需要使用MatrixpostScale方法来设置图像缩放的倍数。

 

【针对像素的操作】

AndroidBitmap同样提供了操作像素的方法,
可以通过getPixels方法来获得该图像的像素并放到一个数组中,
我们处理这个像素数组就可以了,
最后通过setPixels设置这个像素数组到Bitmap中。

Android中,每一个图像像素通过一个4字节整数来实现:
最高位字节用作Alpha通道,255代表完全不透明,0代表完全透明;
接下来的一个字节是Red红色通道,255代表完全是红色。
依此类推,接下来的两个字节相应的实现绿色和蓝色的通道。

 

【渐变渲染Shader

Android中提供了Shader类专门用来渲染图像以及一些几何图形,
Shader下面包括几个直接子类,
分别是BitmapShaderComposeShaderLinearGradientRadialGradientSweepGradientBitmapShader主要用来渲染图像,
LinearGradient用来进行线性渲染,
RadialShader用来进行环形渲染,
SweepShader用来进行梯度渲染,
ComposeShader则是一个混合渲染,可以和其他几个子类组合起来使用。

 

如果需要将一张图片裁剪成椭圆或圆形等形状展示给用户,
这时需要使用BitmapShader类来裁剪,我们随时可以看到一些渐变的效果,
而在Android中可以使用LinearGradientSweepGradientRadialGradient很轻松的来完成。

Shader类的使用,都需要先构建Shader对象,
然后通过PaintsetShader方法来设置渲染对象,
然后在绘制时使用这个Paint对象即可,
当然,用不同的渲染时需要构建不同的对象。

 

SurfaceView双缓冲】

双缓冲技术是游戏开发中的一个重要技术。
主要原理:
当一个动画争先显示时,程序又在改变它,
前画面还没有显示完,程序又请求重新绘制,
这样屏幕就会不停地闪烁。
为了避免这种闪烁,可以使用双缓冲技术,
将要处理的图片都在内存中处理好之后,再将其显示到屏幕上。
这样显示出来的总是完整的图像,不会出现闪烁现象。

Android中的SurfaceView类其实就是一个双缓冲机制。
因此,开发游戏时可能会比较多地使用SurfaceView类来完成,
这样效率更高,而且SurfaceView类的功能也更加完善。

双缓冲的核心技术就是先通过setBitmap方法将要绘制的所有图形绘制到一个Bitmap上,
然后再来调用drawBitmap方法绘制出这个Bitmap,显示在屏幕上。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值