2D图形接口实际上是Android图形系统的基础, GUI上的各种可见元素也是基于2D图形接口构建的。因此,Android GUI方面的内容分为两层,下层是图形的API,上层是各种控件,各种控件实际上是基于图形API绘制出来的。
使用2D图形接口的结构及其与控件的关系如图4-1所示。
图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,其中主要类的内容包含以下一些内容。
Point、Rect 和Color等:一些基础类,分别定义点、矩阵、颜色的基础信息;
Bitmap:表示内存中的位图,可以从图像文件中和内存中建立,也可以控制其中的每一个像素;
Canvas:画布,图形系统的核心类,用于提供各种绘制的方法;
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当中的渲染器。渲染器是真正实现绘制功能的地方。
图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中,共有四种基本的可绘制内容。
第三种:可伸缩图位图,使用Nine-Patch文件(*.9.png)表示;
表示颜色的可绘制内容可以在一个资源目录中的一个XML文件中定义(通常是res/value/color.xml文件),如下所示:
后三种可绘制内容一般可以由目录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类作为参数。