使用2D图形接口的程序结构

2631阅读 0评论2012-03-03 十七岁的回忆
分类:嵌入式

4.1.1  使用2D图形接口的程序结构

2D图形接口实际上是Android图形系统的基础, GUI上的各种可见元素也是基于2D图形接口构建的。因此,Android GUI方面的内容分为两层,下层是图形的API,上层是各种控件,各种控件实际上是基于图形API绘制出来的。

使用2D图形接口的结构及其与控件的关系如图4-1所示。

wps_clip_image-18456

图4-1  2D图形接口的结构及其与控件的关系

Android控件和图形接口的基本程序结构有以下三点。

(1)在一般的Android的应用程序中,直接使用控件,主要也就是android.view包View类的诸多继承者;

(2)如果需要直接使用Android的2D图形接口,需要继承View类,并实现其中的onDraw()函数来实现绘制的工作,绘制的工作主要由android.graphics包来实现;

(3)实际上Android各种控件的外观,也是基于android.graphics包来绘制的。

android.graphics包中的内容是Android系统的2D图形API,其中主要类的内容包含以下一些内容。

wps_clip_image-14177 Point、Rect 和Color等:一些基础类,分别定义点、矩阵、颜色的基础信息;

wps_clip_image-31707 Bitmap:表示内存中的位图,可以从图像文件中和内存中建立,也可以控制其中的每一个像素;

wps_clip_image-23005 Canvas:画布,图形系统的核心类,用于提供各种绘制的方法;

wps_clip_image-22074 Paint:画笔,用于控制绘制时的颜色、线条、文本和样式等信息;

在使用2D的图形API方面,步骤通常如下所示:

(1)继承android.view.View类。

(2)实现View的OnDraw()函数,在其中使用Canvas的方法进行绘制。

使用2D的图形API的场合,自定义实现的View类型作为下层的绘制和上层的GUI系统中间层。

使用Android的2D API的程序结构和实现一个自定义控件的核心内容类似,都需要继承View类,但是它们的不同主要体现在以下方面:

(1)在目的上,使用2D API主要是为了实现自由的绘制;自定义控件的目的是在应用程序中使用这些控件;

(2)自定义控件包括可以在布局文件中使用甚至使用其属性,如果只是需要使用2D图形接口实现绘制的功能,不需要处理在布局的XML文件中使用以及自定义属性的问题;

(3)除了继承android.view.View,根据需要,自定义的控件也可以通过继承View的各个继承者(Widget)类来完成。

è 4.2.1  使用OpenGL图形接口的程序结构

在Android中,可以直接支持3D图形的绘制,主要使用OpenGL标准包javax.microedition.khronos中的各个类,并且需要结合Android GUI系统使用。Android中的android.opengl包提供Android系统和OpenGL标准结合的功能。

Android中OpenGL接口典型的使用方法是从Android 1.5(API级别为3)引入的,在使用3D的图形API方面,主要的步骤通常如下所示:

(1)扩展android.opengl.GLSurfaceView类(可选)。

(2)实现android.opengl.GLSurfaceView中的Renderer(渲染器)接口。

(3)将所实现的GLSurfaceView.Renderer接口设置成GLSurfaceView中的渲染器。

android.opengl.GLSurfaceView扩展了android.view包中的SurfaceView,SurfaceView又继承了android.view.View,因此GLSurfaceView本身可以作为Android中的一个控件来使用,它可以负责事件处理方面。

Android中OpenGL绘图接口使用的结构如图4-9所示。

GLSurfaceView.Renderer是一个接口,主要需要实现其中的onDrawFrame(GL10 gl)                       函数,并在其中实现OpenGL绘制内容。

在实现3D绘制的时候,需要具有一个类GLSurfaceView并重新实现其中的Renderer,并且设置Renderer为GLSurfaceView当中的渲染器。渲染器是真正实现绘制功能的地方。

wps_clip_image-5092

图4-9  Android中OpenGL绘图接口结构

è 4.3.1  可绘制内容的概念

android.graphics.drawable包是Android中一个绘制相关的包。其中主要的类为Drawable抽象类,Drawable的draw()方法用于将其绘制到Canvas上:

public abstract void draw(Canvas canvas)

如果需要直接得到一个Drawable,可以使用以下几个静态方法:

public static Drawable createFromPath(String pathName) 

public static Drawable createFromStream(InputStream is, String srcName)

public static Drawable createFromXml(Resources r, XmlPullParser parser)

public static Drawable createFromXmlInner(Resources r,

XmlPullParser parser, AttributeSet attrs)

Android中,共有四种基本的可绘制内容。

wps_clip_image-8401 第一种:表示颜色可绘制内容;

wps_clip_image-19898 第二种:各种类型的图片文件;

wps_clip_image-7070 第三种:可伸缩图位图,使用Nine-Patch文件(*.9.png)表示;

wps_clip_image-1285 第四种:表示形状的可绘制内容。

表示颜色的可绘制内容可以在一个资源目录中的一个XML文件中定义(通常是res/value/color.xml文件),如下所示:

#ffff0000

#ff00ff00

#ff0000ff

后三种可绘制内容一般可以由目录res/drawable中一个文件表示,包括图片、9-Patch文件、XML文件。res/drawable目录中的XML文件还可以描述更为复杂的可绘制内容。

在代码中使用R.drawable.*表示资源的id,调用Context的getResources()方法返回Resources类,Resource.getDrawable(id)获取Drawable。

在Android的应用程序中,某些时候并不需要考虑Drawable这个抽象类的实例是什么,而是可以采用“抽象获取,抽象使用”的方式。也就是在程序中得到可绘制内容后,直接使用其句柄。

例如,android.widget.ImageView类中使用与可绘制内容相关的内容如下所示:

public Drawable getDrawable()

public void setImageDrawable(Drawable drawable)

在程序中,可以在ImageView类中的getDrawable() 返回Drawable类型,在另外的可以设置Drawable的场景中直接设置这个Drawable;也可通过Drawable类的静态方法得到一个Drawable的实例,直接在程序中使用。

此外,android.view.Window类设置背景的功能的方法如下所示:

public void setBackgroundDrawable(Drawable drawable)

setBackgroundDrawable()方法同样使用Drawable类作为参数。

上一篇:Android中的控件
下一篇:用户通知方法:Toast、Status Bar、Dialog