分类: Java
2009-08-01 13:47:45
北京理工大学 20981 陈罡
android平台本身提供了非常强大和灵活的应用程序框架,将Activity与Intent结合起来使用几乎可以做到“无所不能”的地步。具体的使用方法在很多书籍以及android sdk本身提供的ApiDemos里面都有描述,偶在此就不再啰嗦了。
在本文中,偶介绍一种方法可以为希望使用自己编写的框架的朋友提供一个原始的框架,以此抛砖引玉。对于希望使用常规的android ui组件和框架的朋友,这篇文章可能就不太合适了。。。
本框架的主要目的是扩展性比较强,可以很容易扩展和维护,另外可以允许框架的使用者在不了解其内部工作原理的情况下简单地通过直接使用框架的代码和接口进行开发。本文中使用到的技术只是一个简单的实验,基本实现了显示页面的封装和按键、触摸屏的消息传递以及基本的屏幕贴图操作。只使用一个Activity来实现多个页面切换,以及独立处理用户事件的目的。
这个框架分为三个主要的类以及一个类厂,分别为:GraphActivity,GraphView,UiBase,类厂为UiFactory。
下面简单说说这些类的功能:
(1)GraphActivity
本类主要用于实现全屏幕操作的(实现了set_no_title, set_full_screen等基本操作),同时重载了onPause(),onResume()进行程序换入换出的时候现场清理方面的工作。在此类中,包含了GraphView(它是整个框架类的核心类)的对象,本类可以对GraphView对象进行外部管理以及创建和销毁。
(2)GraphView
本类是整个框架的核心类,它是由SurfaceView类派生出来,同时实现了SurfaceHolder类的 Callback接口(这个接口主要用于获得当前surface的状态,包括创建、变化、销毁)。这里的SurfaceHolder类是可以通过lockCanvas()函数获取可以直接高速绘图的Canvas对象,呵呵,有了Canvas对象以后剩下的事情就。。。很爽了。使用完毕以后,需要用 unlockCanvasAndPost()将当前的Canvas对象释放掉。GraphView类还可以收到按键事件,触摸屏事件以及轨迹球事件,通过UiBase类提供的方法将这些事件传递给UiBase的派生类去处理,由此实现了事件的处理(也就是所谓的多态性,利用父类的接口去调用子类的函数)。同时,将GraphView的对象通过IGraphEngine接口类传递到UiBase类的派生类中去,让其派生类可以“透明”地调用GraphView提供的函数(clear,draw,jump等,尤其是这个jump,调用了以后会通过创建其它子类的对象跳转到其它子类的页面中去)。
(3)UiBase
本类是整个Ui框架类的基类,是一个“抽象类”(abstract修饰),其定义了基本的事件处理函数实现(其实都是空的,等待派生类去重载)。在GraphView中,通过UiFactory类厂创建 UiBase的派生类,然后会利用UiBase定义的接口,将GraphView的对象收到按键、触摸屏、轨迹球的事件传递给UiBase的派生类,从而实现消息的向下传递,在派生类中可以直接使用 GraphView的对象进行操作(关于这一点,偶在犹豫是否应该在UiBase中做一个接口函数,让其派生类通过这个接口函数调用GraphView对象的功能。这样做会比较“规范”和安全,因为这样不会把GraphView对象直接暴露给UiBase的派生类;但从另外一个角度来看,这种“匪夷所思”的多加一层调用,增加了调用的路径,降低了调用的效率,毕竟人家GraphView也是个独立的对象嘛。。。hoho,不知道java里面有没有类似inline的东西了。。。知道的朋友烦请告知)
(4)UiFactory
本类是个类厂,简单地说,就是用于创建不同的UiBase派生类的对象的类,例如:UiPageA ,UiPageB,UiPageC都是UiBase的派生类,以后还可以继续定义UiPageD, UiPageE, UiPageF不断定义下去,每个派生类只要把想绘制的图片准备好,然后调用m_eng.draw()函数就可以完成往当前屏幕上绘制的目的了。非常方面实用。
下图是整个架构的类图,希望有不同见解的朋友不吝斧正:
|
下面是整个工程的源代码:
|