基于android手機(jī)電子書閱讀器的設(shè)計(jì)與實(shí)現(xiàn)_第1頁
基于android手機(jī)電子書閱讀器的設(shè)計(jì)與實(shí)現(xiàn)_第2頁
基于android手機(jī)電子書閱讀器的設(shè)計(jì)與實(shí)現(xiàn)_第3頁
基于android手機(jī)電子書閱讀器的設(shè)計(jì)與實(shí)現(xiàn)_第4頁
基于android手機(jī)電子書閱讀器的設(shè)計(jì)與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩47頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、鄭州大學(xué)畢業(yè)設(shè)計(jì)(項(xiàng)目報(bào)告)題 目: 電子書閱讀器的設(shè)計(jì)與實(shí)現(xiàn) 指導(dǎo)教師: 張淑艷 職稱: 講師 學(xué)生姓名: 王明 學(xué)號(hào): 20117740444 專 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù)(軟件測(cè)試) 院(系): 軟件學(xué)院 完成時(shí)間: 2014 年 12 月 2014 年 12 月 29 日目錄目錄摘要摘要.11 項(xiàng)目開發(fā)目標(biāo).1項(xiàng)目來源.1開發(fā)目標(biāo).12 項(xiàng)目總體設(shè)計(jì).2技術(shù)框架設(shè)計(jì).2數(shù)據(jù)庫設(shè)計(jì).2功能框架設(shè)計(jì).53 項(xiàng)目功能描述.8軟件歡迎界面模塊功能描述.8主界面功能描述.10書籍管理模塊功能描述.12文件瀏覽模塊功能描述.16閱讀管理模塊功能描述.203.5.1 章節(jié)管理模塊功能描述.243.5.

2、2 書簽管理模塊功能描述.273.5.3 搜索管理模塊功能描述.28設(shè)置管理模塊功能描述.293.7 使用幫助模塊功能描述.353.8 關(guān)于模塊功能描述.364 項(xiàng)目技術(shù)總結(jié).38技術(shù)創(chuàng)新及特點(diǎn).38個(gè)人收獲與體會(huì).44致謝.44摘要摘要在這個(gè)快節(jié)奏的時(shí)代,人們的空余時(shí)間越來越零碎,而且人們對(duì)智能 的依賴越來越重,所以,一個(gè)擁有豐富功能且能隨時(shí)進(jìn)行電子書閱讀的電子書閱讀器的出現(xiàn),則是我們刻不容緩的事情。此軟件是在 Android 平臺(tái)上進(jìn)行設(shè)計(jì)開發(fā),此軟件的開發(fā)是通過了客戶需求分析階段以及技術(shù)可行性分析階段,然后進(jìn)行總體設(shè)計(jì)階段和詳細(xì)設(shè)計(jì)編碼等階段。此軟件不僅具有基本的電子書閱讀功能,而且還擁

3、有豐富的實(shí)用功能設(shè)計(jì),例如目錄自動(dòng)生成以及閱讀界面設(shè)置、閱讀休息提醒等。經(jīng)過不斷的測(cè)試與完善,電子書閱讀器功能穩(wěn)定,并且在真機(jī)上對(duì)其進(jìn)行了測(cè)試與驗(yàn)證,基本上達(dá)到了用戶的需求標(biāo)準(zhǔn)。關(guān)鍵字:電子書閱讀器關(guān)鍵字:電子書閱讀器, Android,文件瀏覽文件瀏覽,書架書架 1 1 項(xiàng)目開發(fā)目標(biāo)項(xiàng)目開發(fā)目標(biāo)此次開發(fā)的項(xiàng)目是 電子書閱讀器,屬于自選項(xiàng)目。隨著社會(huì)的發(fā)展,人們的生活節(jié)奏也越來越快空閑時(shí)間也越來越零碎,人們沒有了大段的時(shí)間來進(jìn)行書籍的閱讀,所以一款能利用零碎時(shí)間進(jìn)行隨時(shí)閱讀的軟件成為了我們的需求。而一款能在人們隨身攜帶的 上運(yùn)行的閱讀軟件成為了大家的選擇。以前我們看看雜志,小說都要去圖書館借閱

4、,而且時(shí)間有限,很不方便;而在電腦上看雜志,看小說,文檔也是很不方便的。以此看來,一個(gè)好的 閱讀器軟件的開發(fā)是相當(dāng)有必要的。 電子書閱讀器的開發(fā)目標(biāo)就是讓用戶可以把零碎的空余時(shí)間有效的利用到書籍的閱讀上,而且用戶在沒有網(wǎng)路的情況下也可以正常的進(jìn)行書籍的閱讀,讓用戶擺脫書籍的笨重?cái)y帶不方便等確定,給予閱讀者更大的便利性更好的舒適性。此軟件是在 Android 平臺(tái)上進(jìn)行設(shè)計(jì)開發(fā),它的界面豐富簡(jiǎn)潔但是卻不簡(jiǎn)單,它包含了書架界面、文件查看界面、軟件設(shè)置界面、書籍閱讀界面等界面,它的功能全面。其優(yōu)越性表現(xiàn)在:自動(dòng)掃描 里的所有書籍、手動(dòng)從文件夾中選擇添加書籍、自動(dòng)為書籍生成章節(jié)目錄、添加查看書簽、全文

5、關(guān)鍵詞搜索、閱讀主題選擇、閱讀字體大小設(shè)置等功能。此外,給用戶更清晰方便的界面,也是本軟件的出發(fā)點(diǎn)之一。2 2 項(xiàng)目總體設(shè)計(jì)項(xiàng)目總體設(shè)計(jì) 電子書閱讀器采用了常見的三層架構(gòu),分別為 UI 層、業(yè)務(wù)邏輯層和數(shù)據(jù)層。UI 層:數(shù)據(jù)展示與管理、用戶交互、繪制、Adapter。業(yè)務(wù)邏輯層:數(shù)據(jù)加式(數(shù)據(jù)層的數(shù)據(jù)有時(shí)候需要進(jìn)行加工成 UI 層需要的數(shù)據(jù)) 、數(shù)據(jù)變化的通知機(jī)制數(shù)據(jù)層:數(shù)據(jù)訪問(SQLite、文件等) 、緩存(圖片、文件等) 、配置文件(shared perference)此軟件的開發(fā)環(huán)境:Windows7 + Eclipse4.2.0 + SDK。UI ViewsData AdapterU

6、 UI IBLData ObserverB BL LFileSQLiteData ProviderMemory CacheLocal DataUtil/ConfigDataData圖 1 軟件框架結(jié)構(gòu)E-R 圖是直觀表示概念模型的工具,它有四個(gè)基本成分:矩形框,表示實(shí)體類型。菱形框,表示聯(lián)系類型。橢圓形框,表示實(shí)體類型和聯(lián)系類型的屬性。對(duì)于關(guān)鍵碼的屬性,在屬性名下劃一橫線。直線,聯(lián)系類型與其涉及的試題類型之間以直線連接。書 書書 書 書 書書 書 書 書書 書 書 書書 書 書 書書 書 書 書書 書 書 書書 書 書 書書 書書 書 書 書書 書 書 書書 書 書 書書 書 書 書n n書

7、書 書 書書 書 書 書1 1書 書 書 書圖 2 ER 圖數(shù)據(jù)庫使用了 2 個(gè)實(shí)體,分別為書籍、書簽。書籍與書簽的對(duì)應(yīng)關(guān)系為 1:n。在數(shù)據(jù)庫的設(shè)計(jì)方面,為了實(shí)現(xiàn)數(shù)據(jù)庫的完整性與一致性,我們使用了觸發(fā)器,在數(shù)據(jù)庫的選用上,選擇了自給自足的、無服務(wù)器的、零配置的、事務(wù)性的 SQL 數(shù)據(jù)庫引擎的 SQLite 數(shù)據(jù)庫,數(shù)據(jù)庫名稱為 eBook.db,共 2 個(gè)實(shí)體表,分別為書籍表、書簽表。與書籍(books)實(shí)體類的屬性信息對(duì)應(yīng)的字段信息表如表 1 所示:字段名類型說明book_idINTEGER書籍編號(hào)book_nameTEXT書籍名稱book_pathTEXT書籍路徑file_sizeTEX

8、T書籍大小last_readDATETIME閱讀時(shí)間book_shelfINTEGER所屬書籍read_percentageDOUBLE已讀比例posINTEGER閱讀位置表 1 書籍表書籍表(books)創(chuàng)建的 SQL 語句:CREATE TABLE books (book_id INTEGER PRIMARY KEY,book_name TEXT NOT NULL, book_path TEXT NOT NULL UNIQUE, file_size TEXT, last_read DATETIME DEFAULT(datetime(CURRENT_TIMESTAMP,localtime),

9、book_shelf INTEGER,read_percentage DOUBLE DEFAULT 0,pos INTEGER DEFAULT 0 ); 與書簽(bookMarks)實(shí)體類的屬性信息對(duì)應(yīng)的字段信息表如表 2 所示:字段名類型說明idINTEGER書簽編號(hào)book_idINTEGER書籍編號(hào)percentDOUBLE位置比例contentTEXT書簽內(nèi)容posINTEGER書簽位置timeDATETIME添加時(shí)間表 2 書簽表書簽表(bookMarks)創(chuàng)建的 SQL 語句: CREATE TABLE bookMarks ( id INTEGER PRIMARY KEY AUTO

10、INCREMENT,book_id INTEGER,percent DOUBLE,content TEXT, pos INTEGER, time DATETIME DEFAULT ( datetime( CURRENT_TIMESTAMP, localtime ); 觸發(fā)器(fk_Delete)創(chuàng)建 SQL 語句:CREATE TRIGGER fk_Delete BEFORE DELETE ON booksFOR EACH ROWBEGINDELETEFROM bookMarksWHERE book_id = old.book_id;END密碼管理章節(jié)管理文件掃描手機(jī)電子書閱讀器閱讀管理文本搜

11、索書簽管理清空書簽刪除書簽書籍管理系統(tǒng)設(shè)置文件瀏覽添加書簽調(diào)節(jié)亮度主題選擇修改密碼取消密碼設(shè)置密碼生成章節(jié)刪除章節(jié)加入書籍重新掃描標(biāo)記文件退出確認(rèn)隱藏文件添加書籍清空書架分類排序添加書籍標(biāo)記文件文件排序夜間模式字體大小翻頁模式幫助關(guān)于歡迎模塊設(shè)置管理閱讀設(shè)置連續(xù)閱讀自動(dòng)歸類休息提醒空閑退出主界面圖 3 功能模塊圖 電子書閱讀器軟件主要分為 8 個(gè)功能大模塊如圖 3 所示,分別是歡迎模塊、軟件主界面、書籍管理、閱讀管理、文件瀏覽、系統(tǒng)管理、使用幫助、關(guān)于。其中書籍模塊中還要文件掃描模塊,閱讀管理中有章節(jié)管理、書簽管理、搜索管理。系統(tǒng)設(shè)置中有密碼設(shè)置。其各個(gè)模塊的詳細(xì)設(shè)計(jì)如下:1.軟件歡迎模塊。該

12、模塊主要實(shí)現(xiàn)的功能是,通過 Handler 來實(shí)現(xiàn)一個(gè) 2 秒的緩沖界面,然后通過 SharedPreferences 讀取配置文件,判斷是否有密碼。如果有密碼則跳轉(zhuǎn)至密碼驗(yàn)證界面;如果沒有密碼則判斷是否為第一次使用此軟件,如果是第一次使用則跳轉(zhuǎn)至引導(dǎo)頁面。2.軟件主界面模塊。該模塊是一個(gè)通過 TabHost 標(biāo)簽組件來實(shí)現(xiàn)的一個(gè)分類管理功能。本界面的標(biāo)簽在屏幕的最下方,分別是:文件管理、我的書架、我的設(shè)置。點(diǎn)擊不同的標(biāo)簽則顯示不同的界面,默認(rèn)顯示標(biāo)簽為“我的書架”,打開選項(xiàng)中會(huì)出現(xiàn)對(duì)應(yīng)的視圖。實(shí)現(xiàn)了將本程序關(guān)聯(lián)成 默認(rèn)打開程序中,即從外部打開文本文件時(shí)選擇查看方式中會(huì)出現(xiàn)本軟件圖標(biāo)供用戶選擇

13、以本軟件打開。3.書籍管理。該模塊是以書架的模式來展現(xiàn)書籍,并可以對(duì)書籍進(jìn)行一些操作,本模塊共有 3 個(gè)書架分別為:“最近閱讀” 、 “歷史閱讀” 、 “收藏閱讀” ,默認(rèn)顯示是“最近閱讀”書架。本模塊有導(dǎo)航按鈕和書籍選擇按鈕。當(dāng)彈出導(dǎo)航欄時(shí),則把書籍從每行顯示三本書籍調(diào)整到每行顯示兩本書籍。導(dǎo)航欄中與三大項(xiàng):分類排序、添加書籍、清空書籍。每項(xiàng)里面又有子菜單。當(dāng)點(diǎn)擊導(dǎo)航里的按鈕時(shí)會(huì)顯示子功能導(dǎo)航,當(dāng)再點(diǎn)擊其它按鈕時(shí),會(huì)收起前面的子功能導(dǎo)航,展開當(dāng)前的子功能。當(dāng)單擊書籍選擇按鈕時(shí)會(huì)彈出書籍選擇窗口,選擇里面的書架則進(jìn)入相應(yīng)的書架界面,同時(shí)還可以通過左右滑動(dòng)來切換書架界面。當(dāng)單擊書籍時(shí)會(huì)打開相應(yīng)的

14、書籍閱讀界面,長按某書籍時(shí)會(huì)彈出書籍操作窗口。4.文件瀏覽。該模塊使用 ListView 組件顯示文件目錄,不同的文件類型顯示不同的圖標(biāo)。最上面標(biāo)題欄有導(dǎo)航按鈕,當(dāng)點(diǎn)擊導(dǎo)航按鈕時(shí)會(huì)從左側(cè)彈出導(dǎo)航欄,導(dǎo)航欄中有標(biāo)記文件按鈕、分類排序按鈕和添加到書架按鈕,點(diǎn)擊標(biāo)記文件按鈕或長按某文件或目錄時(shí)則切換到多選模式,其中有多選按鈕、反選按鈕和取消按鈕;點(diǎn)擊分類排序則彈出子菜單,其中有按名稱排序、按大小排序、按時(shí)間排序和按類型排序;點(diǎn)擊添加到書架時(shí)如果為選擇文件則自動(dòng)進(jìn)入多選模式讓用戶進(jìn)行文件選擇,如果用戶未選擇則提示“請(qǐng)選擇書籍” ,進(jìn)行選擇是用戶可選擇文件或目錄,系統(tǒng)會(huì)自動(dòng)進(jìn)行掃描,把符合要求的文件添加

15、到“最近書架”中,并彈出提示信息,其中有失敗個(gè)數(shù)、已存在個(gè)數(shù)和成功個(gè)數(shù)。在多選模式下點(diǎn)擊返回按鈕或點(diǎn)擊標(biāo)記文件會(huì)取消多選模式。非多選模式下,用戶點(diǎn)擊文件時(shí)本軟件會(huì)根據(jù)文件擴(kuò)展名來判斷打開文件方式,如果是文本文件則直接用本軟件打開,并把其添加到“最近書架”中,其它格式則調(diào)用對(duì)應(yīng)的軟件打開,如果是未識(shí)別的類型則提示“沒有打開此文件的應(yīng)用” 。5.閱讀管理。該模塊通過自定義一個(gè) View 視圖來顯示書頁,通過自定義類來讀取文本內(nèi)容并通過 onDraw()方法把文件名、文本內(nèi)容、電量信息、時(shí)間信息和已讀百分比進(jìn)行繪制成圖片,并通過 View 來把繪制的圖片顯示出來。第一次進(jìn)入閱讀頁面是會(huì)有顯示引導(dǎo)頁面

16、來指導(dǎo)用戶如何讀本頁面進(jìn)行操作。本頁面操作包括點(diǎn)擊事件和滑動(dòng)事件,點(diǎn)擊左側(cè)屏幕進(jìn)行向上翻頁,點(diǎn)擊右側(cè)屏幕進(jìn)行向下翻頁,點(diǎn)擊屏幕中間畫出菜單選項(xiàng)。此菜單是使用 PopupWindow 組件實(shí)現(xiàn),菜單分上下兩部分,上面的菜單有返回按鈕、屏幕亮度調(diào)節(jié)按鈕和添加書簽按鈕;下面的菜單有主題選擇按鈕、搜索按鈕、書簽按鈕、目錄按鈕、字體大小調(diào)節(jié)按鈕、翻頁方式按鈕、夜間模式切換按鈕和退出軟件按鈕。6.系統(tǒng)設(shè)置。系統(tǒng)設(shè)置模塊包括閱讀設(shè)置和系統(tǒng)設(shè)置。閱讀設(shè)置中有連續(xù)閱讀模式、閱讀完成時(shí)自動(dòng)歸類、閱讀休息提醒和閱讀空閑退出。連續(xù)閱讀模式:下次啟動(dòng)直接進(jìn)入上次閱讀的界面進(jìn)行繼續(xù)閱讀;閱讀完成時(shí)自動(dòng)歸類:當(dāng)書籍閱讀到最

17、后一頁后對(duì)此書籍自動(dòng)移至“歷史閱讀”書架中;閱讀休息提醒:設(shè)置一個(gè)時(shí)間,當(dāng)用戶在閱讀頁面停留至這個(gè)時(shí)間時(shí)會(huì)彈出個(gè)提示框來提醒用戶進(jìn)行休息;閱讀空閑退出:設(shè)置一個(gè)時(shí)間,當(dāng)用戶停留在閱讀界面并且為對(duì)其未進(jìn)行任何操作至這個(gè)時(shí)間時(shí),系統(tǒng)會(huì)自動(dòng)關(guān)閉本軟件。系統(tǒng)設(shè)置中有顯示隱藏文件、使用軟件密碼、退出確認(rèn)、使用幫助和關(guān)于。顯示隱藏文件:當(dāng)用戶選擇此設(shè)置后會(huì)在下次啟動(dòng)本軟件時(shí)在文件瀏覽中顯示隱藏文件;使用軟件密碼:用戶可以對(duì)此軟件進(jìn)行密碼設(shè)置;退出時(shí)確認(rèn):當(dāng)選擇此設(shè)置后,退出軟件時(shí)會(huì)顯示一個(gè)確認(rèn)框進(jìn)行退出確認(rèn),未選擇此設(shè)置時(shí)則會(huì)直接退出本軟件;使用幫助:顯示本軟件的幫助信息;關(guān)于:顯示關(guān)于本軟件的信息。本軟

18、件的設(shè)置信息全部使用 SharedPreferences 存儲(chǔ)。7.使用幫助。該模塊通過讀取幫助文件在 TextView 中顯示,并且為TextView 添加滾動(dòng)條。文件中含有本軟件的特點(diǎn)、功能介紹、操作說明等, 。8.關(guān)于。該模塊的主要功能是通過一個(gè)簡(jiǎn)單的彈出窗口來顯示本軟件的版本信息、聯(lián)系方式。3 3 項(xiàng)目功能描述項(xiàng)目功能描述圖 4 所示為歡迎界面模塊,此模塊作用是為了使軟件的進(jìn)入更連貫自然,讓用戶不感覺界面的出現(xiàn)突兀。兩秒后跳入其它頁面,如果有密碼跳入密碼驗(yàn)證頁面如圖 6 所示,如果是第一次啟動(dòng)跳入引導(dǎo)頁面如圖 5 所示。 圖 4 歡迎界面圖 5 引導(dǎo)界面 圖 6 密碼驗(yàn)證界面關(guān)于歡迎頁

19、面啟動(dòng)的代碼如下:new Handler().postDelayed(new Runnable() Overridepublic void run() Intent intent=null;initSaveData();/判斷是否有密碼if(share.getString(mi_ma, ).equals()/判斷是否為第一次啟動(dòng)if(share.getBoolean(first, true) edit.putBoolean(first, false);edit mit();intent = new Intent(WelcomeActivity.this,GuideMain.class);els

20、eintent = new Intent(WelcomeActivity.this,ActivityMain.class);elseintent = new Intent(WelcomeActivity.this, GestureVerifyActivity.class);intent.putExtra(from_activity, 0);startActivity(intent);finish();, 2000);關(guān)于引導(dǎo)界面滑動(dòng)事件代碼:Overridepublic boolean onTouch(View v, MotionEvent event) switch (event.getAc

21、tion() case MotionEvent.ACTION_DOWN: / 手指按下的 X 坐標(biāo)downX = event.getX();break;case MotionEvent.ACTION_UP: float lastX = event.getX();/ 抬起的時(shí)候的 X 坐標(biāo)大于按下的時(shí)候就顯示上一張圖片if (lastX downX) if (currentPosition 0) / 設(shè)置動(dòng)畫,mImageSwitcher.setInAnimation(AnimationUtils.loadAnimation( getApplication(), R.anim.left_in);

22、mImageSwitcher.setOutAnimation(AnimationUtils.loadAnimation( getApplication(), R.anim.right_out);currentPosition-;mImageSwitcher.setImageResource(imgIdscurrentPosition% imgIds.length);setImageBackground(currentPosition); else Toast.makeText(getApplication(), 向右滑動(dòng), Toast.LENGTH_SHORT).show();if (last

23、X downX) if (currentPosition imgIds.length - 1) mImageSwitcher.setInAnimation(AnimationUtils.loadAnimation(getApplication(), R.anim.right_in);mImageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(getApplication(), R.anim.left_out);currentPosition+;mImageSwitcher.setImageResource(imgIdscurrentP

24、osition);setImageBackground(currentPosition); else Intent intent = new Intent(GuideMain.this, ActivityMain.class);startActivity(intent);finish();break;return true;通過 xml 設(shè)置引導(dǎo)頁面動(dòng)畫,代碼如下(以向左滑動(dòng)為例): 圖 7 所示是軟件的主頁面,這是一個(gè)通過 TabHost 標(biāo)簽組件來實(shí)現(xiàn)的一個(gè)分類管理功能。本界面的標(biāo)簽在屏幕的最下方,分別是文件管理、我的書架、我的設(shè)置。點(diǎn)擊不同的標(biāo)簽則顯示不同的界面,默認(rèn)顯示標(biāo)簽為我的書架,

25、打開選項(xiàng)中會(huì)出現(xiàn)對(duì)應(yīng)的視圖。實(shí)現(xiàn)了將本程序關(guān)聯(lián)成 默認(rèn)打開程序中,即從外部打開文本文件時(shí)選擇查看方式中會(huì)出現(xiàn)本軟件圖標(biāo)供用戶選擇以本軟件打開。圖 7 軟件主界面初始化選項(xiàng)卡代碼如下:private void initTabs() myTabHost = (TabHost) findViewById(R.id.TabHost1);myTabHost.setup(this.getLocalActivityManager();/添加文件管理選項(xiàng)myTabHost.addTab(myTabHost.newTabSpec(tab_file).setIndicator(composeLayout(文件管理

26、, R.drawable.folders).setContent(new Intent(this, FileExplorerActivity.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);/添加我的書架選項(xiàng)myTabHost.addTab(myTabHost.newTabSpec(tab_books).setIndicator(composeLayout(我的書架, R.drawable.books).setContent(new Intent(this, BookShelf.class).addFlags(Intent.FLAG_ACTIVI

27、TY_CLEAR_TOP);/添加我的設(shè)置選項(xiàng)myTabHost.addTab(myTabHost.newTabSpec(tab_setting).setIndicator(composeLayout(我的設(shè)置, R.drawable.setting).setContent(new Intent(this, MySetting.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);myTabHost.setCurrentTab(1);myTabHost.setOnTabChangedListener(new OnTabChangedListener()

28、;updateTab(myTabHost);將程序關(guān)聯(lián)成 Android 系統(tǒng)默認(rèn)打開程序代碼: 接收從外部傳來的參數(shù)并處理的代碼:Intent intent = getIntent();String action = intent.getAction();if (intent.ACTION_VIEW.equals(action) String res_path = ;try res_path = URLDecoder.decode(intent.getDataString(), utf8); catch (UnsupportedEncodingException e) e.printStac

29、kTrace();圖 8 所示是書籍管理主頁面,最上面標(biāo)題欄有導(dǎo)航按鈕和書籍選擇按鈕。當(dāng)點(diǎn)擊導(dǎo)航按鈕時(shí)會(huì)從左側(cè)彈出導(dǎo)航欄如圖 9 所示,并把書籍從每行顯示三個(gè)調(diào)整到每行顯示兩個(gè)。當(dāng)點(diǎn)擊導(dǎo)航里的按鈕時(shí)會(huì)顯示子功能導(dǎo)航,當(dāng)再點(diǎn)擊其它按鈕時(shí),會(huì)收起前面的子功能導(dǎo)航,展開當(dāng)前的子功能。當(dāng)單擊書籍選擇按鈕時(shí)會(huì)彈出書籍選擇窗口,選擇里面的書架則進(jìn)入相應(yīng)的書架界面,同時(shí)還可以通過左右滑動(dòng)來切換書架界面。當(dāng)單擊書籍時(shí)會(huì)打開相應(yīng)的書籍閱讀界面,長按某書籍時(shí)會(huì)彈出書籍操作窗口如圖 10 所示,書籍操作窗口中有刪除閱讀記錄、刪除閱讀記錄和文件、移動(dòng)到歷史書架、移動(dòng)到收藏書籍、查看書籍詳情和分享本書,不同書架中的操作

30、項(xiàng)略有不同。 圖 8 書架效果頁面圖 9 導(dǎo)航欄頁面 圖 10 書籍操作窗口初始化 ViewPager 的核心代碼如下:private void InitViewPager() mPager = (ViewPager) findViewById(R.id.vPager);listViews = new ArrayList();Intent intent = new Intent(BookShelf.this, BookShelfActivity.class);intent.putExtra(book_shelf, MyConstant.BOOKS_RECENTLY);listViews.add

31、(getView(BookShelfRecently, intent);Intent intent2=new Intent(BookShelf.this, BookShelfActivity.class);intent2.putExtra(book_shelf, MyConstant.BOOKS_HISTORY);listViews.add(getView(BookShelfHistory, intent2);Intent intent3=new Intent(BookShelf.this, BookShelfActivity.class);intent3.putExtra(book_shel

32、f, MyConstant.BOOKS_COLLECT);listViews.add(getView(BookShelfCollect, intent3);adapter = new MyPagerAdapter(listViews);mPager.setAdapter(adapter);mPager.setCurrentItem(0);mPager.setOnPageChangeListener(new MyOnPageChangeListener();單擊書籍跳轉(zhuǎn)至閱讀頁面進(jìn)行閱讀代碼如下:private void goReadActivity(BookInfo tem) if(new F

33、ile(tem.bookPath).exists() Intent intent = new Intent(BookShelfActivity.this, ReaderActivity.class);bundle = new Bundle(); bundle.putInt(id, tem.bookId); bundle.putString(name, tem.bookName); bundle.putString(path, tem.bookPath); bundle.putInt(pos, tem.pos); bundle.putDouble(percentage, tem.readPerc

34、entage); intent.putExtras(bundle); startActivity(intent); elsebooksTableOperate.delete(tem.bookId);adapter.notifyDataSetChanged();Toast.makeText(BookShelfActivity.this, 書籍文件不存在,移除記錄, Toast.LENGTH_SHORT).show();書籍排序的核心代碼(以按時(shí)間排序?yàn)槔篠impleDateFormat format = new SimpleDateFormat(yyyy-MM-dd HH:mm:ss);tr

35、y long time1 = format.parse(book1.lastRead).getTime();long time2 = format.parse(book2.lastRead).getTime();if (time1 time2) return -1; else return book1.bookName pareToIgnoreCase(book2.bookName); catch (ParseException e) e.printStackTrace();分享本書的代碼如下:Intent sendIntent = new Intent(); sendIntent.setAc

36、tion(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, +selectBook.bookName+這本書還不錯(cuò),分享給大家看看!); sendIntent.setType(text/plain); startActivity(sendIntent);點(diǎn)擊添加書籍中的快速掃描按鈕,進(jìn)入此界面開始掃描,通過自定義文件名過濾類來進(jìn)行搜索并顯示正在掃描界面,其中有掃描到的文件數(shù)目如圖 11 所示。掃描完成后使用 ListView 組件顯示掃描結(jié)果,最上面標(biāo)題欄有返回按鈕、我的書籍標(biāo)題、重新掃描按鈕。當(dāng)長按某文件時(shí)則切換到多選模式

37、如圖 12 所示,最上面標(biāo)題欄改變?yōu)闃?biāo)記全部按鈕、選中的文件數(shù)目顯示、加入書架按鈕、取消按鈕。多選模式下可以點(diǎn)擊文件進(jìn)行逐個(gè)選擇,也可進(jìn)行全選和取消全選操作。當(dāng)用戶選擇是標(biāo)題欄上會(huì)有對(duì)應(yīng)的已選文件個(gè)數(shù)顯示。選好之后點(diǎn)擊加入書架將會(huì)把選中的文件加入最近書架中,也可以點(diǎn)擊取消則取消多選模式。圖 11 正在掃描圖 12 多選模式時(shí)時(shí)顯示掃描到的文件個(gè)數(shù)部分代碼:Handler handler = new Handler() public void handleMessage(Message msg) if (msg.what != -1) numText.setText( + msg.what);

38、else listData = listTem;ll.setVisibility(View.GONE);super.handleMessage(msg);class UpdataBooks extends Thread Overridepublic void run() handler.sendEmptyMessage(1);getAllFiles(file);handler.sendEmptyMessage(-1);掃描文本文件部分代碼:public void getAllFiles(File root) File files = root.listFiles(new MyFileFilte

39、r(false,txt);if (files != null) for (File f : files) if (f.isDirectory() getAllFiles(f); else if ( f.length() 1024 * 100) Map tem = new HashMap();tem.put(fileName, f.getName();tem.put(filePath, f.getAbsolutePath();tem.put(fileSize, getFileSize(f.length();num+;handler.sendEmptyMessage(num);listTem.ad

40、d(tem);isSelect.add(false);下面是文件瀏覽模塊主頁面,使用 ListView 組件顯示文件目錄,不同的文件類型顯示不同的圖標(biāo)如圖 13 所示。最上面標(biāo)題欄有導(dǎo)航按鈕,當(dāng)點(diǎn)擊導(dǎo)航按鈕時(shí)會(huì)從左側(cè)彈出導(dǎo)航欄如圖 14 所示,導(dǎo)航欄中有標(biāo)記文件按鈕、分類排序按鈕和添加到書架按鈕,點(diǎn)擊標(biāo)記文件按鈕或長按某文件或目錄時(shí)則切換到多選模式,其中有多選按鈕、反選按鈕和取消按鈕;點(diǎn)擊分類排序則彈出子菜單,其中有按名稱排序、按大小排序、按時(shí)間排序和按類型排序;點(diǎn)擊添加到書架時(shí)如果為選擇文件則自動(dòng)進(jìn)入多選模式讓用戶進(jìn)行文件選擇,如果用戶未選擇則提示“請(qǐng)選擇書籍” ,進(jìn)行選擇是用戶可選擇文件或

41、目錄,系統(tǒng)會(huì)自動(dòng)進(jìn)行掃描,把符合要求的文件添加到“最近書架”中,并彈出提示信息,其中有失敗個(gè)數(shù)、已存在個(gè)數(shù)和成功個(gè)數(shù)。在多選模式下點(diǎn)擊返回按鈕或點(diǎn)擊標(biāo)記文件會(huì)取消多選模式。非多選模式下,用戶點(diǎn)擊文件時(shí)本軟件會(huì)根據(jù)文件擴(kuò)展名來判斷打開文件方式如圖 15 所示,如果是文本文件則直接用本軟件打開,并把其添加到“最近書架”中,其它格式則調(diào)用對(duì)應(yīng)的軟件打開,如果是未識(shí)別的類型則提示“沒有打開此文件的應(yīng)用” 。 圖 13 文件瀏覽頁面圖 14 文件瀏覽導(dǎo)航欄圖 15 打開視頻文件文件路徑導(dǎo)航實(shí)現(xiàn)代碼:public void navigationBar() String strPath = null;try

42、 strPath = currentParent.getCanonicalPath().split(/); catch (IOException e1) e1.printStackTrace();tvpath.removeAllViews();for (int i = 1; i 1) if (i = 2) imageText.setPadding(10, 0, 20, 0);imageText.setText(存儲(chǔ)器); else imageText.setPadding(10, 0, 20, 0);imageText.setText(strPathi);if (i = strPath.len

43、gth - 1) linyou.setBackgroundResource(R.drawable.rights_); else linyou.setBackgroundResource(R.drawable.middle);linyou.setOnClickListener(new imageTextListener(i,strPath.length, strPath);frameLayout.addView(linyou);frameLayout.addView(imageText);tvpath.addView(frameLayout);不同類型文件打開方式的核心代碼如下:private

44、void OpenPhoto(String work_answer) Intent intent = null;final String res_path = work_answer;String suffixName=res_path.substring(res_path.lastIndexOf(.)+ 1).toLowerCase();if (!new File(res_path).exists() Toast.makeText(this, suffixName + 資源不存在,Toast.LENGTH_SHORT).show(); else /選擇打開方式if (doc.equals(s

45、uffixName) | docx.equals(suffixName) intent = Utils.getWordFileIntent(res_path);else if (ppt.equals(suffixName)|pptx.equals(suffixName)intent = Utils.getPptFileIntent(res_path);else if (xls.equals(suffixName)|xlsx.equals(suffixName)intent = Utils.getExcelFileIntent(res_path); else if (jpg.equals(suf

46、fixName) | png.equals(suffixName)|gif.equals(suffixName)|bmp.equals(suffixName) intent = Utils.getImageFileIntent(res_path); else if (pdf.equals(suffixName) intent = Utils.getPdfFileIntent(res_path); else if (mp3.equals(suffixName) intent = Utils.getAudioFileIntent(res_path); else if (html.equals(su

47、ffixName) intent = Utils.getHtmlFileIntent(res_path); else if (chm.equals(suffixName) intent = Utils.getChmFileIntent(res_path); else if (mp4.equals(suffixName) | 3gp.equals(suffixName)|wmv.equals(suffixName)|flv.equals(suffixName)|rmvb.equals(suffixName)|avi.equals(suffixName)intent = Utils.getVide

48、oFileIntent(res_path); else if (txt.equals(suffixName) /設(shè)置文本打開方式為當(dāng)前應(yīng)用int p1 = res_path.lastIndexOf(/);int p2 = res_path.lastIndexOf(.);long mFileSize = new File(res_path).length();BookDatabaseHelper helper = new BookDatabaseHelper(FileExplorerActivity.this);SQLiteDatabase db = helper.getWritableData

49、base();BooksTableOperate booksTableOperate = new BooksTableOperate(db);booksTableOperate.insert(res_path.substring(p1 + 1, p2),res_path, getFileSize(mFileSize);ActivityMain.myTabHost.setCurrentTab(1);helper = new BookDatabaseHelper(FileExplorerActivity.this);db = helper.getWritableDatabase();booksTa

50、bleOperate = new BooksTableOperate(db);BookInfo book = booksTableOperate.getBook(res_path);Intent it = new Intent(FileExplorerActivity.this,ReaderActivity.class);Bundle bundle = new Bundle();bundle.putInt(id, book.bookId);bundle.putString(name, book.bookName);bundle.putString(path, res_path);bundle.

51、putInt(pos, book.pos);it.putExtras(bundle);startActivity(it);db.close();return; else if (apk.equals(suffixName) intent = new Intent(Intent.ACTION_VIEW);intent.setDataAndType(Uri.fromFile(new File(suffixName),application/vnd.android.package-archive);startActivity(intent); else Toast.makeText(this, 不支

52、持 + suffixName + 文件格式, Toast.LENGTH_SHORT).show();try this.startActivity(intent); catch (Exception e) Toast.makeText(this, 沒有打開此文件的應(yīng)用, Toast.LENGTH_SHORT).show();e.printStackTrace();圖 16 所示是電子書閱讀主要頁面,本頁面通過自定義一個(gè) View 視圖來顯示書頁,通過自定義類來讀取文本內(nèi)容并通過 onDraw()方法把文件名、文本內(nèi)容、電量信息、時(shí)間信息和已讀百分比進(jìn)行繪制成圖片,并通過 View 來把繪制的圖片

53、顯示出來。第一次進(jìn)入閱讀頁面是會(huì)有顯示引導(dǎo)頁面來指導(dǎo)用戶如何讀本頁面進(jìn)行操作如圖 17 所示。本頁面操作包括點(diǎn)擊事件和滑動(dòng)事件,點(diǎn)擊左側(cè)屏幕進(jìn)行向上翻頁,點(diǎn)擊右側(cè)屏幕進(jìn)行向下翻頁,點(diǎn)擊屏幕中間畫出菜單選項(xiàng)如圖 18 所示。 圖 16 閱讀引導(dǎo)界面 圖 17 閱讀引導(dǎo)頁面 圖 18 閱讀菜單此菜單是使用 PopupWindow 組件實(shí)現(xiàn),菜單分上下兩部分,上面的菜單有返回按鈕、屏幕亮度調(diào)節(jié)按鈕和添加書簽按鈕;下面的菜單有主題選擇按鈕、搜索按鈕、書簽按鈕、目錄按鈕、字體大小調(diào)節(jié)按鈕、翻頁方式按鈕、夜間模式切換按鈕和退出軟件按鈕。點(diǎn)擊主題選擇按鈕彈出主題選擇窗口如圖 19 所示,此選項(xiàng)共設(shè)置了 9

54、種主題供用戶選擇,當(dāng)用戶選擇了主題閱讀頁面會(huì)自動(dòng)改變?yōu)楫?dāng)前選擇的主題樣式;點(diǎn)擊屏幕亮度調(diào)節(jié)按鈕彈出屏幕亮度設(shè)置窗口如圖 20所示,拖動(dòng)屏幕亮度調(diào)節(jié)條屏幕亮度會(huì)隨著用戶的拖動(dòng)而即時(shí)改變;點(diǎn)擊翻頁方式按鈕彈出翻頁方式設(shè)置窗口如圖 21 所示,此設(shè)置中共有三個(gè)按鈕代表了三種翻頁方式。 圖 19 閱讀主題選擇 圖 20 屏幕亮度設(shè)置圖 21 翻頁方式設(shè)置第一次進(jìn)入閱讀界面顯示引導(dǎo)頁面的核心代碼實(shí)現(xiàn)為:if(share.getBoolean(is_first, true)firstDialog();edit.putBoolean(is_first, false);edit mit();實(shí)現(xiàn)休息提醒和空閑

55、退出代碼:SuppressLint(HandlerLeak)Handler mTimeHandler = new Handler() public void handleMessage(Message msg) if (msg.what = 1) xiuxiDialog();if (msg.what = 2) SysApplication.getInstance().exit();super.handleMessage(msg);對(duì)應(yīng)屏幕事件處理的核心代碼實(shí)現(xiàn)為:Overridepublic boolean onTouch(View v, MotionEvent e) mKXcont = 0;

56、if (e.getAction() = MotionEvent.ACTION_DOWN) /手指按下時(shí)xd = e.getX();yd = e.getY();if& xd mWidthPixels * 0.25 & xd mWidthPixels / 2 & bool)Toast.makeText(ReaderActivity.this, 已經(jīng)到最后一頁了,Toast.LENGTH_SHORT).show(); else if (e.getAction() = MotionEvent.ACTION_MOVE) /移動(dòng)時(shí)x = e.getX();y = e.getY();if (Math.abs

57、(xd - x) 10 | Math.abs(yd - y) 10)bool = true; else if (e.getAction() = MotionEvent.ACTION_UP) /離開屏幕時(shí)xu = e.getX();yu = e.getY();if (!bool & Math.abs(xd - xu) 10 & Math.abs(yd - yu) 10) popupWindow.showAtLocation(mPageWidget, 0, 0, 0);if (bool) boolean ret = false;if (v = mPageWidget) if (e.getActio

58、n() = MotionEvent.ACTION_DOWN) mPageWidget.calcCornerXY(e.getX(), e.getY();pagefactory.onDraw(mCurPageCanvas);if (mPageWidget.DragToRight() try pagefactory.prePage(); catch (IOException e1) e1.printStackTrace();if (pagefactory.isfirstPage()return false;pagefactory.onDraw(mNextPageCanvas); else try p

59、agefactory.nextPage(); catch (IOException e1) e1.printStackTrace();if (pagefactory.islastPage()return false;pagefactory.onDraw(mNextPageCanvas);pos = pagefactory.getBugBegin();booksTable.updata(bookId, pos,pagefactory.getFPercent();mPageWidget.setBitmaps(mCurPageBitmap, mNextPageBitmap);ret = mPageW

60、idget.doTouchEvent(e);return ret;return true;設(shè)置窗口代碼實(shí)現(xiàn)(此處以字體大小調(diào)節(jié)設(shè)置窗口為例):private void fontSizeDialog() View myInputView = LayoutInflater.from(this).inflate(R.layout.input_dialog, null);dialog = new Dialog(this, R.style.Dialog);dialog.setContentView(myInputView);TextView title = (TextView) myInputView.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論