毕业论文 (9)

文本复制检测报告单

打印 保存

№:ADBD2013R_2013041914444620130419233838401328453195 检测文献 基于android 平台的电子阅读器 作 者

检测范围

中国学术期刊网络出版总库

中国博士学位论文全文数据库/中国优秀硕士学位论文全文数据库 中国重要会议论文全文数据库 中国重要报纸全文数据库 中国专利全文数据库 大学生论文联合比对库 互联网资源

英文数据库(涵盖期刊、博硕、会议的英文数据以及德国Springer 、英国Taylor&Francis 期刊数据库等) 港澳台学术文献库 优先出版文献库

时间范围 1900-01-01 至 2013-04-19 检测时间

2013-04-19 23:38:38

总文字复制比:9.3%

( 表格 )

( 观点 )

去除引用:9.3%

去除本人:9.3%

重合字数:2614

文献总字数:28059

总段落数: [ 2 ] 疑似段落数: [ 2 ] 疑似段落最大重合字数: [ 2231 ]

前部重合字数: [ 383 ]

后部重合字数: [ 2231 ]

疑似段落最小重合字数: [ 383 ]

2.9% 基于android 平台的电子阅读器_第1部分(总13047字) 14.9%

基于android 平台的电子阅读器_第2部分(总15012字)

( 注释: 无问题部分

文字复制比部

引用部分 ) 基于android 平台的电子阅读器_第1部分 总文字复制比:2.9%(383) 总字数:13047

1 ·基于WebGIS 热带农业农药施用环境与安全信息系统 宋世鑫(导师:张秀虹) - 《青岛理工大学硕士论文》- 2010-06-01 1.1% 是否引用:否

2 ·BX080214-周俊磊-论文

周俊磊 - 《大学生论文联合比对库》- 2012

1.0% 是否引用:否 3 ·小型管理信息系统开发规范研究

曾晓红;谢树云; - 《现代计算机(专业版)》- 2010-01-25

0.8% 是否引用:否 4 ·

雅安职业技术学院学生综合素质测评系统的设计与实现 0.8%

吉林大学珠海学院

毕业论文(设计)

基于android平台的电子阅读器

The Mobile Phone E-book Reader Based on Android Platform

完成日期2013年4月19日

吉林大学珠海学院本科毕业论文(设计)开题报告

摘要

Android作为一大手机主流平台,凭其优越的性能和丰富的功能,为许多用户所喜爱。拥有一部Android智能手机,让人们的生活无限便捷,android应用市场上所提供的各种丰富应用,几乎可以满足人们生活中的各种需求。现在许多人喜欢通过手机看新闻、看小说、看杂志,手机作为第一大移动客户端,更是能够满足人们随时随地获取资讯的愿望。由此可见,一款好的手机阅读器开发是志在必行的。

本次设计为满足用户对良好阅读体验的需求,采用Sqlite轻量级数据库技术和java编程语言,在android SDK、Ec lipse及Android专门为Eclipse开发的插件ADT搭建的开发环境下,开发了这款功能丰富的电子阅读器。除了最基本的阅读功能,还有书架、找书、书签、模拟翻页效果以及阅读界面设置的操作,并且在真机上对其进行了测试与验证,基本上达到了用户的需求标准。

关键字: android;阅读器;数据库;音乐播放器;翻页

Abstract

Serves as a mainstream mobile phone system platform,Android is popular with manyusers because of its superior performance and rich

functionalities. Owning an android mobile phone can make peoples’ life more convenient. The variety of wonderf ul software applications provided by android application store can almost meet peoples’ daily ne eds indifferent aspects.

Nowadays,many people like to read news、novels or magazines on the mobile phone.Beside,mobile phone serves a s the biggest mobile client is able to meet peoples' aspiration of acquiring information anytime and anywhere. Therefor e,a good design of mobile phone E-book reader is necessary.

In order to bring to users a good experience of reading,this design uses Sqlite lightweight database technology an d the Java programming language. And it is finished under the development environment which consists of Android SD K、Eclipse and ADT. In addition to the basic reading functionality,the E-book reader also provides bookshelf、bookmar k、setting of reading page and some other functionalities. All the functionalities had beentested to work normally on mo bile phone and basically reach the standard of peoples' needs .

Key words:Android;Reader;Database;Music Player;Page Turning

目录

1 前言 (1)

1.1 课题提出的背景目的及意义 (1)

1.1.1 课题提出的背景 (1)

1.1.2 课题提出的目的 (1)

1.1.3 课题提出的意义 (1)

1.2 设计思路及研究方法 (2)

1.2.1 设计思路 (2)

1.2.2 研究方法 (2)

2 需求分析 (4)

2.1 软件的基本功能 (4)

2.2系统功能分析图 (5)

2.3 开发环境 (5)

3 总体设计 (6)

3.1 总体软件结构设计 (6)

3.2 系统结构图 (7)

3.3 数据库设计 (8)

3.3.1 数据模式E-R图 (8)

3.3.2 数据表设计 (9)

3.3.3 表的具体设计 (9)

3.3.4 数据字典 (10)

4 系统功能模块的设计与实现 (12)

4.1关键技术 (12)

4.1.1 android平台及java语言 (12)

4.1.2 sqlite3 数据库 (12)

4.2 数据库实现类及数据库工具类 (13)

4.2.1 数据库实现类DBHelper (13)

4.2.2 数据库操作工具类DBUtil (13)

4.3 书架绘制类BookShelfGridView (15)

4.4 书架类BookShelfActivity (16)

4.5 找图书的实现类FindFilesActivity (18)

4.6 后台阅读主控制类BookPageFactory (18)

4.7 前台阅读显示界面MainActivity (20)

4.7.1 阅读界面上的文字显示控制 (20)

4.7.2 用户书签功能 (21)

4.7.3 背景设置功能 (21)

4.7.4 背景音乐设置功能 (21)

4.7.5 字体设置功能 (21)

4.7.6 设置阅读进度功能 (22)

5 系统测试 (23)

5.1 我的书架 (23)

5.2 用户阅读界面 (24)

6 总结 (30)

参考文献 (31)

附录一核心代码 (32)

1.书架界面代码 (32)

2.小说编码自动识别核心代码 (33)

3.显示界面核心代码 (35)

4.小说内容读取核心代码 (39)

致谢 (40)

1 前言

1.1 课题提出的背景目的及意义

1.1.1 课题提出的背景

信息化的今天,手机已经成为生活中不可或缺的通讯设备。同时,科技的发展使得手机越发精致且智能,在这样的背景下,针对android智能手机所开发出来的各种应用软件层出不穷,将我们的生活打造的多姿多彩。

现在,手机已不仅仅是简单的通讯工具,也是我们日常生活中不可缺少的获得信息的渠道,在很大程度上满足了我们快捷便利获取最新信息的需求。一个好的手机软件,能够丰富用户的生活,满足用户的需要。因此,开发一款好的手机软件是相当有需求和市场的。而手机阅读软件可以为人们提供方便快捷的阅读平台,满足人们随时随地阅读各种资料的需求。

1.1.2 课题提出的目的

此次设计的目的在于,方便阅读者阅读的同时,带给阅读者良好的阅读体验。

阅读者不用再随身携带厚重的书籍,这样能够大大减少了读者的负担,读者只需要事先下载好一本txt格式的电子

书,或者在阅读器中在线下载,并存放在手机sd卡里边,就可以随时随地进行阅读。另外在阅读器的基础上,添加背景音乐功能,让读者在看书的同时,还能享受音乐的美妙,增强用户体验。

1.1.3 课题提出的意义

这个时代是个无纸化电子阅读[1]时代,相对于电视报纸杂志这些传统的信息传递媒介,互联网创造着全新的生活空间,所能提供的信息量更大、更快捷,加上近几年手机等移动设备的快速发展,通过移动互联网获取资讯的方式更加符合人们随时随地获取信息的需求,电子阅读器也就应运而生,逐渐普及。

虽然,android市场上电子阅读类的应用各式各样,但是大多功能较少且简单,用户体验较差,不能满足人们的需求。于是,广大手机读者追求一个功能全面的电子书阅读器。

本软件是基于android系统开发的一款电子阅读器软件,给用户提供舒适的界面和良好的阅读体验是本软件的出发点。所以除了提供一个主界面以供阅读,还提供了虚拟书架和背景音乐,让用户有一种回归书房并在书房里边看书边享受音乐的感觉。另外,用户还能设置阅读界面的背景,调节字体大小与选择进度,还能保存书签以供下次继续阅读。在阅读过程中,用户只要手指轻轻一划就能体验到翻书的效果,这也是阅读器的一大亮点。

1.2 设计思路及研究方法

1.2.1 设计思路

这款阅读器的设计主要遵从需求分析、概要设计、详细设计、编码、测试与维护等一般软件工程开发过程中的几个基本流程[2]。

需求分析阶段,首先根据需求整体分析阅读器的主要功能;概要设计阶段,根据阅读器的组织结构把这些功能模块化,根据模块之间的联系设计业务流程;详细设计阶段,对每个模块进行详细的设计,这个阶段应当保证软件的需求完全分配给整个软件;编码阶段,分别对每个模块进行调试,利用之前编码完成的该模块的桩模块或驱动模块对其进行数据调试;测试阶段,最后对各个模块进行系统集成测试。

在以上陈述中,所谓驱动模块[3],是指被调试模块的上一级模块,也就是调用调试模块并向其传入数据的模块,驱动模块负责传数据,而具体操作由被调试的模块负责执行[5];所谓桩模块[3],是指被调试的模块所调用的模块,桩模块负责接收被调试模块传递的数据,并根据数据执行相应操作[6]。

通过调查,发现智能手机的用户基本都用手机来阅读书籍资料,但各色阅读软件都存在各种不足,差强人意。本系统针对用户需求进行了仔细的分析,最后实现了软件的开发。

1.2.2 研究方法

阅读器在整体框架研究上采用观察研究法,在总体设计上采用结构化方法,在具体开发上采用快速原型法。

观察研究法指根据既定的研究目的,对现象或行为做有计划与有系统的观察,并依观察的记录对现象或行为做客观性的描述和解释。

结构化方法[4]是在结构化程序设计思想基础上发展起来的,由结构化分析、结构化设计和结构化程序设计三部分有机组合而成的。结构化方法的基本思想:把一个复杂问题的求解过程分阶段进行,而且这种分解是自顶向下,逐层分解,使得每个阶段处理的问题都控制在人们容易理解和处理的范围内。

快速原型法[2]就是在系统开发之初,尽快给用户构造一个新系统的模型(原型),反复演示原型并征求用户意见,开发人员根据用户意见不断修改完善原型,直到基本满足用户的要求再进而实现系统,这种软件开发方法就是快速原型法。

2 需求分析

2.1 软件的基本功能

需求分析是必不可少的步骤,也是软件设计成功的基础。在经过观察研究和需求分析,结合分析结果和业务流程,对软件的功能和设计提出了具体的要求。基本上确定阅读器的功能模块如下:

1.目录页面:浏览和查找文件功能

(1)浏览和查找文件:可以浏览SD卡中的文件,包括文本文件和音乐文件,并对文件进行操作,如把文本图书添加到书架上或播放音乐文件。

2.书架界面:包含书架页面,添加图书,删除图书,打开图书,关于等功能

(1)书架页面:阅读器的首页,首次使用阅读器需要从SD卡中往书架上添加图书,添加成功后,图书会出现在书架上。非首次使用,进入阅读器后,可直接对之前已添加在书架上的图书进行操作。

(2)添加图书:通过书架页面menu菜单的添加本地图书或书架上的点击添加图书打开SD卡目录,并导入SD卡中的图书。

(3)删除图书:点击书架上的图书,会出现操作提示框询问是打开图书或者删除图书,点击删除图书可从书架上移除图书。

(4)打开图书:点击书架上的图书,会出现操作提示框询问是打开图书或者删除图书,点击打开图书直接进入阅读界面。

(5)关于:主要是关于本设计的版本,版权问题。

3.阅读界面:阅读页面,添加书签,删除书签,打开书签,背景设置,背景音乐,字体设置,阅读进度,滑动翻页,返回书架等功能

(1)阅读页面:用来阅读文档的主界面,是整个阅读器设计核心部分。

(2)书签:可对当前阅读进度进行保存以方便下次阅读,默认以当前页第一行字作为备注,这样方便用户识别自己想要阅读的进度。点击书签列表中的书签可对书签进行打开或者删除操作。

(3)背景设置:提供了六种舒适的背景图作为阅读背景的选择,不同的阅读界面风格使阅读更为个性化。

(4)背景音乐:做成播放器的样式,方便用户进行操作。用户可从SD卡中读取自己喜欢的歌曲作为背景音乐,在阅读的同时欣赏音乐,提升视听体验。

(5)字体设置:拖动调节条可调节字体的大小。

(6)阅读进度:拖动进度条可调节阅读进度。

(7)滑动翻页:手指在屏幕上滑动会翻书的效果,向左滑则为向后翻页,向右滑则为向前翻页。

(8)返回书架:退出阅读页面,重新进入书架页面进行操作。

2.2系统功能分析图

本设计总体逻辑结构层次划分如图2-1所示。

阅读器文件目录页面书架页面阅读页面查找文件添加图书打开图书删除图书关于背景图片阅读进度背景音乐字体

设置书签滑动翻页返回书架

图2-1 系统功能分析图

2.3 开发环境

本软件的开发是在Windows操作系统下,使用android SDK、Eclipse及Android专门为Eclipse开发的插件ADT

搭建的开发环境。

本软件所涉及到的数据存储的主要是用户对文本阅读文件的阅读进度及文本信息的记录,数据量比较少,使用and roid系统自带的Sqlite轻量级数据库就可以很好的保证这些数据的存储。因此,数据库直接使用sqlite数据库。

3 总体设计

3.1 总体软件结构设计

打开阅读器之后,首先会显示书架界面,书架上会以书本的形式,显示用户之前添加到书架上的图书。如果没有添加过图书,用户可以通过点击书架上的“添加图书”进入SD卡,添加txt格式的小说文本到书架上;通过点击书架上的图书,进入到阅读主界面。

从书架上点击图书进入阅读主界面时,会根据程序自动保存的系统书签表中记录的该图书的信息,自动打开显示定位到上一次的阅读位置,如果之前没打开过,则直接从首页开始显示。在阅读界面,用户可以通过手机上的Menu键,调出功能操作菜单,菜单中用户可以根据操作需要执行:用户书签的添加、删除、打开指定书签的操作;阅读界面的背景设置;阅读时的背景音乐设置;字体大小的设置;阅读进度的拖动定位操作;返回书架操作;

根据各个模块的不同功能,对本设计进行了层次结构的划分。在Eclipse下创建了一个名为TXTReader的工程,工程的结构图如图3-1:

图3-1 软件工程结构图

主要包括以下内容:

(1)src源代码目录:

此目录存放Android应用程序所有的源代码。开发过程中的主要的代码编写都是在该目录下的不同功能类中编写完

成。

(2)gen文件夹目录:

此目录用于存放ADT插件根据应用中的资源文件自动生成的R.java清单,R.java中包含了应用中的用户界面、图像、字符串等各种资源与之相对应的资源编号ID。在编写代码中,要使用资源文件时,可以十分方便的直接通过此清单中对应的资源ID来调用。

(3)Res资源目录:

该目录用于存放整个工程用所用到的全部的资源,包括图片资源、显示界面布局文件、字符串资源、颜色资源、尺寸资源、样式资源等等。

在此目录下,其中通常默认在工程创建时自动生成的常用目录有drawable、layout和values这3个目录。这三个目录分别代表不同的资源类型。其中:

drawable目录:用于保存应用的图片资源,此目录下又可细分为drawable-hdpi,drawable-ldpi,drawable-mdpi3个文件目录,用于根据要显示的屏幕分辨率的不同,对同一个要显示的图片保存不同分辨率的图片资源,这样,程序运行时,可以根据屏幕分辨率自动从对应的drawable选择最合适该分辨率下显示的图片资源。

layout目录:该目录用于存放使用XML格式表示的界面布局文件。一般android 推荐使用XML布局文件来控制视图,这样可以将程序的视图显示控制逻辑从JAVA代码中分离出来,在XML文件中进行界面布局,更好的体现MVC的原则。

values目录:该目录也是包含了用XML格式的资源文件,这里主要保存一些额外的资源,如字符串、颜色、样式和数组等。在代码中使用时,直接通过R类来调用它们,如果不直接使用,可将代码和资源分开管理,便于维护。

除了这些主要的文件目录外,工程下还包含一个AndroidManifest.xml清单文件,这个文件是整个android程序的全局描述文件。AndroidManifest.xml清单文件用于说明该程序的名称、程序图标、程序的版本及支持的运行环境描述、程序的各个组件的组成、可能用到的库文件及程序可能用于的权限说明等。

3.2 系统结构图

电子阅读器系统结构图如图3-2:

阅读器书架打开图书添加图书删除图书关于阅读界面背景设置背景音乐书签滑动翻页阅读进度字体设置返回书架

打开书签删除书签添加书签打开音乐文本文件音乐文件目录页面

图3-2 系统结构图

3.3 数据库设计

3.3.1 数据模式E-R图

建立系统数据模型的主要工具是实体——关联图,即E-R图。

E-R图[7]是表示概念模型的一种方式,用矩形表示实体型,矩形框内写明实体名;用椭圆表示实体的属性,并用无向边将其与相应的实体型连接起来;用菱形表示实体型之间的联系,在菱形框内写明联系名,并用无向边分别与有关实体型连接起来。

E-R图的图形符号约定如图3-3:

图3-3 E-R图图形符号

用户书签书签备注小说文本路径书签页首字符字节位置书签ID文本编码小说文本字节长度

图3-4 用户书签记录的E-R图

用户书签小说文本路径书签页首字符字节位置书签ID文本编码小说文本字节长度

图3-5 系统书签的E-R图

3.3.2 数据表设计

一共设计了2张表,分别是:

(1)用户书签表user_mark(用户书签的ID,小说文件的路径,文件的字节长度,书签备注,小说文本的编码,当前页首字符在文本中的字节位置)

(2)系统书签表sys_mark(系统书签的ID,小说文件的路径,文件的字节长度,小说文本的编码,上次阅读页字节起始位置)

3.3.3 表的具体设计

表名:user_mark

表字段:_id,filepath,fileLength,remark,charset_name,byteBegin

说明:用于存储用户自己添加的书签信息,其中:

_id为自增长的主键。

filepath为小说文本的路径。

fileLength为小说文本的字节长度(用于结合filepath唯一确定某小说文本以防有同名同路径的文本的存在:如用户删除一文本后,可能会添加另一个同名文本,此时虽然路径和文件名都一样,但内容不一样)。

Remark为用户添加书签时的备注信息。

charset_name为文本的字节编码(下次再打开时不用再判断其编码)。

byteBegin为屏幕上的文本首字符在文本中的字节位置(添加书签时,保存当时显示在屏幕上的文本首字符在整个文本文件中所在的字节位置,下次打开可以从该位置直接读取)。

表名:sys_mark

表字段:_id, filepath, fileLength, charset_name,byteBegin

说明:用于程序在用户退出当前阅读文本时,自动记录当前的阅读的信息,以便下次再打开此小说文本时,自动定位到最近一次关闭时的阅读位置。其中:

_id为自增长的主键。

filepath为小说文本的路径。

fileLength为小说文本的字节长度(用于结合filepath唯一确定某小说文本以防有同名同路径的文本的存在)。

charset_name为文本的字节编码(下次再打开时不用再判断其编码)。

byteBegin为屏幕上的文本首字符在文本中的字节位置(下次打开可以从该位置直接读取)。

3.3.4 数据字典

数据字典[11]是物理数据库的具体体现, 是关于数据的信息的集合,也就是对所有数据元素的定义的集合,是一组表和视图结构。

数据库用的android系统自带的轻量级数据库sqlite3,创建了user_mark,sys_mark两个表,分别用于记录用户设置的书签信息和退出阅读界面时,程序自动记录当前阅读信息。具体内容如表3-1、表3-2:

表3-1 用户签表user_mark

表3-2 系统书签表

4 系统功能模块的设计与实现

4.1关键技术

4.1.1 android平台及java语言

以下图表展示了Android操作系统的主要组成部分:

图4-1 Android系统架构图

从图示上,可以发现,android系统底层内核是以Linux系统为基础的,由底层操作系统、中间件、应用程序框架和上层应用程序层四个部分组成,层与层之间相互分离,各层分工明确、层与层之间低耦合[8]。大部分的android程序可以在上层应用程序层通过JAVA或者其他编码言语实现。而电子阅读器正是主要在这层使用JAVA语言为基础编码实现的。

4.1.2 sqlite3 数据库

android系统集成了轻量级的sqlite[9]数据库,sqlite适用于资源有限的设备,具有如下特征:

轻量级数据库,功能简单且尺寸小。

不依赖第三软件,与底层操作系统无关,核心引擎不需要安装,几乎能在所有的操作系统上运行,具有很高的独立性。

方便管理与维护,一个文件包含了数据库的所有信息。

可移植性,可以快速、无缝移值到几乎所有的操作系统

语言无关性,可以支持很多的语言

事务性,采用独立事务处理机制,使用数据库独占性和共享锁处理事务。

Sqlite数据库支持NULL、INTEGER、REAL、TEXT、BLOB这5种数据类型,在处理varchar(n),char(n),decimal(p, s)等数据类型时,Sqlite数据库会将数据转换为其支持的上述5种数据类型。

4.2 数据库实现类及数据库工具类

4.2.1 数据库实现类DBHelper

SQLiteOpenHelper[10]是Android平台提供给我们一个数据库辅助类,DBHelper继承自SQLiteOpenHelper类,负责数据库的创建、更新、打开,用户书签表(user_mark)、系统书签表(sys_mark)的创建。

在DBHelper中定义了用户书签表和系统书签表中各个属性字段的字符串常量,以及创建两种表要用到数据库语句,这样方便对这些字段和语句进行保存和维护。

创建数据表的语句[11]:

Create table 表名(字段1 数据类型primary key autoincrement, 字段1 数据类型,……)

onCreate(SQLiteDatabase db) : 当数据库被首次创建时执行该方法,一般将创建表等初始化操作在该方法中执行(代码如下):

public void onCreate(SQLiteDatabase db)

{

db.execSQL(CREATE_TABLE_SYS_MARK);

db.execSQL(CREATE_TABLE_USER_MARK);

}

4.2.2 数据库操作工具类DBUtil

负责用户书签表(user_mark)和系统书签表(sys_mark)的增、删、改、查操作控制。

主要方法:

(1)iniDB方法用来初始化数据库对象

当创建DBHelper实例时,DBHelper中的onCreate方法会创建名字分别为user_mark和sys_mark的数据表,再通过DBHelper实例调用继承自父类SQLiteOpenHelper中的方法getReadableDatabase便可获得SQLiteDatabase 对象,这时的S QLiteDatabase对象中就包含user_mark和sys_mark两张数据表。在创建数据库时要进行判断,数据库对象是否为NULL 或关闭状态(部分代码如下)。

if (db == null || !db.isOpen()) {

openHelper = new DBHelper(mContext);

db = openHelper.getReadableDatabase(); }

(2)insert_sysMark方法为向sys_mark表中添加系统书签操作

在插入书签记录的过程中,需要定义一个ContentValues对象[12]。ContentValues对象与Map对象相似,可以通过put(key,values)方法在ContentValues对象内保存一系列的键值对,key要与各个字段属性名保持一致。当各个字段以键值对的形式保存入ContentValues对象中,ContentValues对象就是一条书签记录。通过SQLiteDatabase对象的insert方法可以把ContentValues对象插入书签表中,第1个参数是指定的数据表名;第3个参数是ContentValues对象;第2个参数指定一个列名,因为在SQL标准中不能插入全部字段为空的记录,当用户需要插入全部字段为空的记录时,就会这个指定的字段赋NULL值再去执行SQL语句(部分代码如下)。

contentValues.put(DBHelper.SYS_FILE_PATH, filePath);

contentValues.put(DBHelper.SYS_FILE_LENGTH, fileLen);

contentValues.put(DBHelper.SYS_CHARSET_NAME, charSetName);

contentValues.put(DBHelper.SYS_BYTE_BEGIN, byteBegin);

db.insert(DBHelper.TABLE_SYS_MARK, DBHelper.SYS_CHARSET_NAME,

contentValues);

(3)search_sysMark方法为查询sys_mark表中对应的数据操作

数据库查询后返回的是一个Cursor游标对象[13],游标对象可以理解为一个由符合查询条件的记录组成的一张二维表格。SQLiteDatabase对象的查询方法query中,第1个参数table是指定查询的表名;第2个参数columns是查询后返回的字段;第3个参数selection是where后面的条件语句;第4个参数selectionArgs数组用来指定where语句中查询字段的值;groupBy分组语句;having排序语句;orderBy排序语句(部分代码如下)。

cursor = db.query(DBHelper.TABLE_SYS_MARK, new String[] {

DBHelper.SYS_BYTE_BEGIN, DBHelper.SYS_CHARSET_NAME },

DBHelper.SYS_FILE_PATH + "='" + filePath + "' AND "

+ DBHelper.SYS_FILE_LENGTH + "=" + fileLen, null, null,

null, null);

(4)getSysTableDates方法用来查询sys_mark表中所有数据

(5)update_sysMark方法为更新sys_mark表中阅读页首字符的字节起始位置

因为sys_mark表记录都是已经添加到书架上图书,当读者点击图书进入阅读再返回书架或退出时,返回或退出时的阅读页面已经发生变化,那么首字符的字节起始位置也会发生变化,这时update_sysMark方法就会自动更新这本图书的记录,以便下次读者继续阅读同一本图书时能接着阅读。

Update方法的第1个参数table是要更新数据所在的表名;第2个参数ContentValues是要更新的字段数据;第3个参数whereClause是查询条件;第4个参数是与第三个参数相关联的的条件值(部分代码如下)。

db.update(DBHelper.TABLE_SYS_MARK, contentValues,

DBHelper.SYS_FILE_PATH + "='" + filePath + "' AND "+ DBHelper.SYS_FILE_LENGTH + "=" + fileLen, nul l);

(6)del_sysMark方法为删除sys_mark表中对应的数据操作

delete方法中的第1个参数table是指定操作的数据表;第2个参数whereClause是条件;第3个参数whereArgs是一个字符串数据,与第2个参数相关联的条件值(部分代码如下)。

db.delete(DBHelper.TABLE_SYS_MARK, DBHelper.SYS_ID+"="+id, null);

(7)search_userMark方法用来查询并返回user_mark表中所有数据

在search_userMark方法中,所有的用户书签数据在查询后以按ID倒序排列的形式返回,这是因为用户书签在插入时类似于栈的先进后出,先插入的书签显示在下面,后插入的书签显示在上边。

(8)insert_userMark方法为向user_mark表中添加用户书签操作

(9)del_userMark方法为删除user_mark表中对应的数据操作

4.3 书架绘制类BookShelfGridView

主要用来对书架的背景进行绘制[14]。

在构造方法中调用BitmapFactory.decodeResource方法的主要作用是获得单行书架背景样式,第1个参数是要加载的位图资源文件的对象(一般写成getResources()就可以);第2个是需要加载的位图资源的ID,R.drawable.bookshelf_ line是单行书架背景图片的ID(部分代码如下)。

bookShelfLineBG = BitmapFactory.decodeResource(getResources(),

R.drawable.bookshelf_line);

dispatchDraw(Canvas canvas)方法能对当前组件的各个子组件进行绘制(每个子组件都是一行书架背景),首先通过getHeight()和getWidth()得到当前页面的长和宽以及每个子组件的长和宽,然后通过循环语句逐行绘制书架(部分代码如下)。每绘制一次,都需要使用画布类Canvas调用它drawBitmap方法,第1个参数是用来绘制的位图资源类;第2个参数是绘制起始点的X坐标;第3个参数是绘制起始点的Y坐标;最后一个参数直接写NULL就可以。

for (int y = top; y < height; y += backgroundHeight) {

for (int x = 0; x < width; x += backgroundWidth) {

canvas.drawBitmap(bookShelfLineBG, x, y, null);

}

}

在视图资源文件book_shelf.xml中,以net.myNovelReader.BookShelfGridView为标签定义书架组件,并布局到该文件下,当BookShelfActivity启动时,onCreate方法中的setContentView(https://www.360docs.net/doc/4f17551865.html,yout.book_shelf)就能让书架页面得到初始化(部分代码如下)。

android:id="@+id/bookShelf"

...... />

4.4 书架类BookShelfActivity

主要实现书架界面图书的添加、删除及点击进入该图书阅读界面的控制。

主要方法和实现显示图书信息的内部类:

(1)ShlefAdapter类是书架上每个子项图书显示信息的自定义内部适配器,继承了基本适配器类BaseAdapter(适配器是组件与数据之间的桥梁,负责把数据绑定到视图组件上,使得数据能够视图化)

ViewHolder类是将每个项目中的控件封装起来的类。

getView方法的作用是获得要展示的单个子项图书,第1个参数position是该子项图书在所有图书项中排列的位置;第2个参数convertView在书架第一次显示图书时为NULL值,当书架上的图书过多时,向上滚动屏幕时,屏幕上的图书视图发生变化时,convertView不是NULL值;第3个参数parent是该子项图书最终会被附加到的父级组件,也就是书架组件。

只有在convertView为NULL时才去实例化控件,创建convertView对象、holder对象,而convertView非NULL

时不要实例化,否则每次都要实例化,读者反复滑动屏幕时会有“卡”的感觉,不流畅。可以在convertView为NULL时,创建ViewHolder的实例,通过convertView.setTag(holder)把它保存到convertView中,在convertView为非NULL时再通过convertView.getTag()取出holder(部分代码如下)。

if (contentView == null)

{

contentView = LayoutInflater.from(getApplicationContext())

.inflate(https://www.360docs.net/doc/4f17551865.html,yout.book_shelf_item, null);

holder = new ViewHolder();

holder.textView = (TextView) contentView

.findViewById(R.id.txt_book);

conten tView.setTag(holder);

} else {

holder = (ViewHolder) contentView.getTag();

}

(2)getBookShelfInfo从系统书签表sys_mark中取得用户添加过的图书信息,用于将该图书显示到书架上

(3)iniBookShelf方法用来对书架上显示的图书信息进行初始化

先创建一个BookShelfAdapter的实例adapter,然后通过bookShelf.setAdapter(adapter)把图书信息数据绑定到书架组件上,对书架设置点击事件监听器bookShelf.setOnItemClickListener,这样子当用户点击图书时便能触发事件对图书进行操作(部分代码如下)。

bookShelf.setAdapter(adapter);

bookShelf.setOnItemClickListener(new OnItemClickListener())

在setOnItemClickListener的onItemClick方法,第1个参数AdapterView是指图书数据源,也就是适配器对象adapt er;第2参数View是监听到的被操作控件,就是用户当前点击的图书对象;第3个参数position是被点击图书在所有图书中的位置;

Position在onItemClick方法中可以用来判断用户点击的图书是第一个还是非第一个,如果是第一个则跳转到查找文本文件的Activity,否则就获取点击的文本的路径和id以便进行后续的打开或删除文本记录操作(部分代码如下)。

if (position == 0) {

Intent intent = new Intent(BookShelfActivity.this,

FindFilesActivity.class);

startActivityForResult(intent, 0);

} else {

......

if (sysCursor != null

&& sysCursor.moveToPosition(position - 1)) {

filePath = sysCursor.getString(sysCursor

.getColumnIndex(DBHelper.SYS_FILE_PATH));

id = sysCursor.getInt(sysCursor

.getColumnIndex(DBHelper.SYS_ID));

......}

}

(4)onActivityResult方法为取得用户从SD卡中选择要显示到书架上的图书信息后的返回信息

intent类能在Activity、Service间传递调用请求以及传输数据,bundle类类似于Map,用于存放key-value名值对形式的值,putXxx()用于往Bundle对象放入数据,getXxx()方法用于从Bundle对象里获取数据。

在onActivityResult中,通过intent的实例调用getExtras方法获取从FindFilesActivity图书查找类中返回的被选择的图书的信息,保存到bundle的实例中,然后提取文件路径和长度信息,通过DBUtil.search_sysMark(filePath, fLen) 查询系统书签表sys_mark中有无对应记录,不为NULL则表示书架上已经存在改图书,否则把该图书的记录保存到系统书签表sys_mark中(部分代码如下)。

if (DBUtil.search_sysMark(filePath, fLen) != null)

{

Toast.makeText(BookShelfActivity.this, "该图书已经在书架中添加过了!!",Toast.LENGTH_LONG).show();

} else {

......

DBUtil.insert_sysMark(filePath, fLen, Constant.charSetName, 0);

onResume();

}

4.5 找图书的实现类FindFilesActivity

主要实现从SD卡中,将查询到的txt图书信息传递回书架界面,以将小说图书添加到书架上。

主要方法:

(1) inflateListView方法为取得当前路径目录下包含的所有文件路径信息,并把这些文件展示到文件列表中

(2) initFiles方法为加载并显示当前路径目录下的所有文件(部分代码如下)

root和parentFile都是File文件类,parentFile用来保存当前文件的路径,以便从下级目录进行返回操作。currentFil es是File类型的数组,用来保存当前目录下所有的文件,通过root的listFiles方法可获取该目录下所有的文件并保存到c urrentFiles中。如果/mnt/sdcard和/sdcard两种格式的SD卡根目录都不存在,提示用户“无法读取内存卡信息” 。

root = new File("/mnt/sdcard");

if (root.exists()) {

currentFiles = root.listFiles();

parentFile = root;

inflateListView();

} else {

root = new File("/sdcard");

......

} else{

Toast.makeText(FindFilesActivity.this,

R.string.find_files_sdcardErr, Toast.LENGTH_LONG)

.show();

return; }

4.

6 后台阅读主控制类BookPageFactory

BookPageFactory类是阅读器文字加载处理的后台主要控制类,控制着文本文件打开操作,文字字节流的读取,字节编码识别,字节到字符的转换,每页所要显示的文字截取,翻页、文字的显示和阅读背景的显示控制。

(1)BookPageFactory构造方法用来对打开阅读界面时,即将加载的各种空间属性进行初始化。

Paint画笔类在绘图过程中起到了极其重要的作用,它能保存了颜色、样式等绘制信息和指定如何绘制文本和图形。setTextAlign(Align.LEFT)方法指定阅读文字在阅读页面左对齐,setTextSize()设置阅读文字的大小,setColor()设置阅读文字的颜色。

构造方法在加载时,根据传进来的参数bg_id判断所要设置的背景图片。如果id为-1,表示没有背景,则对用来保存背景的bitmap对象

bitBookBg赋值NULL,否则把id传入到

setBgBitmap(id)中进行处理。

(2)setBgBitmap方法为阅读背景的修改控制,用户改变阅读背景时,根据传进来的背景图片id替换要绘制显示的阅读背景(部分代码如下)

Bitmap bitmap =

BitmapFactory.decodeResource(mContext.getResources(),

bgID);

bitBookBg =

Bitmap.createScaledBitmap(bitmap, screenWidth,screenHeight, true);

BitmapFactory.decodeResource方法的作用在论文前面有提过,这里主要用来根据id把背景图片生成位图资源以便保存在全局bitBookBg对象中;Bitmap.createScaledBitmap方法把图片缩放到屏幕的大小,所以第2和第3个参数分别是屏幕的宽和高,第1个参数的缩放对象,第4个参数是boolean值,true为过滤图片。

(3)onDraw方法负责把文字和背景的具体显示绘制到屏幕上,在setBgBitmap方法把图片信息保存到bitBookBg对象中后,由onDraw负责把bitBookBg对象绘制到屏幕上

if (

bitBookBg != null) {

c.drawBitmap(bitBookBg, 0, 0, null);

} else {

c.drawColor(Color.WHITE);

}

......

for (String strLine : strList) {

y += Constant.fontSize + 5;

c.drawText(strLine, x, y, mPaint);

}

c是一个画布Canvas对象,drawBitmap和drawText方法是Canvas的两种绘制方式,前者用来绘制图片,后者用来绘制文字。两种方法的参数一样,只是对象类型不同。第1个参数是绘制的对象资源;第2个参数是起始绘制点的X坐标;第三个参数是起始绘制点的Y坐标;第4个参数是绘制工具,一般为Paint画笔对象,也可为NULL。其中x是每行首个文字离屏幕左边界的距离,y为行距,strList是个String类型的字符串数组,用来保存每行文字的信息。因为每重新绘制一行文字,都要确定绘制起始点坐标,所以循环语句循环一次,y都要自加字体大小一次。

(4)openbook方法是从书架点击图书进入阅读界面时,如该图书为首次打开时,从头开始读取用于显示到当前页的

在openbook中,一次取大约2倍于手机屏幕每页能显示的最大字符数的字符以用于处理,依据系统检测到的该文件的编码进行字符转换,并保持在字符串对象contents中,作为参数传递给自定义的iniPageChars进行显示处理(部分代码如下)。

mappedByteBuffer = new RandomAccessFile(file, "r").getChannel().map(

FileChannel.MapMode.READ_ONLY, 0, Constant.fileLen);

int fontCount = Constant.fontCountsPrePage * 4;

if (Constant.fileLen < fontCount)

fontCount = Constant.fileLen;

......

while (mappedByteBuffer.position() < fontCount) {

readByte[i++] = mappedByteBuffer.get();

}

String contents = new String(readByte, Constant.charSetName);

MappedByteBuffer 只是一种特殊的ByteBuffer,MappedByteBuffer将文件直接映射到内存,可以映射整个文件,如果文件比较大的话可以分段进行映射,只要指定文件的那个部分就可以。map(int mode,long position,long size),可以把文件的从position开始的size大小的区域映射为内存映像文件,mode指出了可访问该内存映像文件的方式。readByte 是fontCount大小的字节数组,用来保存映射到内存中的字节文件。

(5)iniPageChars方法用来处理当前页面需要显示的字符串内容

(5)openBefore方法是从书架点击图书进入阅读界面时,如该图书为之前记录打开过,则根据传入的当时保存的文件文字阅读位置开始用于显示

(6)getPreChars方法为获取上一页操作要显示的文字信息

(7)nextPage方法为下一页翻页操作控制,用户做下一页翻页操作时,控制下一页要显示的文字的读取和显示

(8)prePage方法为上一页翻页操作控制,用户做上一页翻页操作时,控制上一页要显示的文字的读取和显示

(9)readBySeekbar方法为拖动改变阅读进度的文字显示控制,用户通过菜单上的拖动条改变阅读进度时,控制阅读页的文字读取和显示

4.7 前台阅读显示界面MainActivity

MainActivity类是阅读图书时,显示在屏幕上的活动Activity,用于具体呈现给用户当前阅读界面的状态,并根据用户的不同操作,将操作结果输出反馈在显示屏幕上。

4.7.1 阅读界面上的文字显示控制

主要方法:

(1)iniPro方法用于显示界面的画布初始化,用于文字信息的加载准备

(2)openBy_SysMark方法用于准备刚从书架点击图书进入到阅读显示界面时,从系统书签表中查询此图书的阅读记录,如果有则从记录的位置开始打开显示,如果没有则从头开始显示阅读。

(3)showTheTxt方法为执行显示(2)步骤中准备好的文字信息到屏幕上

4.7.2 用户书签功能

弹出自定义的用户书签窗口Dialog,让用户能根据自己的阅读进度需要,执行:添加自己的书签、打开并定位到以前保存的指定书签阅读记录、删除不想再使用的书签。其中,在添加书签时,可以让用户对书签进行备注,用于帮助用户记忆该保存的书签当时的阅读状态。

实现的主要方法:

(1)iniLvwShowBookmark方法为初始化该书签将要显示的文本信息

(2)bookmark方法为弹出显示用户书签窗口

4.7.3 背景设置功能

让用户能从程序提供的背景图片用,选择一个作为阅读图书的背景图片,使用能根据自己的需要改善阅读时的视觉

实现的主要方法:

从onActivityResult方法中,取得用户在选择背景图片用到的Activity中返回的背景图片信息,根据返回结果显示阅读背景图片。

4.7.4 背景音乐设置功能

该功能让用户在阅读小说时,可以选择歌曲作为阅读时的背景音乐,增加阅读的乐趣。

实现的主要方法:

从onActivityResult方法中,取得用户在选择背景音乐用到的Activity返回的背景音乐信息,根据返回结果通过sho wMusicPlayer显示并播放用户选择的音乐。

4.7.5 字体设置功能

该功能可以让用户根据需要,改变显示的文本的字体大小。

实现的主要方法:

通过changeFontSizeBySeekbar方法,显示改变字体的弹出窗口,在其中的SeekBar拖动条上,设置了监听字体状态改变的监听器,该监听器根据拖动条值改变字体的大小

4.7.6 设置阅读进度功能

该功能可以让用户直接拖动进度,跳转到打算阅读的进度位置,让用户能快速定位到想要到达的阅读进度。

实现的主要方法:

通过changePageBySeekbar方法,显示改变当前阅读进度的弹出窗口,在SeekBar拖动条位置改变状态的监听器中,根据拖动条值改变阅读进度

5 系统测试

5.1 我的书架

打开本系统,首先进入的是我的书架界面,效果如图5-1所示。

图5-1书架界面

目录页面,往书架上添加图书,效果如图5-2和图5-3所示。

图5-2 目录界面图图5-3 书架上已添加的图书

对书架上的图书进行操作,包括打开图书和删除图书,效果如图5-4和5-5所示。

图5-4 操作提示框图5-5 删除操作提示框

在图5-4中,如果点击打开则直接进入阅读界面。如果点击删除则会出现删除操作提示框(如图5-5所示),询问用户是否确定要把删除操作进行到底,这样可以避免在用户不小心点中删除键后直接删除图书。

5.2 用户阅读界面

点击打开键后,则直接进入阅读界面,效果如图5-6所示。

图5-6 阅读界面

如果用户第一次运行软件或者是打开一本新书,进入阅读界面后是该图书的第一页。否则进入上一次退出时所在的阅读页面。

阅读时手指向左向右的翻页效果,效果如图5-7和图5-8所示。

图5-7 向左翻书图5-8 向右翻书

在阅读界面时,点击手机上的Menu按钮,效果如图5-9所示。

图5.9 阅读界面的菜单

图5-9 Menu菜单

点击书签,出现书签界面,如图5-10所示

图5-10 书签界面

书签操作包括打开书签、添加书签和删除书签,效果如图5-11、5-12、5-13所示。

图5-11 书签操作提示框图5-12 删除书签操作提示框

图5-13 添加书签页面

在书签界面,点击加号图标则出现图5-13所示的添加书签页面。如果点击已存在的书签则出现如图5-11所示的书签操作提示框询问是打开书签或者删除书签,点击打开书签则直接打开该书签对应的阅读页面。如果点击删除按钮则出现如图5-12所示的删除操作提示框询问是否把删除操作进行到底,这样设计可以防止用户误进行删除操作,点击确认才能最终删除书签。

背景设置界面,效果如图5-14和图5-15所示。

图5-14 背景设置界面图5-15 背景效果

在主菜单界面中单击“背景音乐”按钮进入背景音乐界面,效果如图5-16所示。

图5-16 背景音乐界面

字体设置界面,拖动调节条可调节大小,效果如图5-17所示。

图5-17 字体设置界面

调节阅读进度,拖动进度条选择自己想要的进度,效果如图5-18所示。

图5-18 进度设置界面

6 总结

电子阅读器所实现的模块在经过测试可正常运行,且达到了预期设计效果。但是设计中仍存在不足之处。

特点:以Android作为开发平台、JAVA作为开发语言、SQLite3作为数据库技术支持,能较好解决开发过程中遇到的技术问题。本设计的界面特点:采用大量界面友好的人机交互式,使用户在阅读界面可以完成自己需要的操作,简单方便,很好的体验阅读的全过程。电子阅读器实现了从SDCARD找书,添加图书,删除图书,滑动翻页,更改字体大小,设置背景图片,设置背景音乐,添加书签,选择书签,删除书签,选择进度等功能,在很大程度上方便用户阅读书籍资料。其中,书架界面,翻页效果,背景音乐,背景图片,读者最后一次阅读的信息并在下次打开时自动初始化到上次阅读到的界面是本设计的几大特点。

不足:在本设计中只有将新书下载至SDCARD中才可供读者阅读,因为本人设计水平有限,未能实现上网下载图书的功能,没有能够利用到网络上资源。

参考文献

[1] https://www.360docs.net/doc/4f17551865.html,/Html/zhuanti/zxfx_2499_4389.html北京文艺网. 移动阅读时代:电子阅读器的发展背景及发展趋势[EB/OL]. [2012-12-23].

[2] 殷人昆. 实用软件工程(第三版)[M]. 清华大学出版社, 2010-11-1.

[3] 朱少民. 软件测试方法和技术(第2版)[M]. 清华大学出版社.

[4] 百度百科. 结构化方法[EB/OL]. https://www.360docs.net/doc/4f17551865.html,/view/551681.htm

[5] 百度百科. 驱动模块[EB/OL]. https://www.360docs.net/doc/4f17551865.html,/view/495038.htm

[6] 百度百科. 桩模块[EB/OL].https://www.360docs.net/doc/4f17551865.html,/view/229023.htm

[7] 百度百科. E-R图[EB/OL]. https://www.360docs.net/doc/4f17551865.html,/view/15236.htm?fromId=1622963

[8] 邓凡平.深入理解Android(卷1).?机械工业出版社.

[9] 百度百科. SQLite[EB/OL]. https://www.360docs.net/doc/4f17551865.html,/view/1447600.htm

[10] 吴亚峰.Android应用案例开发大全[M].北京:人民邮电出版社.

[11] 萨师煊、王珊.数据库系统概论(第三版)[M].高等教育出版社, 2006

[12] 李刚.疯狂Android讲义.电子工业出版社.

[13] 关东升.Android开发案例驱动教程.机械工业出版社.

[14] CSDN IT社区网. 书架效果[EB/OL]. https://www.360docs.net/doc/4f17551865.html,/wangkuifeng0118/article/details/7944215

附录一核心代码

1.书架界面代码

private Bitmap bookShelfLineBG;//一行书架的背景

public BookShelfGridView(Context context, AttributeSet attrs) {

super(context, attrs);

//取得单行书架的背景样式

bookShelfLineBG = BitmapFactory.decodeResource(getResources(),

R.drawable.bookshelf_line);

}

/**

* 绘制书架各子项(一行为一个子项)

*/

@Override

protected void dispatchDraw(Canvas canvas) {

int count = getChildCount();

int top = count > 0 ? getChildAt(0).getTop() : 0;

int backgroundWidth = bookShelfLineBG.getWidth();

int backgroundHeight = bookShelfLineBG.getHeight()+2;

int width = getWidth();

int height = getHeight();

for (int y = top; y < height; y += backgroundHeight) {

for (int x = 0; x < width; x += backgroundWidth) {

canvas.drawBitmap(bookShelfLineBG, x, y, null);

}

}

super.dispatchDraw(canvas);

}

2.小说编码自动识别核心代码

* 根据输入文本文件判断文本所使用的编码,如果传入的默认编码为空,则表示之前尚未检测过编码*

* @param filePath

* 文件路径

* @param defaultEncode 为空表示之前未检测过检测,执行编码检测操作。

*/

public static void getCharSet(String filePath, String defaultEncode) {

if (defaultEncode.equals(""))// 未检测编码时,执行检测编码操作

{

BufferedInputStream bis = null;//用于检测编码的字节流

charSetName = "GBK";//设置默认编码为GBK

//编码检测代理

CodepageDetectorProxy detector = CodepageDetectorProxy

.getInstance();

detector.add(new ParsingDetector(false));

detector.add(UnicodeDetector.getInstance());

detector.add(JChardetFacade.getInstance());

try {

//取得待检测的文件字节流

bis = new BufferedInputStream(new FileInputStream(new File(

filePath)));

//根据字节流自动检测出文本的Charset

Charset charset = detector.detectCodepage(bis, 10240);

if (charset != null) {//不为空时表示检测到对应的编码类型

charSetName = https://www.360docs.net/doc/4f17551865.html,();//取文本的编码名

}

} catch (MalformedURL Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} finally {

//关闭字节流

try {

if (bis != null)

bis.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

// 首次打开时,初始化起始和下一页开始字节位置,以便正确计算处理打开的第一个页面处理显示的字符后,正确的计算当页起始字节和下一页起始字节

fontsPreEnd = 0;

fontsNextBegin = 0;

} else// 已过检测编码

{

charSetName = defaultEncode;

}

Constant.seekbarBytesPer = (float) Constant.fileLen

/ Constant.seekbarMax;// 计算拖动条每刻度代表的字节数

ini_r_n(charSetName);

}

3.显示界面核心代码

/**

* 加载显示文本页面控件初始化

*/

private void iniPro() {

// +

mPageWidget = (PageWidget) findViewById(R.id.pageView);

// 显示页面

pagefactory = new BookPageFactory(this, screenWidth, screenHeight, bgID);

// 翻页效果控制

mPageWidget.setBitmaps(mCurPageBitmap, mCurPageBitmap); mPageWidget.setOnTouchListener(new OnTouchListener() {

public boolean onTouch(View v, MotionEvent e) {

// TODO Auto-generated method stub

// +

boolean ret = false;

if (v == mPageWidget) {

if (e.getAction() == MotionEvent.ACTION_DOWN) {

mPageWidget.abortAnimation();// 翻页效果动画

mPageWidget.calcCornerXY(e.getX(), e.getY());// 计算翻页效果的折边pagefactory.onDraw(mCurPageCanvas);

if (mPageWidget.DragToRight()) {// 从屏幕左半区域向右拖动(前一页操作) try {

turnPage = pagefactory.prePage(true);

} catch (IOException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

// if(pagefactory.isfirstPage())return false;

pagefactory.onDraw(mNextPageCanvas);

} else {// 从屏幕右半区域向左拖动(下一页操作)

try {

turnPage = pagefactory.nextPage(true);

} catch (IOException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

// if(pagefactory.islastPage())return false;

pagefactory.onDraw(mNextPageCanvas);

}

mPageWidget.setBitmaps(mCurPageBitmap, mNextPageBitmap);

}

if (turnPage)//判断可以正常翻页,则绘制翻页效果

ret = mPageWidget.doTouchEvent(e);

return ret;

}

return false;

// -

}

});

// -

}

/**

* 进入显示页面时,根据传入的信息显示文本内容到界面上

相关文档
最新文档