(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搭建的开发环境。
本软件所涉及到的数据存储的主要是用户对文本阅读文件的阅读进度及文本信息的记录,数据量比较少,使用android系统自带的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 对象,这时的SQLiteDatabase对象中就包含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, null);
(6)del_sysMark方法为删除sys_mark表中对应的数据操作
delete方法中的第1个参数table是指定操作的数据表;第2个参数whereClause是条件;第3个参数whereArgs是一个字符串数据,与第2个参数相关联的条件值(部分代码如下)。
db.delete(DBHelper.TABLE_SYS_MARK, DBHelper.SYS_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); } }
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库毕业论文(9)(2)在线全文阅读。
相关推荐: