第一卷Android基础图形图像编程1基础概念和数据结构1.1颜色表示1.1.1RGB表示法RGB颜色表示法是一种基于三基色原理的色彩表示方法。所谓三基色原理是指绝大部分颜色都可以用R(红),G(绿),B(蓝)三种基本颜色按照一定的比例混合得到。目前的绝大部分电子设备都是采用RBG来表示颜色的。因此,Android系统中也是用RGB来表示颜色。根据每一中颜色表示的数据长度不同,Android中常用的RGB像素格式主要有:ARGB8888:用4个字节表示一种颜色。其中最高8位表示和背景色的混合系数。剩下三个字节分别表示一种颜色。所以一共可以表示:256x256x256种颜色。RGB888:用三个自己表示一种颜色。和ARGB的区别仅在于没有透明系数。RGB565:用两个自己表示一种颜色。一共可以表示32x64x32种颜色。在后文可以看到,当我们加载图像时,就需要指定图像的像素格式。1.1.2HSI表示法HSI色彩空间是一种比较符合人的视觉系统的感知彩色的方式,以色调、饱和度和强度三种基本特征量来感知颜色。色调H(Hue):表示不同的颜色,如红色、绿色、蓝色等。它也可表示一定范围的颜色,如暖色、冷色等。饱和度S(Saturation):表示颜色的纯度。饱和度越大,颜色看起来就会越鲜艳,反之亦然。强度I(Intensity):对应成像亮度和图像灰度,是颜色的明亮程度。HSI表示方法在数字图像处理软件中应用比较广泛。1.1.3YUV表示法YUV是一种广泛应用于电视,广播,视频领域的颜色表示方法。其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。在Android的多媒体模块中,视频解码器的输出格式就是YUV。1.2像素像素是数字图像的最基本单位,一个像素对应着一个点。通常我们说一个手机的分辨率是1024x768,就是说在长轴方向有1024个像素,而在短轴方向上有768个像素。一个像素表示一个颜色值,在Android中主要使用RGB表示法。1.1.1节中描述了android中最常用的几种像素表示格式。Andorid系统为了便于开发者实现在不同设备上一致性较好的应用程序,定义了一些相关的基本概念并建议开发者在开发过程中使用,现简述如下:pixel:像素,是一个逻辑单位。一个像素可以认为就是一个点。dp/dip:物理长度单位。一个dp等于160分之一英寸。而一英寸等于2.54厘米。就是说1dp=0.00625inch=0.015875cm。dpi:像素密度,是英文dotperinch的缩写,翻译过来就是一英寸多少个点。显然,越精细的屏幕,dpi就越高,显示效果就越好。dp和pixel的换算关系为:px=dp*(dpi/160).dp=(px*160)/dpi.ppi:像素密度,是英文pixelperinch的缩写,翻译过来就是一英寸多少像素。和dpi是一个含义。ppi常用于显示领域。屏幕尺寸:指屏幕的大小,通常说一个手机是4.3寸的,就是指屏幕尺寸为4.3英寸。注意,这个4.3指的是手机屏幕对角线的长度。家里的电视说多少寸的,和这个是一个原理,也是对角线的长度。分辨率:我们说一个手机的分辨率是854x480,首先是以像素作为单位的。也就是说这个手机的长边能显示854个点,短边能显示480个点。但是这个854x480的手机到底是几寸的,还要看屏幕显示密度,也就是dpi/ppi。分辨率和显示密度共同决定了手机的屏幕尺寸。1.3位图计算机上表示图像的方法主要有两种:位图(又称点阵图,光栅图)和矢量图。矢量图指用一系列的线段和曲线描述的图像。常见的矢量图格式有AdobeIllustrator的*.AI、*.EPS和SVG、AutoCAD的*.dwg和dxf、CorelDRAW的*.cdr、windows标准图元文件*.wmf和增强型图元文件*.emf等等。矢量图的优点是缩放无质量损失,存储空间小,便于转换成位图等优点。位图是用大量的点阵来描述图像。每个点表示一种颜色,称为一个像素。常见的位图格式有:*.bmp、*.pcx、*.gif、*.jpg、*.tif、*.pcd、*.psd、*.cpt。Android系统中目前主要使用位图进行各种显示。1.4画布(Canvas)顾名思义,画布就是作画的地方。Android中的3D图形引擎是通过OpenGLES实现的。而2D图形引擎就是通过Canvas封装的一系列的接口实现的。画布实现的基本功能有:基本图形的绘制,如:直线,曲线,点等等,位图的显示,画布剪裁,画布的几何变换,用来实现移动,缩放,旋转等功能。要在Android系统中使用画布作画,需要具备四个基本要素:(1)一个位图,用来最终保存在画布上绘制的内容。(2)一张画布,用来进行绘制操作。(3)基本绘制元素,就是想要往画布上绘制的内容。(4)画笔,用来定义绘制图形的颜色,线型等基本内容。画布对应了android.graphics包中的Canvas类。1.5Drawabledrawable是android系统中被定义为仅用于显示的视觉元素。通常用于控件的背景图片或者作为图标。通常在XML文件中定义。drawabled对应了android.graphics中的Drawable类。Drawable有很多子类分别实现不同的显示功能,后文会详细描述。2.基本形状的绘制本章主要描述两个基本问题:(1)如何使用画布绘制。(2)如何绘制基本的直线和曲线。2.1在画布上绘图通常使用画布有两种情况,一种是通过继承android的view自定义自己的控件。这种情况下Canvas已经创建好,用户只需要在上边绘制即可,而绘制的结果会直接显示出来。还有一种情况是用户需要创建自己的画布,绘制并保存,通常会将绘制的结果保存为位图。下面分别讨论这两种情况。2.1.1绘图基础首先通过一个例子展示最基本的绘图接口的使用。示例一种自定义了一个View并在其区域中显示了数条直线:示例代码如下:packagecom.example.androidgraphicsprogramm;importandroid.app.Activity;importandroid.content.Context;importandroid.graphics.Canvas;importandroid.graphics.Color;importandroid.graphics.Paint;importandroid.os.Bundle;importandroid.view.View;publicclassCanvasBasicextendsActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(newSampleView(this));}privatestaticclassSampleViewextendsView{privatePaintmPaint;publicSampleView(Contextcontext){super(context);setFocusable(true);mPaint=newPaint();}@OverrideprotectedvoidonDraw(Canvascanvas){canvas.drawColor(Color.WHITE);drawLine_1(canvas);}//protectedvoiddrawLine_1(Canvascanvas){intxstart=20;intystart=100;intlinelen=400;//mPaint.setAntiAlias(true);//设置反锯齿mPaint.setStrokeWidth(6);//线宽6个像素mPaint.setColor(0xffff0000);//线的颜色为红色mPaint.setTextSize(50);mPaint.setStyle(Paint.Style.STROKE);canvas.drawText(线宽为6,红色,字号50,xstart,ystart,mPaint);ystart+=20;canvas.drawLine(xstart,ystart,linelen+xstart,ystart,mPaint);ystart+=20;RectFr=newRectF();r.left=xstart;r.top=ystart+10;r.right=r.left+linelen/2;r.bottom=r.top+linelen/2;canvas.drawRect(r,mPaint);////////////////////////////////////////////////////////////////////////////mPaint.setStrokeWidth(10);//线宽10个像素mPaint.setColor(0xff00ff00);//线的颜色为绿色mPaint.setTextSize(40);mPaint.setStyle(Paint.Style.FILL);ystart+=(50+linelen/2);canvas.drawText(线宽为10,绿色,字号40,xstart,ystart,mPaint);ystart+=20;canvas.drawLine(xstart,ystart,linelen+xstart,ystart,mPaint);ystart+=20;r.left=xstart;r.top=ystart+10;r.right=r.left+linelen/2;r.bottom=r.top+linelen/2;canvas.drawRect(r,mPaint);/////////////////////////////////////////////////////////////////////////////mPaint.setStrokeWidth(10);//线宽10个像素mPaint.setARGB(100,0,255,0);//线的颜色为绿色mPaint.setTextSize(40);mPaint.setStyle(Paint.Style.FILL_AND_STROKE);ystart+=(50+linelen/2);canvas.drawText(线宽为10,绿色,半透明,xstart,ystart,mPaint);ystart+=20;canvas.drawLine(xstart,ystart,linelen+xstart,ystart,mPaint);ystart+=20;r.left=xstart;r.top=ystart+10;r.right=r.left+linelen/2;r.bottom=r.top+linelen/2;canvas.drawRect(r,mPaint);}}}运行效果如图2-1所示。下面对其中涉及到的类和函数进行详细说明,文本显示相关接口会在后面章节单独描述,这里不做说明:2.1.1.1Paint类1.setStrokeWidth(floatwidth)。设置边框的线宽。参数为宽度值,以像素为单位。对比效果图可以看出,线宽就是图中的直线或者矩形边框的宽度,以像素为单位。红色直线和矩形的宽度为6像素。而第二三条绿色直线的宽度为10像素。从图中也可以明显看出绿色直线比红色直线宽。2.setColor(intcolor)。设置绘画对象的颜色。图中线条和矩形都颜色都由此函数指定。参数颜色的格式为(16进制):0x(Alpha)ff(R)ff(G)ff(B)ff。参数可以用如下几种方式获得:(1)Color类提供的颜色常量。Android通过android.graphics.Color提供了一个Color应用类,定义