基于Symbian的手机图书阅读器开发

(整期优先)网络出版时间:2008-09-19
/ 2

基于Symbian的手机图书阅读器开发

王志强

摘要:根据市场需求,为方便用户阅读电子书,使用了VisualC++开发了基于SymbianOS的手机图书阅览器。重点阐述了Series60GUI所基于的框架结构和应用程序设计的关键元素,用于显示数据的用户界面组件应用程序等关键技术,实现了电子图书在手机上的阅读,极大地拓展了电子图书的应用范围和使用空间。

关键词:Symbian;电子图书;GUI;资源文件

引言:作为智能手机,用户期望其有尽可能多、尽可能实用的功能。因为智能手机存贮量大,携带方便,随时随地都可以使用,有相当一部分用户希望使用手机来阅读一些文字资料的意愿,这部分用户中又有绝大部分有使用手机来阅读小说的需求。

Symbian的优势在于它得到了占据市场份额大多数的手持通讯设备厂商的支持,在NOKIA的大力倡导下,已经成为一个开放的、易用的、专业的开发平台。可以预料,以后的几年中,将会有越来越多的智能手机用户使用的是基于SymbianOS的手机终端。就运行SymbianOS的设备本身而言,其总存储量是有限的,因此,要求手机端阅读器软件尽可能的稳定,占用系统资源尽可能的少。另外由于手机软件可视界面大小的限制、手机键盘的设计等问题,还要求手机端阅读器软件做到尽可能的人性化和舒适化。所以,开发一个能满足以上需求的,基于SymbianOS的手机端阅读器软件是很有必要的。

1系统设计

1.1系统功能设计。根据设计需要和功能可以将程序分为三大模块,分别为:开始菜单显示模块、文本读取显示模块和关于信息显示模块。几大模块是相对独立的,只有退出前一模块才能调用当前模块。其中开始菜单显示模块又分为图形添加模块和应用程序控制模块,文本读取模块分为文本处理模块和应用程序控制模块,关于信息显示模块分为文本添加模块和应用程序控制模块。

1.2系统工作流程。程序刚初始时会在手机屏幕上显示一个列表,列表项分别是“阅读”“关于”和“退出”。点击“阅读”,系统将从资源文件中读取字符串到内存,然后将其在屏幕上显示出来,阅读完毕后按取消键将会退出程序。按“关于”键将会显示阅读器相关信息,按退出则直接退出。

2模块设计

2.1文本处理模块设计。文本处理模块,实际上是一个多格式的文本编辑器,因为要作为文本阅览器使用,所以编辑器首先应该是只读的,并且应该隐藏光标。

多格式的文本编辑器在RTXTED资源结构中定义,如下所示:

RESOURCERTXTEDr_richtexteditor_rich_text_editor

{width=KWidth;

height=KHeight;

textlimit=KMaxLength;

flags=EEikEdwinReadOnly|EEikEdwinAvkonDisableCursor;

avkon_flags=EAknEditorFlagEnableScrollBars;

}

RTXTED结构的最小规范由编辑器的宽度和高度(以象素为单位)以及编辑器可以容纳的最大字符个数组成。

此外,程序中还指定了flags和avkon_flags的值。因为程序是为了显示文本而设计的,不接受用户的输入,所以需设置flags的值使编辑器为只读EeikEdwinReadOnly,且隐藏光标不显示EeikEdwinAvkonDisableCursor,把avkon_flags的值设为EaknEditorFlagEnableScrollBars,启用滚动,这样当编辑器的文本长度超出其物理尺寸时,会出现滚动条。

在程序中,还自定义了一个CeikRichTextEditor的类,这个派生控件提供了帮助浏览器需要的行为,并且提供了用于文本格式化的简化接口。该类的成员函数重写了按键事件,用于实现每次滚动一页。

2.2文本添加模块设计。显示关于信息的文本添加模块实质上还是图象添加,之所以这样说是因为在SymbianOS中,要在屏幕上显示文字,仍然要用到窗口服务器、字体位图服务器,使用DrawText()的方法把文本绘制到屏幕上。

但如果希望把文本绘制到固定位置,同样需要了解诸多方面的问题,比如字符的度量属性以及它们各自的作用和相互关系等。

要使文本精确的绘制到屏幕矩形的中心,需要通过计算,使文本依附的水平线等于矩形高度的一半加上字体高度的一半,然后将文本依附的水平线的值传递给DrawText()函数。使用DrawText()绘制文本,同样可以设置文字字体和效果。

2.3应用程序控制模块设计。应用程序控制实际上就是按键事件和重绘事件的处理。用户在与用户界面交互时,将事件发送给拥有此事件的窗口的应用程序,按键事件在用户按下、按住或者释放某个键时产生,重绘事件在控件或者控件的一部分重新显示在屏幕上以及需要重绘自身时产生。

2.3.1按键事件。窗口服务器通过控制栈把按键事件传递到应用程序。控制栈是一种结构。负责维护与按键事件应按何种顺序传递到应用程序的相关信息。通过调用控件的OfferKeyEventL()方法把按键事件通知该控件,OfferKeyEventL()是在CcoeControl中定义的虚函数,在本程序中重写了这个函数以处理文本编辑器翻页动作:

TKeyResponseCRichTextEditorRichTextEditor::OfferKeyEventL(constTKeyEvent&aKeyEvent,TEventCodeaType)

{if(aType==EEventKey)

{if(aKeyEvent.iCode==EKeyDownArrow)

{MoveCursorL(TCursorPosition::EFPageDown,EFalse);

returnEKeyWasConsumed;

}

elseif(aKeyEvent.iCode==EKeyUpArrow)

{MoveCursorL(TCursorPosition::EFPageUp,EFalse);

returnEKeyWasConsumed;}

else{returnCEikRichTextEditor::OfferKeyEventL(aKeyEvent,aType);}}

returnEKeyWasNotConsumed;

}

2.3.2重绘事件。重绘事件通知控件需要在屏幕上更新自己,在以下时刻生成:首次显示控件时,部分或者全部控件早被其他窗口覆盖之后再次显示时,应用程序的数据发生更改而需要重新刷新视图时。在程序中,界面的初次显示、功能界面的互相调用、文本编辑器的翻页均要发起重绘动作。系统发起的重绘将导致对所有与无效区域相交的控件的Draw()方法的调用,这种情况下只需实现控件的Draw()方法即可使控件正确重绘自己。程序中界面的初次显示即为系统发起的重绘。应用程序发起的重绘需要通过调用控件中的DrawNow()执行,

绘制需要向窗口服务器发出一条指令,DrawNow()会强制清空命令缓存,使指令请求会立即执行。在显式重绘控件时,必须调用DrawNow(),而不是Draw()方法。DrawNow()可以确保把控件绘制自身的需求通知窗口服务器,从而把在Draw()中执行的绘制反映到屏幕上,直接调用Draw()无法完成这些任务。阅读文本时候的翻页、几个界面间的切换均使用了DrawNow()。

结束语:根据移动用户需求,基于Symbian,对移动图书阅读器进行了设计,该系统已经完成测试,即将投入运行。该系统能够为移动用户提供方便、快捷、灵活的图书阅读服务,用户可随时随地阅读自己喜爱的电子图书。该系统是传统阅读方式的扩充和弥补,移动的方式比传统方式更方便、更具吸引力,能够极大提高读者的主动性,极大激发读者的兴趣。

参考文献

[1]RichardHarrison,周良忠译.SymbianOSC++手机应用开发[M].北京:人民邮电出版社,2004:14-355.

[2]LeighEdwards,周良忠译.Series60应用程序开发[M].北京:人民邮电出版社,2005:2-422.

[3]Nokia.DesigningCPPApplicationsforSeries60.Nokia[EB/OL].www.forum.nokia.com,2003.

[4]冯兆麟.Symbian手机游戏开发随想[M].北京:人民邮电出版社,2005:1-20.

作者简介:王志强(1974~),男,汉族,硕士研究生,助教,河南科技大学电子信息工程学院计算机系,研究方向:移动嵌入式应用。