版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
基于Android手機(jī)電子書閱讀器的設(shè)計(jì)與實(shí)現(xiàn)(完整資料)(可以直接使用,可編輯優(yōu)秀版資料,歡迎下載)
基于Android手機(jī)電子書閱讀器的設(shè)計(jì)與實(shí)現(xiàn)(完整資料)(可以直接使用,可編輯優(yōu)秀版資料,歡迎下載)鄭州大學(xué)畢業(yè)設(shè)計(jì)(項(xiàng)目報(bào)告)題目:手機(jī)電子書閱讀器的設(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日目錄TOC\o"1—5”\u摘要PAGEREF_Toc409017214\h11項(xiàng)目開發(fā)目標(biāo)PAGEREF_Toc409017215\h11.1項(xiàng)目來源PAGEREF_Toc409017216\h11。2開發(fā)目標(biāo)PAGEREF_Toc409017217\h12項(xiàng)目總體設(shè)計(jì)PAGEREF_Toc409017218\h22.1技術(shù)框架設(shè)計(jì)PAGEREF_Toc409017219\h22。2數(shù)據(jù)庫設(shè)計(jì)PAGEREF_Toc409017220\h22.3功能框架設(shè)計(jì)PAGEREF_Toc409017221\h53項(xiàng)目功能描述PAGEREF_Toc409017222\h83.1軟件歡迎界面模塊功能描述PAGEREF_Toc409017223\h83.2主界面功能描述PAGEREF_Toc409017224\h103.3書籍管理模塊功能描述PAGEREF_Toc409017225\h123。4文件瀏覽模塊功能描述PAGEREF_Toc409017226\h163.5閱讀管理模塊功能描述PAGEREF_Toc409017227\h203。5。1章節(jié)管理模塊功能描述PAGEREF_Toc409017228\h243。5.2書簽管理模塊功能描述PAGEREF_Toc409017229\h273.5.3搜索管理模塊功能描述PAGEREF_Toc409017230\h283。6設(shè)置管理模塊功能描述PAGEREF_Toc409017231\h293。7使用幫助模塊功能描述PAGEREF_Toc409017232\h353.8關(guān)于模塊功能描述PAGEREF_Toc409017233\h364項(xiàng)目技術(shù)總結(jié)PAGEREF_Toc409017234\h384.1技術(shù)創(chuàng)新及特點(diǎn)PAGEREF_Toc409017235\h384.2個(gè)人收獲與體會(huì)PAGEREF_Toc409017236\h444。3致謝PAGEREF_Toc409017237\h44摘要?在這個(gè)快節(jié)奏的時(shí)代,人們的空余時(shí)間越來越零碎,而且人們對(duì)智能手機(jī)的依賴越來越重,所以,一個(gè)擁有豐富功能且能隨時(shí)進(jìn)行電子書閱讀的電子書閱讀器的出現(xiàn),則是我們刻不容緩的事情.此軟件是在Android平臺(tái)上進(jìn)行設(shè)計(jì)開發(fā),此軟件的開發(fā)是通過了客戶需求分析階段以及技術(shù)可行性分析階段,然后進(jìn)行總體設(shè)計(jì)階段和詳細(xì)設(shè)計(jì)編碼等階段。此軟件不僅具有基本的電子書閱讀功能,而且還擁有豐富的實(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)鍵字:電子書閱讀器,Android,文件瀏覽,書架1項(xiàng)目開發(fā)目標(biāo)1。1項(xiàng)目來源此次開發(fā)的項(xiàng)目是手機(jī)電子書閱讀器,屬于自選項(xiàng)目.隨著社會(huì)的發(fā)展,人們的生活節(jié)奏也越來越快空閑時(shí)間也越來越零碎,人們沒有了大段的時(shí)間來進(jìn)行書籍的閱讀,所以一款能利用零碎時(shí)間進(jìn)行隨時(shí)閱讀的軟件成為了我們的需求。而一款能在人們隨身攜帶的手機(jī)上運(yùn)行的閱讀軟件成為了大家的選擇。以前我們看看雜志,小說都要去圖書館借閱,而且時(shí)間有限,很不方便;而在電腦上看雜志,看小說,文檔也是很不方便的。以此看來,一個(gè)好的手機(jī)閱讀器軟件的開發(fā)是相當(dāng)有必要的。1.2開發(fā)目標(biāo)手機(jī)電子書閱讀器的開發(fā)目標(biāo)就是讓用戶可以把零碎的空余時(shí)間有效的利用到書籍的閱讀上,而且用戶在沒有網(wǎng)路的情況下也可以正常的進(jìn)行書籍的閱讀,讓用戶擺脫書籍的笨重?cái)y帶不方便等確定,給予閱讀者更大的便利性更好的舒適性。此軟件是在Android平臺(tái)上進(jìn)行設(shè)計(jì)開發(fā),它的界面豐富簡潔但是卻不簡單,它包含了書架界面、文件查看界面、軟件設(shè)置界面、書籍閱讀界面等界面,它的功能全面.其優(yōu)越性表現(xiàn)在:自動(dòng)掃描手機(jī)里的所有書籍、手動(dòng)從文件夾中選擇添加書籍、自動(dòng)為書籍生成章節(jié)目錄、添加查看書簽、全文關(guān)鍵詞搜索、閱讀主題選擇、閱讀字體大小設(shè)置等功能.此外,給用戶更清晰方便的界面,也是本軟件的出發(fā)點(diǎn)之一。2項(xiàng)目總體設(shè)計(jì)2.1技術(shù)框架設(shè)計(jì)手機(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、文件等)、緩存(圖片、文件等)、配置文件(sharedperference)此軟件的開發(fā)環(huán)境:Windows7+Eclipse4。2.0+SDK。UIViewsUIViewsDataAdapterUIBLDataObserverBLFileSQLiteDataProviderMemoryCacheLocalDataUtil/ConfigData圖1軟件框架結(jié)構(gòu)2.2數(shù)據(jù)庫設(shè)計(jì)E-R圖是直觀表示概念模型的工具,它有四個(gè)基本成分:矩形框,表示實(shí)體類型。菱形框,表示聯(lián)系類型.橢圓形框,表示實(shí)體類型和聯(lián)系類型的屬性。對(duì)于關(guān)鍵碼的屬性,在屬性名下劃一橫線。直線,聯(lián)系類型與其涉及的試題類型之間以直線連接。圖2ER圖數(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_sizeTEXT書籍大小last_readDATETIME閱讀時(shí)間book_shelfINTEGER所屬書籍read_percentageDOUBLE已讀比例posINTEGER閱讀位置表1書籍表書籍表(books)創(chuàng)建的SQL語句:CREATETABLEbooks(?book_idINTEGERPRIMARYKEY, book_nameTEXTNOTNULL,?book_pathTEXTNOTNULLUNIQUE,?file_sizeTEXT,?last_readDATETIMEDEFAULT(datetime(CURRENT_TIMESTAMP,’localtime')),????book_shelfINTEGER,?read_percentageDOUBLEDEFAULT0, posINTEGERDEFAULT0);與書簽(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語句:CREATETABLEbookMarks(idINTEGERPRIMARYKEYAUTOINCREMENT,"book_idINTEGER,”percentDOUBLE,contentTEXT,posINTEGER,timeDATETIMEDEFAULT(datetime(CURRENT_TIMESTAMP,’localtime')));觸發(fā)器(fk_Delete)創(chuàng)建SQL語句:CREATETRIGGERfk_DeleteBEFOREDELETEONbooks FOREACHROW?BEGIN ?DELETE??FROMbookMarks WHEREbook_id=old.book_id;?END2.3功能框架設(shè)計(jì)圖3功能模塊圖手機(jī)電子書閱讀器軟件主要分為8?jìng)€(gè)功能大模塊如圖3所示,分別是歡迎模塊、軟件主界面、書籍管理、閱讀管理、文件瀏覽、系統(tǒng)管理、使用幫助、關(guān)于。其中書籍模塊中還要文件掃描模塊,閱讀管理中有章節(jié)管理、書簽管理、搜索管理.系統(tǒng)設(shè)置中有密碼設(shè)置。其各個(gè)模塊的詳細(xì)設(shè)計(jì)如下:1。軟件歡迎模塊。該模塊主要實(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)成手機(jī)默認(rèn)打開程序中,即從外部打開文本文件時(shí)選擇查看方式中會(huì)出現(xiàn)本軟件圖標(biāo)供用戶選擇以本軟件打開.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)的書籍閱讀界面,長按某書籍時(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)行掃描,把符合要求的文件添加到“最近書架”中,并彈出提示信息,其中有失敗個(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)頁面來指導(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)書籍閱讀到最后一頁后對(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)于本軟件的信息。本軟件的設(shè)置信息全部使用SharedPreferences存儲(chǔ).7。使用幫助。該模塊通過讀取幫助文件在TextView中顯示,并且為TextView添加滾動(dòng)條。文件中含有本軟件的特點(diǎn)、功能介紹、操作說明等,。8。關(guān)于。該模塊的主要功能是通過一個(gè)簡單的彈出窗口來顯示本軟件的版本信息、聯(lián)系方式。3項(xiàng)目功能描述3.1軟件歡迎界面模塊功能描述圖4所示為歡迎界面模塊,此模塊作用是為了使軟件的進(jìn)入更連貫自然,讓用戶不感覺界面的出現(xiàn)突兀。兩秒后跳入其它頁面,如果有密碼跳入密碼驗(yàn)證頁面如圖6所示,如果是第一次啟動(dòng)跳入引導(dǎo)頁面如圖5所示.圖4歡迎界面 ?圖5引導(dǎo)界面 ??圖6密碼驗(yàn)證界面關(guān)于歡迎頁面啟動(dòng)的代碼如下:newHandler().postDelayed(newRunnable(){?@Overridepublicvoidrun(){? Intentintent=null; initSaveData();//判斷是否有密碼if(share.getString(”mi_ma","").equals("")){ //判斷是否為第一次啟動(dòng)if(share.getBoolean("first",true)){????edit.putBoolean("first",false); ???mit(); ? intent=newIntent(WelcomeActivity.this,GuideMain.class);?? }else{? ? intent=newIntent(WelcomeActivity.this,ActivityMain.class);? ?} ?}else{ intent=newIntent(WelcomeActivity。this,GestureVerifyActivity。class);? intent.putExtra(”from_activity",0);??}? startActivity(intent); finish();?}},2000); 關(guān)于引導(dǎo)界面滑動(dòng)事件代碼:@OverridepublicbooleanonTouch(Viewv,MotionEventevent){switch(event.getAction()){caseMotionEvent。ACTION_DOWN:{? //手指按下的X坐標(biāo) downX=event.getX();break;?}caseMotionEvent。ACTION_UP:{floatlastX=event.getX();??//抬起的時(shí)候的X坐標(biāo)大于按下的時(shí)候就顯示上一張圖片if(lastX>downX){if(currentPosition〉0){? ? //設(shè)置動(dòng)畫, mImageSwitcher.setInAnimation(AnimationUtils。loadAnimation(getApplicat(yī)ion(),R.anim。left_in)); ?mImageSwitcher.setOutAnimation(Animat(yī)ionUtils? ????.loadAnimation(getApplication(),R.anim.right_out)); ? currentPosition--;? ? mImageSwitcher。setImageResource(imgIds[currentPosition%imgIds.length]);??? setImageBackground(currentPosition); ??}else{ ???Toast.makeText(getApplication(),"向右滑動(dòng)",Toast.LENGTH_SHORT).show();? ?} ?}if(lastX<downX){if(currentPosition〈imgIds.length-1){? ? mImageSwitcher.setInAnimation(AnimationUtils。loadAnimat(yī)ion(getApplication(),R.a(chǎn)nim.right_in)); mImageSwitcher.setOutAnimation(AnimationUtils ? ??。loadAnimation(getApplication(),R.anim。left_out)); ? currentPosition++;? ? mImageSwitcher。setImageResource(imgIds[currentPosition]); ??setImageBackground(currentPosition);? ?}else{ Intentintent=newIntent(GuideMain。this,ActivityMain.class);?? startActivity(intent); ?? finish();? } ?}?}break; }returntrue;}通過xml設(shè)置引導(dǎo)頁面動(dòng)畫,代碼如下(以向左滑動(dòng)為例):<?xmlversion="1。0"encoding="utf-8”?>〈setxmlns:android="http://schemas.android.com/apk/res/android"><translateandroid:fromXDelta="—100%p"android:toXDelta=”0”android:duration="500"/></set>3.2主界面功能描述圖7所示是軟件的主頁面,這是一個(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)成手機(jī)默認(rèn)打開程序中,即從外部打開文本文件時(shí)選擇查看方式中會(huì)出現(xiàn)本軟件圖標(biāo)供用戶選擇以本軟件打開。圖7軟件主界面初始化選項(xiàng)卡代碼如下:privatevoidinitTabs(){myTabHost=(TabHost)findViewById(R。id.TabHost1);myTabHost.setup(this.getLocalActivityManager()); //添加文件管理選項(xiàng)myTabHost.addTab(myTabHost?? ?.newTabSpec("tab_file")? ??。setIndicat(yī)or(composeLayout("文件管理",R.drawable。folders))? ? .setContent(newIntent(this,F(xiàn)ileExplorerActivity。class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)));//添加我的書架選項(xiàng)myTabHost.a(chǎn)ddTab(myTabHost ? 。newTabSpec("tab_books") ? .setIndicator(composeLayout(”我的書架",R.drawable.books)) ???.setContent(newIntent(this,BookShelf.class)?? 。addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))); //添加我的設(shè)置選項(xiàng)myTabHost。addTab(myTabHost ??。newTabSpec(”tab_setting”) ? 。setIndicator(composeLayout("我的設(shè)置”,R.drawable.setting))? ??。setContent(newIntent(this,MySetting.class) ?? ?.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)));myTabHost.setCurrentTab(1);myTabHost。setOnTabChangedListener(newOnTabChangedListener()); updateTab(myTabHost);}將程序關(guān)聯(lián)成Android系統(tǒng)默認(rèn)打開程序代碼:〈activityandroid:name="com.zzu.ebookreader.ActivityMain"><intent-filter><actionandroid:name="android.intent.a(chǎn)ction.VIEW”></action>??〈categoryandroid:name=”android.intent.cat(yī)egory.DEFAULT”>〈/category>? <dataandroid:mimeType=”text/plain”></data〉 〈/intent-filter〉</activity>接收從外部傳來的參數(shù)并處理的代碼:Intentintent=getIntent();Stringaction=intent.getAction();if(intent.ACTION_VIEW。equals(action)){?Stringres_path="";try{??res_path=URLDecoder。decode(intent。getDataString(),”utf8");}catch(UnsupportedEncodingExceptione){? e.printStackTrace();?}}3.3書籍管理模塊功能描述圖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)到收藏書籍、查看書籍詳情和分享本書,不同書架中的操作項(xiàng)略有不同。圖8書架效果頁面? ?圖9導(dǎo)航欄頁面??圖10書籍操作窗口初始化ViewPager的核心代碼如下:privatevoidInitViewPager(){ mPager=(ViewPager)findViewById(R.id.vPager); listViews=newArrayList〈View〉();?Intentintent=newIntent(BookShelf。this,BookShelfActivity.class);?intent。putExtra("book_shelf",MyConstant.BOOKS_RECENTLY); listViews.add(getView(”BookShelfRecently",intent));?Intentintent2=newIntent(BookShelf.this,BookShelfActivity.class); intent2.putExtra("book_shelf",MyConstant。BOOKS_HISTO(shè)RY);?listViews。add(getView("BookShelfHistory”,intent2));?Intentintent3=newIntent(BookShelf。this,BookShelfActivity.class); intent3。putExtra(”book_shelf”,MyConstant.BOOKS_COLLECT); listViews。add(getView(”BookShelfCollect",intent3));?adapter=newMyPagerAdapter(listViews); mPager.setAdapter(adapter); mPager。setCurrentItem(0); mPager.setOnPageChangeListener(newMyOnPageChangeListener());}單擊書籍跳轉(zhuǎn)至閱讀頁面進(jìn)行閱讀代碼如下:privatevoidgoReadActivity(BookInfotem){if(newFile(tem.bookPat(yī)h)。exists()){?Intentintent=newIntent(BookShelfActivity.this,ReaderActivity.class); bundle=newBundle(); bundle。putInt(”id”,tem.bookId);?bundle.putString(”name",tem。bookName); bundle.putString(”pat(yī)h",tem.bookPath); bundle.putInt("pos”,tem.pos); bundle。putDouble("percentage",tem.readPercentage); intent.putExtras(bundle); startActivity(intent); }else{ ?booksTableOperate.delete(tem.bookId); ?adapter.notifyDataSetChanged(); ?Toast.makeText(BookShelfActivity.this,"書籍文件不存在,移除記錄~",Toast.LENGTH_SHORT).show();}}書籍排序的核心代碼(以按時(shí)間排序?yàn)槔篠impleDateFormatformat(yī)=newSimpleDateFormat(”yyyy-MM—ddHH:mm:ss”);try{longtime1=format。parse(book1.lastRead)。getTime();longtime2=format.parse(book2。lastRead)。getTime();if(time1<time2){return1;}elseif(time1>time2){return-1;}else{returnbook1.bookName。compareToIgnoreCase(book2。bookName);??}}catch(ParseExceptione){?e.printStackTrace();}分享本書的代碼如下:IntentsendIntent=newIntent();sendIntent。setAction(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í)則切換到多選模式如圖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ù)部分代碼:Handlerhandler=newHandler(){publicvoidhandleMessage(Messagemsg){if(msg.what!=-1){ ? numText。setText(”"+msg.what);??}else{ ??listData=listTem;???ll.setVisibility(View。GONE);? }super.handleMessage(msg); };};classUpdataBooksextendsThread{ @Overridepublicvoidrun(){??handler。sendEmptyMessage(1); getAllFiles(file); handler.sendEmptyMessage(-1); }}掃描文本文件部分代碼:publicvoidgetAllFiles(Fileroot){?Filefiles[]=root.listFiles(newMyFileFilter(false,"txt”));if(files!=null){for(Filef:files){if(f.isDirectory()){? ??getAllFiles(f);? ?}elseif(f.length()〉1024*100){ Map<String,String>tem=newHashMap<String,String>(); ?? tem.put(”fileName",f.getName()); ? tem.put(”filePath",f.getAbsolutePath());????tem.put(”fileSize",getFileSize(f。length()));? ?num++; ?handler。sendEmptyMessage(num); ? ?listTem.a(chǎn)dd(tem);? ? isSelect.add(false); ? } } }}3。4文件瀏覽模塊功能描述下面是文件瀏覽模塊主頁面,使用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)行選擇是用戶可選擇文件或目錄,系統(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)代碼:publicvoidnavigationBar(){ String[]strPath=null;try{ ?strPath=currentParent.getCanonicalPat(yī)h().split("/"); }cat(yī)ch(IOExceptione1){ ?e1.printStackTrace(); }?tvpath.removeAllViews();for(inti=1;i〈strPath.length;i++){finalFrameLayoutframeLayout=newFrameLayout( ?? FileExplorerActivity.this);finalLinearLayoutlinyou=newLinearLayout( ? FileExplorerActivity.this);finalTextViewimageText=newTextView(FileExplorerActivity.this); ?imageText。setGravity(Gravity.CENTER);??imageText.setTextColor(Color.BLUE);if(i〉1){if(i==2){? ? imageText.setPadding(10,0,20,0); ???imageText。setText("存儲(chǔ)器"); ? }else{ ??imageText。setPadding(10,0,20,0); imageText.setText(strPath[i]); ?}if(i==strPath。length-1){ ? linyou.setBackgroundResource(R。drawable。rights_); ?}else{????linyou.setBackgroundResource(R.drawable.middle); ?}???linyou。setOnClickListener(newimageTextListener(i, ???strPat(yī)h.length,strPat(yī)h)); } ?frameLayout。addView(linyou);? frameLayout.addView(imageText); tvpat(yī)h.addView(frameLayout);?}}不同類型文件打開方式的核心代碼如下:privatevoidOpenPhoto(Stringwork_answer){?Intentintent=null;finalStringres_path=work_answer;?StringsuffixName=res_path.substring(res_path。lastIndexOf(”.")+1)。toL(fēng)owerCase();if(!newFile(res_path)。exists()){??Toast.makeText(this,suffixName+”資源不存在",Toast。LENGTH_SHORT).show(); }else{?//選擇打開方式if("doc"。equals(suffixName)||"docx"。equals(suffixName)){? intent=Utils.getWordFileIntent(res_path);}elseif("ppt".equals(suffixName)||"pptx"。equals(suffixName)){? intent=Utils.getPptFileIntent(res_pat(yī)h); ?}elseif("xls”.equals(suffixName)||"xlsx”.equals(suffixName)){? ?intent=Utils.getExcelFileIntent(res_path); ?}elseif("jpg"。equals(suffixName)||”png”.equals(suffixName)||”gif".equals(suffixName)||"bmp”。equals(suffixName)){ intent=Utils.getImageFileIntent(res_path);??}elseif("pdf".equals(suffixName)){?? intent=Utils。getPdfFileIntent(res_path);??}elseif("mp3”.equals(suffixName)){ ??intent=Utils.getAudioFileIntent(res_pat(yī)h);? }elseif("html”。equals(suffixName)){? intent=Utils。getHtmlFileIntent(res_path);??}elseif(”chm".equals(suffixName)){?? intent=Utils.getChmFileIntent(res_pat(yī)h);??}elseif("mp4".equals(suffixName)||”3gp”.equals(suffixName)||"wmv”。equals(suffixName)||"flv".equals(suffixName)||”rmvb".equals(suffixName)||"avi"。equals(suffixName)){ ? intent=Utils.getVideoFileIntent(res_path); }elseif("txt".equals(suffixName)){?//設(shè)置文本打開方式為當(dāng)前應(yīng)用intp1=res_path.lastIndexOf("/");intp2=res_path.lastIndexOf(".");longmFileSize=newFile(res_path).length();BookDatabaseHelperhelper=newBookDatabaseHelper(FileExplorerActivity.this);SQLiteDatabasedb=helper.getWritableDatabase();BooksTableOperatebooksTableOperate=newBooksTableOperate(db);?? booksTableOperate。insert(res_path.substring(p1+1,p2),res_path,getFileSize(mFileSize)); ?ActivityMain.myTabHost。setCurrentTab(1); ?helper=newBookDatabaseHelper(FileExplorerActivity.this); ? db=helper.getWritableDatabase();???booksTableOperate=newBooksTableOperate(db); ? BookInfobook=booksTableOperate。getBook(res_pat(yī)h);???Intentit=newIntent(FileExplorerActivity.this,ReaderActivity.class); ? Bundlebundle=newBundle(); bundle。putInt(”id",book.bookId);? bundle.putString(”name",book。bookName); ? bundle.putString("path",res_path);? ?bundle.putInt("pos",book.pos);? it。putExtras(bundle);? ?startActivity(it);db.close();return;? }elseif("apk”。equals(suffixName)){ ? intent=newIntent(Intent。ACTION_VIEW);? intent。setDataAndType(Uri。fromFile(newFile(suffixName)),"application/vnd。android.package-archive”);? startActivity(intent); }else{?? Toast.makeText(this,"不支持"+suffixName+”文件格式",Toast。LENGTH_SHORT).show(); }try{this.startActivity(intent);? }catch(Exceptione){ ? Toast.makeText(this,”沒有打開此文件的應(yīng)用”,Toast.LENGTH_SHORT)。show();?? e.printStackTrace();??}?}}3.5閱讀管理模塊功能描述圖16所示是電子書閱讀主要頁面,本頁面通過自定義一個(gè)View視圖來顯示書頁,通過自定義類來讀取文本內(nèi)容并通過onDraw()方法把文件名、文本內(nèi)容、電量信息、時(shí)間信息和已讀百分比進(jìn)行繪制成圖片,并通過View來把繪制的圖片顯示出來。第一次進(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種主題供用戶選擇,當(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);?? mit();}實(shí)現(xiàn)休息提醒和空閑退出代碼:@SuppressLint("HandlerLeak”)HandlermTimeHandler=newHandler(){publicvoidhandleMessage(Messagemsg){if(msg。what==1){???xiuxiDialog(); ?}if(msg.what==2){ ??SysApplication。getInstance()。exit();? }super。handleMessage(msg);?};};對(duì)應(yīng)屏幕事件處理的核心代碼實(shí)現(xiàn)為:@OverridepublicbooleanonTouch(Viewv,MotionEvente){ mKXcont=0;if(e.getAction()==MotionEvent。ACTION_DOWN){//手指按下時(shí)??xd=e.getX();? yd=e.getY();if(yd〉mHeightPixels*0.35&&yd<mHeightPixels*0.65 &&xd〉mWidthPixels*0.25&&xd〈mWidthPixels*0.75){???bool=false;??}else{? bool=true;??}if(pagefactory.isReadEnd()&&xd>mWidthPixels/2&&bool){?? Toast。makeText(ReaderActivity.this,"已經(jīng)到最后一頁了~”,Toast.LENGTH_SHORT).show();? }?}elseif(e。getAction()==MotionEvent。ACTION_MOVE){//移動(dòng)時(shí) ?x=e.getX();??y=e。getY();if(Math。abs(xd-x)>10||Math。abs(yd-y)>10) ??bool=true;?}elseif(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){? booleanret=false;if(v==mPageWidget){if(e.getAction()==MotionEvent.ACTION_DOWN){ ?? mPageWidget.calcCornerXY(e。getX(),e.getY());? ??pagefactory.onDraw(mCurPageCanvas);if(mPageWidget.DragToRight()){try{? ?pagefactory.prePage(); ?? ?}cat(yī)ch(IOExceptione1){???? e1。printStackTrace();?? ?}if(pagefactory。isfirstPage()){? ? returnfalse;? ??}? ??pagefactory。onDraw(mNextPageCanvas); ?}else{try{ ? ?pagefactory.nextPage();? ?? }catch(IOExceptione1){? ? ??e1.printStackTrace();? ? ?}if(pagefactory。islastPage()){?? ? returnfalse;? ? }? ? pagefactory。onDraw(mNextPageCanvas); ? }??? pos=pagefactory。getBugBegin(); booksTable。updata(bookId,pos,? ???pagefactory。getFPercent());? ?mPageWidget。setBitmaps(mCurPageBitmap,mNextPageBitmap);?? }? ret=mPageWidget.doTouchEvent(e);returnret;? } }returntrue;}設(shè)置窗口代碼實(shí)現(xiàn)(此處以字體大小調(diào)節(jié)設(shè)置窗口為例):privatevoidfontSizeDialog(){?ViewmyInputView=LayoutInflater.from(this).inflat(yī)e(R.layout.input_dialog,null); dialog=newDialog(this,R.style.Dialog); dialog.setContentView(myInputView);?TextViewtitle=(TextView)myInputView。findViewById(R.id。title);?seekbarText=(TextView)myInputView。findViewById(R.id。see(cuò)kbar_text); See(cuò)kBarsee(cuò)kbar=(SeekBar)myInputView.findViewById(R.id.seekBar1);?seekbarText.setVisibility(View.VISIBLE);?seekbar.setVisibility(View。VISIBLE);intsize=share。getInt("font_size”,35); seekbarText。setText(”當(dāng)前字體大?。海ⅲ骾ze); seekbar.setProgress(size—10);?Buttonconfirm=(Button)myInputView。findViewById(R。id.confirm_button); Buttoncancel=(Button)myInputView.findViewById(R.id.cancel_button); cancel。setVisibility(View。GONE);?see(cuò)kbar。setOnSeekBarChangeListener(newMyOnSee(cuò)kBarChangeListener());?confirm.setOnClickListener(newOnClickListener(){? @OverridepublicvoidonClick(Viewv){???dialog.hide();?? popupWindow。dismiss(); ?}?}); title.setText(”字體大小設(shè)置");?WindowManagerm=getWindowManager();?Displayd=m。getDefaultDisplay();//為獲取屏幕寬、高 WindowdialogWindow=dialog。getWindow(); android.view.WindowManager.LayoutParamsp=dialogWindow。getAttributes();//獲取對(duì)話框當(dāng)前的參數(shù)值?dialogWindow.setGravity(Gravity。TO(shè)P);//寬度設(shè)置為屏幕的寬度 p。width=d.getWidth(); p。y=d.getHeight()/2-250;?dialogWindow.setAttributes(p);//設(shè)置生效 dialog.show();}3.5.1章節(jié)管理模塊功能描述首次進(jìn)入章節(jié)查看界面時(shí)會(huì)進(jìn)行章節(jié)提取,并顯示目錄生成中頁面如圖22所示,通過對(duì)前十章的章節(jié)字?jǐn)?shù)進(jìn)行記錄比較選擇一個(gè)較為合適的字?jǐn)?shù)進(jìn)行跳躍匹配以提高匹配效率,通過通過正則表達(dá)式來進(jìn)行章節(jié)匹配且顯示目錄生成中界面并把結(jié)果通過JSON存儲(chǔ)到用戶手機(jī)中以便下次直接從JSON文件中讀取.目錄生成之后使用ListView組件顯示章節(jié)并定位到當(dāng)前正在閱讀的章節(jié)并以醒目的顏色突出顯示出來,最上面標(biāo)題欄有返回按鈕和重新生成按鈕.每個(gè)章節(jié)都有對(duì)應(yīng)到刪除按鈕以便刪除錯(cuò)誤的章節(jié)內(nèi)容如圖23所示。當(dāng)點(diǎn)擊章節(jié)按鈕時(shí)跳轉(zhuǎn)的對(duì)應(yīng)的章節(jié)進(jìn)行閱讀。??圖22等待界面 ? ? 圖23章節(jié)列表章節(jié)提取的核心代碼如下:publicvoidanalysisChapterList(){?JSONArraysing=newJSONArray();?Stringregex1="(\\t|\\x0B){0,6}[第]([零一二三四五六七八九十百佰千仟萬0—9]{1,9})[章節(jié)回卷集部篇](.{0,30})"; Patternp=Pattern.compile(regex1); Strings=null;?Matcherm=null; Filefile1=newFile(pat(yī)h);longm_mbBufLen=file1。length(); m_mbBufLen=file1.length(); RandomAccessFilein;try{? in=newRandomAccessFile(file1,”r”);??MappedByteBufferm_mbBuf=in.getChannel()。map( ??? FileChannel。MapMode。READ_ONLY,0,m_mbBufLen);??in.close();intstart=0;//當(dāng)前章節(jié)開始位置intstart1=-10000;//上章節(jié)開始位置intcount=0;//統(tǒng)計(jì)每章節(jié)字節(jié)次數(shù)intminNum=10000;//保存最小章節(jié)字節(jié)數(shù)作為基本字節(jié)數(shù)while(start〈m_mbBufLen){byte[]buf=newbyte[500];inti=0;for(i=0;i〈500&&start+i〈m_mbBufLen;){if(m_mbBuf.get(start+i)==13 ??? &&m_mbBuf。get(start+i+1)==10){? ???i+=2;break;? ? }? ?buf[i]=m_mbBuf。get(start+i); ??i++;?? }if(i<55){ //判斷文本編碼??? s=newString(buf,"gbk").trim();?? m=p.mat(yī)cher(s);while(m.find()){??? JSONObjecttemp=newJSONObject();try{ ??? temp。put("title”,m.group());? ????temp.put("pos”,start); ???}catch(JSONExceptione){??? ??e.printStackTrace();? ??} ? sing.put(temp);if(count<10&&start-start1〉500){if(minNum>start-start1)??? ? minNum=start—start1;? ??? start1=start;? ? ?}else? ? start+=minNum—1000;? ?? count++;? ?}? ?} ??start=start+i;? } ?m_mbBuf.clear(); }catch(FileNotFoundExceptione){ ?e。printStackTrace();?}cat(yī)ch(IOExceptione){??e.printStackTrace(); } jsonArr=sing;}3.5.2書簽管理模塊功能描述圖24所示是章節(jié)查看主頁面,首次進(jìn)入此界面開始進(jìn)行章節(jié)提取,通過對(duì)前十章的章節(jié)字?jǐn)?shù)進(jìn)行記錄比較選擇一個(gè)較為合適的字?jǐn)?shù)進(jìn)行跳躍匹配以提高匹配效率,通過通過正則表達(dá)式來進(jìn)行章節(jié)匹配且顯示目錄生成中界面并把結(jié)果通過JSON存儲(chǔ)到用戶手機(jī)中以便下次直接從JSON文件中讀取.目錄生成之后使用ListView組件顯示章節(jié)并定位到當(dāng)前正在閱讀的章節(jié)并以醒目的顏色突出顯示出來,最上面標(biāo)題欄有返回按鈕和重新生成按鈕。每個(gè)章節(jié)都有對(duì)應(yīng)到刪除按鈕以便刪除錯(cuò)誤的章節(jié)內(nèi)容。當(dāng)點(diǎn)擊章節(jié)按鈕時(shí)跳轉(zhuǎn)的對(duì)應(yīng)的章節(jié)進(jìn)行閱讀。圖24書簽列表刪除單條標(biāo)簽核心代碼如下:classDelIcoOnClickListenerimplementsOnClickListener{privateintposition;publicDelIcoOnClickListener(intpos){ ?position=pos; }?@OverridepublicvoidonClick(Viewv){? deleteValue(position);?}}publicvoiddeleteValue(intindex){ System.out.println(index); db=helper.getWritableDatabase(); marksTable=newBookMarksTableOperate(db);?System.out.println(marksData。get(index)。id);?marksTable.delete(marksData.get(index)。id); marksDat(yī)a.remove(index);//刪除指定目錄 adapter.notifyDataSetChanged();//更新列表}3.5.3搜索管理模塊功能描述搜索模塊是輸入要搜索的關(guān)鍵詞如圖25所示,點(diǎn)擊確定進(jìn)行搜索顯示搜索中頁面,搜索完成后會(huì)在ListView中顯示搜索到的結(jié)果如圖26所示,其原理與章節(jié)提取類似,就不在此處格外敘述了。 圖25全文搜索 ?? ?圖26搜索結(jié)果列表3.6設(shè)置管理模塊功能描述設(shè)置管理模塊包括閱讀設(shè)置和系統(tǒng)設(shè)置如圖27所示。閱讀設(shè)置中有連續(xù)閱讀模式、閱讀完成時(shí)自動(dòng)歸類、閱讀休息提醒和閱讀空閑退出。連續(xù)閱讀模式:下次啟動(dòng)直接進(jìn)入上次閱讀的界面進(jìn)行繼續(xù)閱讀;閱讀完成時(shí)自動(dòng)歸類:當(dāng)書籍閱讀到最后一頁后對(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)于本軟件的信息。本軟件的設(shè)置信息全部使用SharedPreferences存儲(chǔ)。圖27系統(tǒng)設(shè)置對(duì)應(yīng)的的核心代碼如下(以閱讀休息提醒為例):privatevoidxiuXiDialog(){finalEditTextinputServer=newEditText(this);inputServer.setFocusable(true);ViewmyInputView=LayoutInflat(yī)er。from(this)。inflate(R。layout。input_dialog,null);dialog=newDialog(this,R。style.Dialog);dialog.setContentView(myInputView);TextViewtitle=(TextView)myInputView.findViewById(R.id.title);input=(EditText)myInputView.findViewById(R。id.input);input.setVisibility(View.VISIBLE);input.setText(share。getInt("xiu_xi”,0)+"");Buttonconfirm=(Button)myInputView.findViewById(R.id.confirm_button);Buttoncancel=(Button)myInputView。findViewById(R.id.cancel_button);confirm.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){inttime=Integer。parseInt(input.getText()。toString());edit。putInt(”xiu_xi”,time);edit.commit();if(time==0){xiuXiMsg.setText(”關(guān)閉");}else{xiuXiMsg.setText(time+””);}dialog.dismiss();}});cancel.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){dialog.dismiss();}});input。requestFocus();input.selectAll();title。setText("閱讀休息提醒設(shè)置(分鐘)");WindowManagerm=getWindowManager();//為獲取屏幕寬、高Displayd=m。getDefaultDisplay();WindowdialogWindow=dialog.getWindow();android.view。WindowManager.LayoutParamsp=dialogWindow。getAttributes();//獲取對(duì)話框當(dāng)前的參數(shù)值dialogWindow。setGravity(Gravity.TOP);//寬度設(shè)置為屏幕的寬度 p.width=d.getWidth();?p.y=80;//設(shè)置生效 dialogWindow。setAttributes(p);dialog.show();}點(diǎn)擊使用軟件密碼按鈕,進(jìn)入密碼設(shè)置模塊有新密碼設(shè)置、密碼修改、密碼取消功能。第一次使用密碼時(shí)會(huì)打開密碼設(shè)置如圖28所示,讓用戶設(shè)置一個(gè)密碼,密碼設(shè)置頁面最上面有個(gè)返回按鈕,往下有個(gè)小的圖案顯示,可以顯示第一次繪制的圖像,再往下時(shí)主繪制界面讓用戶進(jìn)行密碼圖案繪制,繪制的圖案中不能少于4個(gè)點(diǎn)。當(dāng)用戶要修改或取消密碼時(shí),要先進(jìn)行密碼驗(yàn)證如圖29所示,只有驗(yàn)證同伙后才能進(jìn)行密碼的修改或取消操作如圖30所示,并且本軟件不提供密碼找回功能。密碼繪制界面是自定義的一個(gè)ViewGroup組件。 圖28設(shè)置密碼? ?圖29驗(yàn)證密碼??圖30修改或取消密碼密碼繪制界面添加圖標(biāo)的核心代碼:privatevoidaddChild(){for(inti=0;i<9;i++){? ImageViewimage=newImageView(context);?image.setBackg
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 河北省廊坊市2025屆高三上學(xué)期1月期末考試政治試卷(含答案)
- 單位管理制度展示大合集【職工管理】十篇
- 區(qū)域工業(yè)化與城市化課件-其它技巧-制作技巧-專區(qū)
- 昂利康深度研究報(bào)告:漸入佳境的制劑一體化企業(yè)步入加速成長期
- 2025年中國胃鏡行業(yè)發(fā)展全景監(jiān)測(cè)及投資方向研究報(bào)告
- 《hy分析手法》課件
- 2025年人工智能小鎮(zhèn)項(xiàng)目評(píng)估報(bào)告
- 2019-2025年中國電力節(jié)能減排行業(yè)發(fā)展?jié)摿Ψ治黾巴顿Y方向研究報(bào)告
- 2024年農(nóng)業(yè)諺語(共46篇)
- 左卡尼汀項(xiàng)目建議書寫作參考范文
- 數(shù)學(xué)-2025年高考綜合改革適應(yīng)性演練(八省聯(lián)考)
- 市場(chǎng)營銷試題(含參考答案)
- 2024年醫(yī)療器械經(jīng)營質(zhì)量管理規(guī)范培訓(xùn)課件
- 景區(qū)旅游安全風(fēng)險(xiǎn)評(píng)估報(bào)告
- 2023年新高考(新課標(biāo))全國2卷數(shù)學(xué)試題真題(含答案解析)
- 2024年計(jì)算機(jī)二級(jí)WPS考試題庫380題(含答案)
- 事業(yè)單位工作人員獎(jiǎng)勵(lì)審批表
- DL-T 1476-2023 電力安全工器具預(yù)防性試驗(yàn)規(guī)程
- 眼科護(hù)理的國內(nèi)外發(fā)展動(dòng)態(tài)和趨勢(shì)
- 2024年中煤平朔集團(tuán)有限公司招聘筆試參考題庫含答案解析
- 水中五日生化需氧量測(cè)定的影響因素
評(píng)論
0/150
提交評(píng)論