基于Android的电子书阅读器的设计与实现

Android平台现在非常的火,我们平时使用的智能手机,平板电脑,还有新的智能电视,有很大部分是基于Android平台的,很显然,它在人们生活中的表现得越来越重要。

本文详细介绍了采用JAVA语言,设计并开发一个基于Android平台的电子书阅读器的过程。从一开始的准备工作、系统的需求分析和设计、系统的实施、系统的测试和部署等方面介绍了该阅读器的开发过程。本文实现的这个电子书阅读器主要是用于阅读txt格式的电子书,可以实现字体大小的调整,阅读的翻页等功能。

关键字:JAVA语言, Android平台。

前言

世界在不断的向前发展,科技在不断的更新,随着计算机技术的不断的发展,它已经融入到人们的生活的当中,人们已经无法离开手机,智能手机也一点点的流行起来,与此同时智能手机的应用开发也开始不断的成熟,近年来,Android系统在手机端的市场占有率在不断的提高,市场的变大,需求肯定也会变大,技术也会不断的成熟。

Android平台可以说是当下最为流行的一种平台了,Android用的是Linux的内核,但不能说是Linux系统。Android在Linux的基础上开发的操作系统,移动端用的会比较的多。Android一开始只支持手机端,也不是有Google开发的,2005年的时候被Google收购,然后一点点的改良调整,慢慢的扩展到其他的领域。在市场占有率上面,到12年底,其占全球智能手机操作系统市场52.5%的份额,中国市场占有率为68.4%。

Android系统在人们生活中的体现越来越多。本文详细介绍了采用JAVA语言,设计并开发一个基于Android平台的电子书阅读器的过程。JAVA是一种非常常见非常受欢迎的程序设计语言,JAVA是特地应对C++中的难点所开发的,C++是基于对象的程序设计语言,而JAVA则是纯面向对象的编程语言,JAVA相对于C++来说较为简单,更加容易让人理解,学习起来更加方便,很好理解并不意味着非常的简陋,JAVA的功能非常的强悍,使用起来也是非常的方便。对于该课题来说,所要实现的基于Android的电子书阅读器应该是一个界面清晰明了的,能让用户有更好的使用享受的一款APP。

目录

第一章绪论 3

1.1引言 3

1.2主要研究内容 3

1.3本章小结 4

第二章环境配置 5

2.1目标 5

2.2运行环境 5

2.2.1硬件资源 5

2.2.2软件资源 5

2.3环境搭建 5

2.3.1 JDK安装 5

2.3.2 google集成环境的安装 7

2.4本章小结 8

第三章相关技术介绍 10

3.1 JAVA概述 10

第一字母小写,包名全小写等。 11

3.2安卓介绍 11

3.3 Sqlite相关介绍 12

3.4系统开发运行环境 12

3.6本章小结 12

第四章系统的分析和设计 13

4.1需求分析 13

图4-1-1流程图 14

4.2模块的划分 15

图4-2-1总模块图 15

4.3模块详细介绍 16

4.3.1书架模块 16

4.3.2管理模块 16

4.3.3导入模块 17

4.3.4阅读模块 17

4.3.5字体模块 18

4.3.6书签模块 18

4.3.7主要技术难点分析 19

4.4本章小结 19

第五章系统的实施 20

5.1书架模块 20

5.2管理模块 23

5.3导入模块 24

5.4阅读模块 25

b1=m_mbBuf.get(i++); 26

b1=m_mbBuf.get(i++); 26

5.5字体模块 27

5.6书签模块 28

5.7本章小结 29

第六章系统的测试 30

6.1系统的测试 30

打开应用的跳出软件欢迎的界面 30

欢迎界面结束后的书架界面 31

正常的书架界面 31

书架菜单界面: 32

本地导入功能界面 32

6.2本章小结 35

结论 36

第一章绪论

1.1引言

随着当今社会经济日益发展,人们的生活水平有了很大的提高,大家开始不仅满足于一些基本的物质生活需要,人们的文化生活也变的多种多样,精神世界得到了进一步的丰富,与此同时,人们对文化生活,精神世界内容的需求也在不断跟新,而书本做为精神力量的来源之一,关于它的一些改变必定影响着人们的生活。伴随着智能手机的出现,更多的年轻人开始脱离以前的纸质书本阅读,电子书边的越来越流行。大众对电子阅读应用的需求也随之增长。随着Android市场份额的不断增加,Android应用开发技术也日益的成熟。

在Andorid火之前,市场上的智能手机大多数是塞班系统的,那是塞班系统占有了很大的市场份额,但是塞班系统有着很多的不足,它的可移植性比较多额差,慢慢的,随着塞班的系统的陨落,Android系统逐渐的取得了用户的心,它的强势出现并迅速占领了智能手机系统的市场。它的扩展性和移植性是非常好的,所以渐渐的,因为它的这些优势,安卓慢慢的变成了时下应用最为广泛的,最受欢迎的,最流行的一种嵌入式设备的操作系统,比如笔记本、MP4、机顶盒、GPRS定位设备、平板电脑,电视机等。安卓系统给嵌入式设备带来了全新的,完全不一样的用户应用体验,从最简单最广泛的手机中我们就可以看出Android系统的应用是多么的丰富。最老的手机是又大功能又少,后来慢慢到了塞班的系统,它的界面以及应用丰富了很多,但是当到了安卓的系统后,我们可以发现是一个天翻地覆的变化,界面可以说是绚丽,应用程序更可以说是以数百万来记。正是因为安卓系统的出现才使得手机变成人们生活中不可或缺的一部分。

1.2主要研究内容

使用JAVA语言进行最基本的编程操作,编写一个基于Android平台的电子书阅读器,使之能够正常的投入使用,其基本的功能包括以下几个点:

1)在初次安装应用的时候,在正式进入主活动的时候弹出一个Dialog进行软件操作说明,及相关性的一些软件信息的提示。

2)主要实现TXT格式的电子书的正常阅读功能,即能在屏幕显示txt的文本内容。

3)能够根据客户的需求,进行字体大小的调整,使之适应更加多的阅读人群,使得用户体验更加的优质。

4)关于电子书书签功能的研究,增强用户体验。

5)实现本地文件的导入功能,增加阅读软件的实用性。

1.3本章小结

这一章的内容主要阐述了一下Android系统的相关历史,同样的简单介绍了一下,对与Android开发的相关知识点。重点介绍了一下有关本次课题所要求开发应用的相关功能要求。

第二章环境配置

2.1目标

在实施这个设计之前,我们会有有很多的必要的事情要去完成,首先,我们要在电脑上搭建平台,配置JDK的环境变量,安装开发所要用到的一些必要的软件Eclipse或者Android Studio,在这边,笔者使用的是Eclipse的开发工具,在安装完Eclipse之后,我们需要安装安卓的虚拟机SDK以及安装完成之后如何让虚拟机可以运行的AVD的设置。

2.2运行环境

2.2.1硬件资源

一部安装了Android系统的智能手机,或者PC下的AVD。

2.2.2软件资源

操作系统:Windows(XP,7,8均可,笔者用的是win8)。

Android SDK。

JDK 1.7.0_45,或者其他版本。

Eclipse。

2.3环境搭建

2.3.1 JDK安装

1)JDK的下载:

关于JDK的下载,可以翻墙后进入oracle官方网战下载,在上面找到对应的自己电脑版本的JDK下载即可。

下载后按照提示安装好JDK。

2)打开电脑配置JDK的环境变量的界面

步骤1:打开计算机的系统属性,在高级面板上点环境变量按钮,会有环境变量的对话框出现。如图2-1所示:

图2-1环境变量图

步骤2:给用户配置环境变量:

a新建一个JAVA_HOME的变量,它的值设为c:\Program Files\Java\jdk1.7.0_45

如图2-2所示:

图2-2具体变量图

b新建一个变量,名为:CLASSPATH

值为:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar

如图2-3所示:

图2-3 CLASSPATH图

C将JDK对应文件夹中bin文件夹的地址添加到path中。

如图2-4所示:

图2-4 Path图

步骤3:检验JDK是否安装成功:

打开cmd,输入java。

如图2-5所示:

图2-5查看JDK是否安装成功图

2.3.2 google集成环境的安装

关于它的下载,依旧是到对应公司的官网去下载。找到合适的版本点击下载即可。

然后是下在不同版本的安卓平台:如图2-6所示:

图2-6下载安卓版本图

完成所有的下载之后就基本完成了配置工作。

在所有配置完成之后我们还需要创建一个AVD来为我们服务,为了能够让安卓应用程序可以在模拟器上运行,我们必须要创建一个AVD。打开Eclipse,找到SDK Manager,然后左击旁边面板的Virtual Devices,按步骤填完相应的内容,最后点击Create AVD,我们就创建好了一个AVD了。下面就可以进行我们的软件编程了。

2.4本章小结

本章主要介绍了在程序设计之前,我们需要用到的环境和工具,和他们的基本搭建方法。在配置完成了之后,还有一个必要的设置等着我们去设置,很显然就是创建安卓的模拟器了(AVD),让我们写的程序能够编译运行在我们自己所创建的模拟器上面,或者也可以不使用模拟器,还是直接使用真机来进行调试运行测试。以上的这几个设置虽然并不是很难实现,但这些设置是非常有必要的,可以说它们是整个应用开发的一个基础,如果我们没有对这些进行配置,那我们肯定什么都做不了,代码写了等于白写。从这一章节中,我们可以很明显的看出基础的重要性。

第三章相关技术介绍

3.1 JAVA概述

Java是一个跨平台应用软件编程语言,它可以写面向对象的编程语言Java技术具有优良的普遍性,并具有很大的优势,在网络的发展和移动电话的发展,它包括四个组件的术语:Java编程语言,java的文件格式,Java虚拟机(JVM)。

Java应用程序接口(Java API)。

Java的三大体系,分别为Java SE,J2EE,Java ME。

三大体系各有各的用途,而且使用起来都是非常的有好。

可以说,Java是当下非常流行的一种开发语言,除Java外还有其他流行的编程语言,他们之前各有千秋,关于它们之间的比较如下:

1.和JAVA有90%的一样的c#是Microsoft的一个产品,非常的有针对性,主要是用于对Windows的开发,C#用来写关于windows的编程还是非常不错的,但是它有一个非常不好的地方就是不支持夸平台。

2.简洁的解释性语言Ruby,是一款纯粹的面向对象编程语言,是一款弱类型的语言,就连变量都不需要去声明,所有的变量没有类型,就压根不看重类型这一概念,但是它提供了非常多方便的功能,特别的快捷,例如提闭包、代码块、迭代器和集合等等,它还是支持跨平台,只一点非常的好。

3.具有脚本语言中最丰富和强大的类库功能强大而完善的通用型语言Python,支持主流OS,具有可扩展行和清晰的语法特色,使用起来思路非常的清楚。

总的来说,像c,c++,c#那种的编程语言是属于编译语言的范畴,他需要专门的编译器来实现。

而像Ruby、Python语言这种类型的叫做解释类编程语言。将原文件解释称机器语言,直接让机器跑起来。

JAVA有这两种语言的特征,因此,它使用起来会非常方便,它需要经历编译但不会生成特定平台的机器码,它生成的时与平台无关的字节码文件。字节码文件需要JAVA解释器(JVM)来解释执行。

JVM相当于一台小计算机,和计算机一样有着很多的指令集,所有平台上的JVM向上提高给JAVA字节码程序的接口完全相同,但向下提供适应不同平台的接口。

故规定了JVM的这样一个标准、让java跨平台成为了可能。

JRE包含JVM。JVM是运行java程序的核心虚拟机。

JAVA语言严格区分大小写,有着严格的命名规范,如程序中关键字全部小写无需大写,类名第一字母大写,方法则

第一字母小写,包名全小写等。

除此之外,Java的方便之处还在于它的垃圾回收机制。

1.所谓垃圾回收只是针对内存资源,至于物力资源如数据库连接、IO读写等JVM无能为力,所有程序中需要显示释放

2.为了更快回收垃圾,可以将对象的引用变量设为null

3.垃圾回收具有不可预知性,即使调用了对象的finalize()System.gc()方法也不能确定何时回收,只是通知JVM而已

4.垃圾回收机制能精确标记活着的对象,能精确定位对象之间关系,前者是完全回收的前提,后者实现归并和复制等

5.现在JVM有多种不同的垃圾回收实现。

3.2安卓介绍

说到Android,大家的第一反应,肯定是手机,但其实安卓是一款操作系统,因为他经常用在手机上,所以很多人提到Android就自然联想到手机。关于Android操作系统,是这样子的:Android是Google公司,其实这一点,很多人都知道,但是有很多不知道,其实一开始Android不是由Google公司开发,Google只是在2005年的时候将它收购了,并且把它当成了一个重点的项目来做,成立相应的开发小组,一点点的将Android做大的。它在战胜塞班之后,又赢来了一个强劲的对手,那就是苹果公司的ios系统了。为了争夺市场,安卓平台也在不断的跟新中,目前安卓已经更新到了5.0了。 5.0正式推出以来,除了bug不断外,还是有很多亮点的。它多了一些新的东西,像Tap and Go,Tap and Go,Double tap to wake(双击唤醒设备),Double tap to wake(双击唤醒设备)等等,这些新的特性,还是相当不错的。

从理论性角度来看,Android它是在linux系统的基础上进行开发的,但他不能成为Linux系统,它有自己的特色,Android平台一般具有如下的特性:它允许重用和替换组建的应用程序框架,有专门的虚拟机。基于webkit的内置浏览器,自定义2D的UI效果,内置数据库,支持GSM通话,支持各种多媒体文件格式,还有蓝牙,EDGE,3G和WIFI等硬件的支持,还有吩咐的开发调试环境。 总之,Android是一款非常不错的操作系统。

3.3 Sqlite相关介绍

Sqlite是Android系统内置的一个轻量级的关系型数据库,它的运算速度十分的快,占用的资源也是非常的少,通常只需要几百K的内存,所以比较适合在移动设备上进行使用,sqlite支持标准的sql语法,只要你以前用过关系型的数据库,那么你就会很快上手sqlite。

3.4系统开发运行环境

操作系统:win XP或者win 7

开发环境:Eclipse集成开发环境

开发工具:SDK

开发语言:JAVA语言

3.6本章小结

这一章内容主要介绍了进行基于安卓电子书阅读器的开发过程中所用到的编程语言JAVA的介绍,以及对安卓这一平台的介绍,让我们更加清晰的认识安卓开发。

第四章系统的分析和设计

4.1需求分析

对于一个阅读应用来说,它最重要的一点就是能够实现阅读的功能,不能出现经常崩溃的情况,它还需要一个较好的用户体验

1)点击应用的图标进入软件之后,会像目前市面上的许多软件一样,有一个欢迎的界面出现,然后进入主体的程序界面。

2)当用户第一次安装此款应用的时候,会提醒用户如何使用这一软件应用。

3)当用户点击确实之后,用于显示软件信息的Dialog消失,呈现软件的主界面,例如ireader阅读软件的书架界面,用于选择所看的图书。也可以采用列表的形式进行本地书籍信息的显示。

4)当用户点屏幕中的图书信息时,软件就会跳转到该书籍的阅读界面,即文本内容的显示。

5)当然,在主体界面的时候,用户点击手机上的menu的物理按键,将会在界面的底部弹出相应的menu菜单,主要用于本地文件的选择导入,并伴随这其他相关的辅助功能。

6)在阅读界面的时候,可以进行翻页处理,使文字有规律的显示在屏幕上,方便阅读。

7)阅读过程中可以根据个人的需要,进行字体大小的调整。

8)关于本地导入功能,在点击本地导入按钮后,会进入其相应界面,通常可以按照手机自带的文件管理软件的界面形式进行显示,找到相应的文件后点击一样可以进入阅读状态,同时可以将该文件列入到书架之中,方便下次的阅读。

9)在书架界面中,可以对书籍信息长按进入长按菜单,在长按菜单中可以进行其他辅助功能的设计,方便对书架上的书籍进行有效的管理。

在设计这个项目时,总体的思路如下的流程图:

图4-1-1流程图

4.2模块的划分

在模块的划分方面,请参看图4-2所示的模块图:

图4-2-1总模块图

对这一整个项目做一个比较完整完善的分析只有,整个项目分成以下几个模块,亦如上图所示

1)书架模块:用来放置已被应用读取过的符合要求的电子书文件,并显示给用户,以方便用户点击查看,及完成相应操作。

2)管理模块:模仿市面上的电子书阅读软件,给每个电子书文件添加屏幕的长按点击事件,弹出相应的用于关于管理的对话框,对书架上的书籍进行有效的管理,主要管理功能包括删除选中的书籍,以及清理书架上所有的书籍。

3)导入模块:用于选择导入SD卡中的符合电子书格式的文件,并加入书架之中,当选择导入已经导入过的文件时会给出文件已经在暑假上的提醒,防止书架上的图书资源出现重复,给阅读带来不便。

4)阅读模块:显示文件的内容,即整个应用的核心部分。要想显示txt文本内容,就必须了解txt文本格式的编码方式。

一般来说,txt文件常用的编码方式有很多,ASCII码,unicode码等。

若文件直接以数据开头,不包含头信息,那么txt文件就是ASCII编码形式;文件开头是FF FF的话,是unicode编码,而三字节开头的编码分为UTF-16BE编码和UTF-8编码,前者是以FE FF 00开头,后者则是EF BB BF。

5)字体模块:用于设置字体,方便用户据阅读,可以将设定字体大小的相应函数通过与seekbar进行数值绑定,然后可以通过拖拉seekbar实现字体大小的调整。

6)书签模块:用于书签的管理。主要通过记录当前页面的第一个字符与最后一个字符记录到数据库当中,在对书签进行管理的时候,对书签条目的操作,即使对书签数据库的操作。

4.3模块详细介绍

4.3.1书架模块

书架模块的主要用的是用于摆放被软件识别的书籍。在这个书架的界面,可以针对这个一个界面来进行在书籍的名称的浏览,在通常的情况下,会将每一个扫描到得书籍一个item的形式放置在整个layout上面,而实现每一个item的放置,可以选择使用ListView或者是使用GridView,有了ListView组件之后,还需要对单个的item进行界面上的设计,按照ireader的界面做参考,每一个item会包含一个书籍封面感觉的图片资源,用来模拟真书摆放在真实书架位置上的效果,而在封面图片上面会有一个TextView,用来显示书籍的名字,方便用户进行书籍的选择。因为选择的是ListView的原因,需要在每个Item上面会放置放置三个书籍的位置,而这三个组件共同构成一个Item。关于存放书籍的组件,可以用三个textview存放,textview的文本用于显示书本的标题,并在该组件背后设置一张类似书籍封面的背景图片,让这一组件变得相对更像是一本书。

4.3.2管理模块

管理模块的主要作用显然就是管理整个书架了。原本,在设计的初期并没想到设计一个比较实用的管理上的相应功能,在后续的开发过程中,方面导入图书之后,书籍就会在书架上面显示出来,而导入图书非常多的话,真个书架的上的书籍也会变的非常的多,原来实现书架功能的原因就是为了简洁与美观,书架上书籍一多,还是会影响到实用方便程度,考虑到这一点,可以增加一个管理的模块,用于管理书架上的图书资源,让整个画面画面更加的简洁明了。

考虑到上方所讲到的书架模块已经是一个Activity了,如果我们再使用Activity来设计这一个管理模块的话,从书架这一块通过itent跳转至管理的Activity,在完成相应的管理操作之后,修改数据库,再回去到书架界面,并且要对ListView上面的内容进行刷新。这样一来,工作的量就会上去,而且软件的使用效率也受到很大的影响,而且严重影响到了使用的方便程度,所以在这里,我希望管理功能能书架这一个Activity上面完成,第一个想到得就是Dialog了,这边我们模仿ireader这一软件,在ListView上面进行一个长按的点击事件的设置,在相应的函数下方写一个Dialog,给Dialog几个相应的按钮,用来实现管理的主要功能,即删除书籍和清理书籍。

4.3.3导入模块

导入模块的主要功能是用于导入本地的书籍文件至书架。宏观上来说,导入界面是用来显示sd卡路径,最常见的显示方式,就是类似与普通的文件管理应用那样,以ListView的形式来进行显示,listview会将每一层路径下的所有的内容都显示在item上面,通过点击文件夹对应的item进入下一层路径,通过点击返回按钮,返回至当前路径的上一层。当有Txt文本格式的item出现,我们只要点击,就能进入该文本的阅读界面,并且这一文本会以事先约定的形式,显示在书架上,同时也会修改书架对应数据库的数据。

4.3.4阅读模块

显然,阅读模块只要的主要功能就是用显示文本的内容了,在这一模块之中,最重要的部分就是能够显示文字,而进行txt文本内容显示,首先要确定txt文本的编码方式,txt文本的最常见编码方式有ASCII编码,unicode编码,UTF-16BE,UTF-8等,所以在编写应用的时候,需要根据各种编码的规则用一个if对读入的文本进行编码方式的判定,让其能够正常显示文本的内容,不至于出现由于解码不对出现乱码而影响正常的文字阅读。除了解决了txt的解码工作之后,还需要解决的问题的就是文本的分页功能,因为txt文本阅读器通常情况下是用来阅读小说,或者其他内容非常多的文件,把这些文字显示在同一个屏幕是不可能的,所以这时候的分页功能就显得十分的重要了。就对当前市面上的电子书阅读软件研究来看,用滚动条的形式来做文字下拉,来进行不同版面的文字显示是很不方便的,操作起来十分的不舒服,会影响到阅读的舒适程度,这时候的触碰翻页功能就显得非常的重要了。

在常见的软件应用中,翻页功能会伴随着一些翻页动画,不同的翻页动画,对应的算法也是不一样的,如果我们不使用翻页动画的,会选择触摸一下屏幕跟换文字的内容,这样一来我们只需要一个加布就可以了。而如果我们选择平滑的方式的话,就可能在同一时间内,出现两个不同页面的文字内容,很显然这是我们需要两张画布,用来分别绘制不同页面上的文字。在选择模拟翻页动画形式的翻页实现时,我们会用到三个画布,两张用于绘制不同页面的文字,另一张用于绘制纸张的背面。

在这一样项目中,我选择了模拟真书翻页的效果,在对三张画布进行具体位置划分时我们会需要到一条平滑的曲线,或者一条直线,为了更好的视觉效果,我选择了贝塞尔曲线,然后通过一系列的数学方法求的整块区域上的各个点的坐标,然后绘制画布。

4.3.5字体模块

字体模块的主要功能就是用以调整在阅读过程中的是字体的大小。

在阅读界面时,通常手机物理按键的Menu菜单会设置相应的事件,显示对应的菜单项,在点菜单项内容后,显示相应的字体模块的界面。

这一模块相对来说还是比较简单的,在阅读中,显示文本内容是通过drawtext来实现的,在这里通常会涉及到画笔工具,通过调整画笔工具的大小,从来绘制出的字体大小也是不一样的,而画笔工具大小是支持动态调整,的,因为实现字体大小就是只需要写一个函数动态控制画笔工具的大小,然后对画面进行刷新重绘就可以了。

4.3.6书签模块

书签的功能主要作用当然是记录阅读的状态,所以该模块必定是在阅读模块的基础上实现,在阅读的过程中通过menu菜单的方式显示,当点书签相关的按钮后,可以弹出一个全充的dialog,在dialog里面放置一个listview用以放置书签条目。

在具体书签功能实现时,通过对当前页面前几个文字内容进行记录,并记录当前页面的第一个字是文本的第几个字,用于定位。得到这些信息之后,将这些信息内容存进数据库,在显示书签时,通过对数据库进行读取,来讲书签内容显示出来。

4.3.7主要技术难点分析

在这一整个项目中,会涉及到非常的内容显示的功能,包括书架的显示,目录的显示,以及书签的显示,这里的条目显示的功能都是同listview进行实现的。而listview也是android中最常用的组件之一,同时也是一个比较难的组件,因为他的使用涉及到适配器的写法。一般来说,我需要显示在item当中的内容一般不会是非常的简单的字符串,一般情况下单独item的内容就需要用一个layout来进行设计,当然item越复杂,适配器就越发的难些。

虽说listview比较难用,但是它整体上的用法都是一致的。首先创建listview组件,接着也是最重要的adapter的编写,正确编写玩adapter之后,就要在活动的oncreate方法中为listview组件创建并关联适配器,当能正常显示之后,便可以调用setOnItenmClickListener方法为item设置事件监听,用以相应相应操作

4.4本章小结

本章对电子书阅读软件进行了需求分析,在需求分析的基础上进行了各个模块的划分和设计,画了一些简单的模块图和整个程序的总的流程图。

第五章系统的实施

5.1书架模块

书架模块的主要用的是用于摆放被软件识别的书籍。并且可以在这一页面上面点击以实现不同的功能。在书架页面中,对书籍的操作操作大概分成以下几个部分:

1)轻点书籍的图片,应用自动打开对应的书籍,跳转至阅读的界面,以实现阅读的功能。

2)长按书籍的图片,会弹出一个dialog,这个dialog将会有两个按钮,一个是删除按钮,另一个是清空按钮,点击删除按钮,会从书架上删除当前点击的书籍及其在数据库中相应的数据,但不影响该文件在sd卡中的状态,文件已然存在于SD卡中。点击清空按钮,则会删除书架上的所有数目,同样影响数据库内的数据,但同样不会影响到文件在SD卡中的情况。

3)点击Menu按钮会从应用的底部弹出一个菜单栏,菜单栏上会有两项选择,第一项是“软件信息”的按钮,用于显示软件信息。第二项选择是“本地”按钮,点击本地按钮就会用intent跳转到本地导入的功能模块,完成本地导入的相关功能。

除了实现相应的功能外,该模块需要一个界面的设计,在android项目开发中,功能实现与UI设计往往是分离,在对上述功能的实现方式及大致的布局有一定了解之后,开始详细的设计整个模块的布局。

在布局设计之中,该页面使用线性布局,在这线性布局下,有一个imageview和一个listview,imageview的主要用途就是存放一个托片资源,这里我放置了一个软件的标题,这个标题采取的是图片的形式,标题的文字也是图片上的内容。再者,就是一个listview了,这个listview用于放置摆放书籍的各个item。然而每个item也会有一个layout,通常会根据实际的item内容编写相应的adapter,让item能够显示在listview上。

//这下方式逻辑的实现

//。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。//

public class ShelfActivity extends Activity{

ListView show;

MyAdapter adapter;

AlertDialog ShuomingDialog;

SharedPreferences sp_sm;

//。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。//

上面四行主要是定义一些将会使用到的变量。在点击软件之后,应用会进入welcome着一个活动中,这个活动主要就只有一个图片,显示部分软件信息,并作为欢迎页使用,在等待一小会之后,自动intent到Shelf activity上来,进入主题程序,在正式显示书架之前,会做一个判断,如果是用户第一次安装该应用,软件就会在welcome之后,在activity上直接弹出一个对话框,用于显示软件应用的具体信息,及相应的软件使用说明。为了实现这样的功能,就必须判断它是不是第一次打开,这里很显然会涉及到数据的操作,这里采用SharedPreference来实现。

//。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。//

@Override

protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

sp_sm=this.getSharedPreferences(“data”,MODE WORLD WRITEABLE);

boolean isFirst=sp_sm.getBoolean(“first”,true);

if(isFirst){

showShuomingDialog();

Init();

}else{

Init();

}

show=(ListView)findViewById(R.id.show);

}

//。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。//

上述代码实现了对是否为第一次打开应用做的判断,根据判断结果实现不同的分支。将这些判断放置在活动的onceate方法当中,就是为了在活动以来是的就进行是否为第一次打开的判断。用isfirst参数来表示其是否第一次,给isfirst初值设为第一次的对应即可,在软件运行时,在结束welcome之后,在第二个活动也就是shelfactivity创建的时候对isfirst值进行判断,若是第一打开,则调用showdialog函数,弹出设计好的对话框,显示软件信息及说明,并同时修改isfirst的值。

//对listview进行关联

//。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。//

@Override

protected void onResume(){

ArrayListlists=new ArrayList();

BookDao dao=new BookDao(this);

dao.open();

lists=dao.selectAll();

dao.close();

adapter=new MyAdapter(this,lists);

show.setAdapter(adapter);

super.onResume();

}

//。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。//

上述代码的主要用于将适配器和相对应的listview进行关联。这里借用一个arraylist将自定义类型bookbean存放,然后将参数list传给适配器,完成相应配置,最后与listview进行关联。

//。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。//

@Override

public boolean onKeyDown(int keyCode,KeyEvent event){

if(keyCode==KeyEvent.KEYCODE_BACK){

AlertDialog.Builder builder=new AlertDialog.Builder(this);

builder.setTitle(“提示”);

builder.setMessage(“确定退出吗”);

builder.setPositiveButton(“确定”,new OnClickListener(){

@Override

public void onClick(DialogInterface arg0,int arg1){

System.exit(0);

}

});

builder.setNegativeButton(“取消”,new OnClickListener(){

@Override

public void onClick(DialogInterface arg0,int arg1){

}

});

builder.show();

return true;

}

return super.onKeyDown(keyCode,event);

}

//。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。//

上方的内容主要是为了模拟市面上常见软件的功能实现,对手机物理按键(触屏按键)编写点击事件,让其产生一个对话框,询问是否退出应用。

//设计菜单按钮

//。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。//

public boolean onCreateOptionsMenu(Menu menu){

menu.add(0,1,0,“本地”);

menu.add(0,2,0,“软件信息”);

return true;

}

//。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。//

该段代码的主要用来创建menu菜单,是用户在点menu按钮时,从底部弹出对应的菜单项。

5.2管理模块

管理模块,很显然就对书架的上书籍进行管理这一部分的东西是在书架上进行操作的,更明确的说,是针对item的操作。如上一模块所述,管理模块的只要功能有两个,删除和清空。在书架模块中,已经实现item在listview中的正常显示,在对书籍项做管理时,只要对item做一个事件的响应就可以了。通常情况下,用户会不自觉的认为,单击是进入阅读功能,这里设计是也是如此设计,所以单击响应的监听器已经被占用,为实现管理功能,可以对item设置一个长按的点击事件监听器,与单击事件监听器区别开。用户在长按书籍按钮后,便会出现管理模块的相应功能。

以下是功能实现的相应代码

//。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。//

if(position0){

Bookbean bean=lists.get(j);

BookDao dao=new BookDao(context);

dao.open();

dao.deletes(bean.path);

dao.close();

lists.remove(bean);

notifyDataSetChanged();

dialog.dismiss();

}

//。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。//

else if(position1){

BookDao dao=new BookDao(context);

dao.open();

dao.deleteAll();

dao.close();

lists.clear();

notifyDataSetChanged();

dialog.dismiss();

}

}

}

//。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。//

5.3导入模块

导入模块,顾名思义,实行是本地的导入的功能,导入本地的txt文件,并将它放置在书架上方便下次的阅读。导入功能的界面是类似一个文件管理软件店额界面形式,在整个界面的上会放置一个button,用于点击返回使用,在button的右侧则是一个textview,在这个textview当中会显示出当前是处于SD卡的一个什么位置。在button和textview的下就是一个最常见的控件–listview,这里的listview不像书架模块那个listview每个item会放置三个显示书籍信息的textiew,而是像一个横向摆放的imageview和textview,而这两者是显示路径下文件或者文件夹的信息的。

//。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。//

public long insert(String table,ContentValues values){

return db.insert(table,null,values);

}

//。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。//

public Cursor query(String table,String[]colmans){

return db.query(table,colmans,null,null,null,null,null);

}

//。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。//

public boolean exists(String table,String id,String path){

boolean isexists;

Cursor cur=db.query(table,new String[]{id},id+“=?”,

new String[]{path},null,null,null);

if(cur.moveToFirst()){

isexists=true;

}else{

isexists=false;

}

cur.close();

return isexists;

}

//。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。//

5.4阅读模块

阅读模块的主要功能涉及的是drawtext的相关应用,以及对文本格式的解析工作,以及数据的相关的处理。

首先在开始功能实现之前,依然是一些界面上的设置,例如字体的大小,字体的颜色,阅读的背景文字距离整个边界的距离。在基本设定设置完了之后,就是对文字显示功能的实现。这里采用drawtext的方式实现。关于该模块中翻页动画功能的实现用到一点几何数学的知识。整个翻页的过程是这样子的:

当用户翻页的时候,手指会触摸到屏幕进行滑动,手指会和屏幕上有一个接触点,在接触点的位置是掀起来页面的页脚,为了讲解方便我们可以将设翻页是一个三角形的形式进行,而接触点与屏幕的角对应点必然是关于折痕轴对称的,这样就可以对称关系及数学中解三角和坐标运算,求得折痕与屏幕交点的具体坐标。求出相应的坐标后,会得到三个区域,再对三个区域绘制不一样的内容,翻页过程中的某一静态时刻的状态就呈现了出来,最后通过刷新不断变化的触摸点,就形成翻页的动画效果。

该模块核心的代码:

//读取下一段落

//。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。//

protected byte[]readParagraphForward(int nFromPos){

int nStart=nFromPos;

int i=nStart;

byte b0,b1;

//。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。//

因为要显示的是txt文件中的内容,这里需要对txt文件的编码方式进行一下判断,针对不同的编码方式做出不同解码操作,让正确的文本的内容通过画笔工具绘制到画布中。

if(m_strCharsetName.equals(“UTF-16LE”)){

while(i

b0=m_mbBuf.get(i++);

b1=m_mbBuf.get(i++);

if(b00x0a&&b10x00){

break;

}

}

}else if(m_strCharsetName.equals(“UTF-16BE”)){

while(i

b0=m_mbBuf.get(i++);

b1=m_mbBuf.get(i++);

if(b00x00&&b10x0a){

break;

}

}

}else{

while(i

b0=m_mbBuf.get(i++);

if(b0==0x0a){

break;

}

}

}

int nParaSize=i-nStart;

byte[]buf=new byte[nParaSize];

for(i=0;i

buf[i]=m_mbBuf.get(nFromPos+i);

}

return buf;

}

//。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。//

5.5字体模块

字体模块的实现相对来说比较简单,只需要对记录自己大小的变量的进行改变,就可以了。

主要代码:

//设置字体大小

//。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。//

public void setTextSize(int a){

this.m_fontSize=a;

mPaint.setTextSize(a);

mLineCount=(int)(mVisibleHeight/m_fontSize);

m_lines=pageDown(true);

edit.putInt(“size”,a);

edit.commit();}

//。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。//

5.6书签模块

书签模块很显然实在阅读界面都额时候调出的,和上一模块一样,书签模块是靠menu菜单来显示相应的操作,因此需要在阅读界面的时候为menu按键添加事件响应函数,并添加三个菜单项,第一个是上一模块的字体大小调整的按钮,第二个是添加书签的按钮,当用户点该菜单按钮界面不会出现很大的变化,不一会,在屏幕上就会弹出用于提醒添加是否成功的文字,这里文字提醒的功能,可以很简单的使用Toast.maketext的方法进行实现,当然这不是简单的提醒一下,点击添加之后,会在数据库添加一条数据。第三个菜单是我的书签按钮,类似一个书签的图书馆,点击我的书签按钮后,会在当前届面即阅读界面显示出一个对话框,对话框会有已经存在与数据库当中的书签数据,通过listview的形式显示在这个对话框当中,针对对话框中书签条目我们可以做删除等管理性质的操作,删掉我们不需要的,留下重要的。

主要代码:

//。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。//

case 2:

SQLiteDatabase db=markhelper.getWritableDatabase();

try{

db.execSQL(“insert into markhelper(begin,word)values(?,?)”,new String[]{begin+“”,word});

db.close();

Toast.makeText(this,“书签添加成功”,Toast.LENGTH_SHORT).show();

}catch(SQLException e){

Toast.makeText(this,“该书签已存在”,Toast.LENGTH_SHORT).show();

}catch(Exception e){

Toast.makeText(this,“添加书签失败”,Toast.LENGTH_SHORT).show();

}

break;

//。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。//

上述的代码是添加书签的相关功能实现。这段文字下方的代码则是显示我的书签的功能的具体实现,这两个方法分别属于两个case之中,通过点击menu菜单的不同大判断进入不同case之中,以实现不同的功能。

//。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。//

SQLiteDatabase dbSelect=markhelper.getReadableDatabase();

String col[]={“begin”,“word”};

Cursor cur=dbSelect.query(“markhelper”,col,null,null,null,null,null);

int num=cur.getCount();

if(num==0){

Toast.makeText(this,“您还没有书签”,Toast.LENGTH_SHORT).show();

}else{

ArrayListmarkList=new ArrayList();

while(cur.moveToNext()){

String s1=cur.getString(cur.getColumnIndex(“word”));

int b1=cur.getInt(cur.getColumnIndex(“begin”));

int p=0;

int count=10;

MarkVo mv=new MarkVo(s1,p,count,b1);

markList.add(mv);

}

mDialog=new MarkDialog(this,markList,mHandler,R.style.FullHeightDialog);

mDialog.setCancelable(false);

mDialog.setTitle(“我的书签”);

mDialog.show();

}

dbSelect.close();

cur.close();break;

//。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。//

5.7本章小结

这一章节,主要介绍了安卓电子书应用软件的设计开发过程中的各个功能部件的具体实现,以及是实现这些功能模块过程中遇到的技术难点的分析,在进行逐个模块的设计分析的同时,详细阐述了部分重要的细节的实现的原理,并附上了功能实现的核心代码。

第六章系统的测试

6.1系统的测试

在需求分析,模块划分,模块设计,歌模块功能具体代码实现,以及最后整体系统的整合过后,需要对设计开发的应用进行测试。测试在整个开发中是一个不可缺少的环节,只有通过软件的测试,才会最终确定编码实现的系统是不是真的能够无障碍的运行。一个软件最重要的就是能够非常稳定的运行,在用户使用的软件进行不同操作的时候也能保证系统的稳定及功能的完整。

这里对这个项目进行测试的主要目的有三个,第一,软件能否正常的运行,第二,查看软件最终实现的功能与设计的软件功能是否一致。第三,在测试过程看看实现的功能当中,会不会出现莫名其妙的bug。

一下是本次项目测试的具体内容及相应额结果:如图6-1所示:

打开应用的跳出软件欢迎的界面

图6-1软件欢迎界面

这个界面在每一次打开软件的时候都会出现,在等待几秒过后就会消失,这个也页面是一个活动,在正常情况下,需要在这个活动跳转到下一个活动的时候就将其销毁,因为欢迎界面只需要出现一次,如果不销毁的话,可能会在之后的操作继续出现该页面,这样一来就会先的十分的奇怪。

进过侧说证实了该页面确实只出现了一次,该活动在跳转完就销毁了。符合设计要求。如图6-2所示:

欢迎界面结束后的书架界面

图6-2初次运行的书架界面

设计的时候会在初次运行软件应用的时候自动跳出软件说明等信息。如上图所示,该功能实现,一切正常。点击我知道了后,出现如下的书架显示界面。如图6-3所示:

正常的书架界面

图6-3书架界面

在该界面点击手机的menu出现menu菜单,如图6-4所示:

书架菜单界面:

图6-4书架菜单界面

点击软件信息按钮,出现图6-2的软件信息界面,并无异常出现,重复操作只图6-4界面后点本地按钮进入本地导入的功能界面,如图6-5所示:

本地导入功能界面

图6-5导入界面

导入功能中的listview的显示,没有任何问题,在这里通过滑动找到软件所支持的txt文件,点击后会进入到阅读界面:如图6-6所示:

图6-6阅读界面

接下在阅读界面进行字体大小,书签的相关功能测试,如图6-8 6-10所示:

图6-7阅读菜单界面图 6-8字体大小调整界面

图6-9添加书签界面 图6-10书签界面

阅读界面的相关功能未见异常。测试完以上功能后,还剩下管理模块的功能未进行测试及防止误操作的退出提醒。为能测试这两个功能,点击手机的返回键,返回至书架界面,继续完成测试,如图6-11 ,6-12所示:

图6-11管理界面图 6-12退出提醒界面

进过一系列的测试之后,发现这个应用软件的稳定还是比较好的,流畅也还不错,整个测试工作基本完成。该软件通过了测试。

6.2本章小结

本章详细的介绍了对安卓阅读器的测试过程以及测试中遇到和解决的一些问题。并且在软件测试的过程中我了解了对于一个软件来说,软件测试是多么的重要。通过一步步测试,对该项目的每个功能实现程度有了具体的了解。

结论

在这次对安卓平台下电子书阅读器的设计与开发的过程,让我学习了java编程,了解到了它的方便,同学习到了当下较火的系统平台安卓的相应开发技术,也让我体会到真正开发过程中可能会遇到的各种各样的问题,以及如果去尝试解决,体会会在实际开发过程中帮助文档的重要性。

这一次的毕业设计的经历,让我弥补了大学毕业设计之前开发经验较少的遗憾,也是自己做的第一个比较大一点的开发项目。从中学到许多。

通过这次毕业设计使我明白了自己原来知识还比较欠缺。自己要学习的东西还很多,学习是一个长期积累的过程,在以后的工作、生活中都应该不断的学习,努力提高自己的知识和综合素质。但从中我也学到了很多知识,更培养了我独立工作与思考的能力,激发了我的创新意识。使我充分体会到了在创造过程中的探索的艰难和成功的喜悦。虽然这个项目还不是很完善,但是在设计过程中所学到的东西是这次毕业设计的最大收获和财富,使我终身受益。经过实际情况证明,这套系统设计采用接收模块和发射模块的方法很好,从而降低了硬件成本,简化了硬件结构。此系统还需要进一步研究和改进,这就需要我们不断的学习专业知识和提高实践操作能力,为在以后的工作中打下坚实的基础。