版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
基于Android手機電子書閱讀器的設計與實現(xiàn)(完整資料)(可以直接使用,可編輯優(yōu)秀版資料,歡迎下載)
基于Android手機電子書閱讀器的設計與實現(xiàn)(完整資料)(可以直接使用,可編輯優(yōu)秀版資料,歡迎下載)鄭州大學畢業(yè)設計(項目報告)題目:手機電子書閱讀器的設計與實現(xiàn)指導教師:張淑艷職稱:講師學生姓名:王明學號:20117740444專業(yè):計算機科學與技術(軟件測試)院(系):軟件學院完成時間:2014年12月2014年12月29日目錄TOC\o"1—5”\u摘要PAGEREF_Toc409017214\h11項目開發(fā)目標PAGEREF_Toc409017215\h11.1項目來源PAGEREF_Toc409017216\h11。2開發(fā)目標PAGEREF_Toc409017217\h12項目總體設計PAGEREF_Toc409017218\h22.1技術框架設計PAGEREF_Toc409017219\h22。2數(shù)據(jù)庫設計PAGEREF_Toc409017220\h22.3功能框架設計PAGEREF_Toc409017221\h53項目功能描述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設置管理模塊功能描述PAGEREF_Toc409017231\h293。7使用幫助模塊功能描述PAGEREF_Toc409017232\h353.8關于模塊功能描述PAGEREF_Toc409017233\h364項目技術總結(jié)PAGEREF_Toc409017234\h384.1技術創(chuàng)新及特點PAGEREF_Toc409017235\h384.2個人收獲與體會PAGEREF_Toc409017236\h444。3致謝PAGEREF_Toc409017237\h44摘要?在這個快節(jié)奏的時代,人們的空余時間越來越零碎,而且人們對智能手機的依賴越來越重,所以,一個擁有豐富功能且能隨時進行電子書閱讀的電子書閱讀器的出現(xiàn),則是我們刻不容緩的事情.此軟件是在Android平臺上進行設計開發(fā),此軟件的開發(fā)是通過了客戶需求分析階段以及技術可行性分析階段,然后進行總體設計階段和詳細設計編碼等階段。此軟件不僅具有基本的電子書閱讀功能,而且還擁有豐富的實用功能設計,例如目錄自動生成以及閱讀界面設置、閱讀休息提醒等。經(jīng)過不斷的測試與完善,電子書閱讀器功能穩(wěn)定,并且在真機上對其進行了測試與驗證,基本上達到了用戶的需求標準。關鍵字:電子書閱讀器,Android,文件瀏覽,書架1項目開發(fā)目標1。1項目來源此次開發(fā)的項目是手機電子書閱讀器,屬于自選項目.隨著社會的發(fā)展,人們的生活節(jié)奏也越來越快空閑時間也越來越零碎,人們沒有了大段的時間來進行書籍的閱讀,所以一款能利用零碎時間進行隨時閱讀的軟件成為了我們的需求。而一款能在人們隨身攜帶的手機上運行的閱讀軟件成為了大家的選擇。以前我們看看雜志,小說都要去圖書館借閱,而且時間有限,很不方便;而在電腦上看雜志,看小說,文檔也是很不方便的。以此看來,一個好的手機閱讀器軟件的開發(fā)是相當有必要的。1.2開發(fā)目標手機電子書閱讀器的開發(fā)目標就是讓用戶可以把零碎的空余時間有效的利用到書籍的閱讀上,而且用戶在沒有網(wǎng)路的情況下也可以正常的進行書籍的閱讀,讓用戶擺脫書籍的笨重攜帶不方便等確定,給予閱讀者更大的便利性更好的舒適性。此軟件是在Android平臺上進行設計開發(fā),它的界面豐富簡潔但是卻不簡單,它包含了書架界面、文件查看界面、軟件設置界面、書籍閱讀界面等界面,它的功能全面.其優(yōu)越性表現(xiàn)在:自動掃描手機里的所有書籍、手動從文件夾中選擇添加書籍、自動為書籍生成章節(jié)目錄、添加查看書簽、全文關鍵詞搜索、閱讀主題選擇、閱讀字體大小設置等功能.此外,給用戶更清晰方便的界面,也是本軟件的出發(fā)點之一。2項目總體設計2.1技術框架設計手機電子書閱讀器采用了常見的三層架構,分別為UI層、業(yè)務邏輯層和數(shù)據(jù)層.UI層:數(shù)據(jù)展示與管理、用戶交互、繪制、Adapter。業(yè)務邏輯層:數(shù)據(jù)加式(數(shù)據(jù)層的數(shù)據(jù)有時候需要進行加工成UI層需要的數(shù)據(jù))、數(shù)據(jù)變化的通知機制數(shù)據(jù)層:數(shù)據(jù)訪問(SQLite、文件等)、緩存(圖片、文件等)、配置文件(sharedperference)此軟件的開發(fā)環(huán)境:Windows7+Eclipse4。2.0+SDK。UIViewsUIViewsDataAdapterUIBLDataObserverBLFileSQLiteDataProviderMemoryCacheLocalDataUtil/ConfigData圖1軟件框架結(jié)構2.2數(shù)據(jù)庫設計E-R圖是直觀表示概念模型的工具,它有四個基本成分:矩形框,表示實體類型。菱形框,表示聯(lián)系類型.橢圓形框,表示實體類型和聯(lián)系類型的屬性。對于關鍵碼的屬性,在屬性名下劃一橫線。直線,聯(lián)系類型與其涉及的試題類型之間以直線連接。圖2ER圖數(shù)據(jù)庫使用了2個實體,分別為書籍、書簽。書籍與書簽的對應關系為1:n。在數(shù)據(jù)庫的設計方面,為了實現(xiàn)數(shù)據(jù)庫的完整性與一致性,我們使用了觸發(fā)器,在數(shù)據(jù)庫的選用上,選擇了自給自足的、無服務器的、零配置的、事務性的SQL數(shù)據(jù)庫引擎的SQLite數(shù)據(jù)庫,數(shù)據(jù)庫名稱為eBook.db,共2個實體表,分別為書籍表、書簽表.與書籍(books)實體類的屬性信息對應的字段信息表如表1所示:字段名類型說明book_idINTEGER書籍編號book_nameTEXT書籍名稱book_pathTEXT書籍路徑file_sizeTEXT書籍大小last_readDATETIME閱讀時間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)實體類的屬性信息對應的字段信息表如表2所示:字段名類型說明idINTEGER書簽編號book_idINTEGER書籍編號percentDOUBLE位置比例contentTEXT書簽內(nèi)容posINTEGER書簽位置timeDATETIME添加時間表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功能框架設計圖3功能模塊圖手機電子書閱讀器軟件主要分為8個功能大模塊如圖3所示,分別是歡迎模塊、軟件主界面、書籍管理、閱讀管理、文件瀏覽、系統(tǒng)管理、使用幫助、關于。其中書籍模塊中還要文件掃描模塊,閱讀管理中有章節(jié)管理、書簽管理、搜索管理.系統(tǒng)設置中有密碼設置。其各個模塊的詳細設計如下:1。軟件歡迎模塊。該模塊主要實現(xiàn)的功能是,通過Handler來實現(xiàn)一個2秒的緩沖界面,然后通過SharedPreferences讀取配置文件,判斷是否有密碼。如果有密碼則跳轉(zhuǎn)至密碼驗證界面;如果沒有密碼則判斷是否為第一次使用此軟件,如果是第一次使用則跳轉(zhuǎn)至引導頁面。2.軟件主界面模塊。該模塊是一個通過TabHost標簽組件來實現(xiàn)的一個分類管理功能。本界面的標簽在屏幕的最下方,分別是:文件管理、我的書架、我的設置。點擊不同的標簽則顯示不同的界面,默認顯示標簽為“我的書架”,打開選項中會出現(xiàn)對應的視圖。實現(xiàn)了將本程序關聯(lián)成手機默認打開程序中,即從外部打開文本文件時選擇查看方式中會出現(xiàn)本軟件圖標供用戶選擇以本軟件打開.3.書籍管理。該模塊是以書架的模式來展現(xiàn)書籍,并可以對書籍進行一些操作,本模塊共有3個書架分別為:“最近閱讀"、“歷史閱讀”、“收藏閱讀”,默認顯示是“最近閱讀”書架.本模塊有導航按鈕和書籍選擇按鈕。當彈出導航欄時,則把書籍從每行顯示三本書籍調(diào)整到每行顯示兩本書籍。導航欄中與三大項:分類排序、添加書籍、清空書籍。每項里面又有子菜單。當點擊導航里的按鈕時會顯示子功能導航,當再點擊其它按鈕時,會收起前面的子功能導航,展開當前的子功能。當單擊書籍選擇按鈕時會彈出書籍選擇窗口,選擇里面的書架則進入相應的書架界面,同時還可以通過左右滑動來切換書架界面。當單擊書籍時會打開相應的書籍閱讀界面,長按某書籍時會彈出書籍操作窗口.4.文件瀏覽。該模塊使用ListView組件顯示文件目錄,不同的文件類型顯示不同的圖標.最上面標題欄有導航按鈕,當點擊導航按鈕時會從左側(cè)彈出導航欄,導航欄中有標記文件按鈕、分類排序按鈕和添加到書架按鈕,點擊標記文件按鈕或長按某文件或目錄時則切換到多選模式,其中有多選按鈕、反選按鈕和取消按鈕;點擊分類排序則彈出子菜單,其中有按名稱排序、按大小排序、按時間排序和按類型排序;點擊添加到書架時如果為選擇文件則自動進入多選模式讓用戶進行文件選擇,如果用戶未選擇則提示“請選擇書籍”,進行選擇是用戶可選擇文件或目錄,系統(tǒng)會自動進行掃描,把符合要求的文件添加到“最近書架”中,并彈出提示信息,其中有失敗個數(shù)、已存在個數(shù)和成功個數(shù)。在多選模式下點擊返回按鈕或點擊標記文件會取消多選模式。非多選模式下,用戶點擊文件時本軟件會根據(jù)文件擴展名來判斷打開文件方式,如果是文本文件則直接用本軟件打開,并把其添加到“最近書架”中,其它格式則調(diào)用對應的軟件打開,如果是未識別的類型則提示“沒有打開此文件的應用”。5.閱讀管理.該模塊通過自定義一個View視圖來顯示書頁,通過自定義類來讀取文本內(nèi)容并通過onDraw()方法把文件名、文本內(nèi)容、電量信息、時間信息和已讀百分比進行繪制成圖片,并通過View來把繪制的圖片顯示出來。第一次進入閱讀頁面是會有顯示引導頁面來指導用戶如何讀本頁面進行操作。本頁面操作包括點擊事件和滑動事件,點擊左側(cè)屏幕進行向上翻頁,點擊右側(cè)屏幕進行向下翻頁,點擊屏幕中間畫出菜單選項。此菜單是使用PopupWindow組件實現(xiàn),菜單分上下兩部分,上面的菜單有返回按鈕、屏幕亮度調(diào)節(jié)按鈕和添加書簽按鈕;下面的菜單有主題選擇按鈕、搜索按鈕、書簽按鈕、目錄按鈕、字體大小調(diào)節(jié)按鈕、翻頁方式按鈕、夜間模式切換按鈕和退出軟件按鈕。6。系統(tǒng)設置。系統(tǒng)設置模塊包括閱讀設置和系統(tǒng)設置。閱讀設置中有連續(xù)閱讀模式、閱讀完成時自動歸類、閱讀休息提醒和閱讀空閑退出.連續(xù)閱讀模式:下次啟動直接進入上次閱讀的界面進行繼續(xù)閱讀;閱讀完成時自動歸類:當書籍閱讀到最后一頁后對此書籍自動移至“歷史閱讀”書架中;閱讀休息提醒:設置一個時間,當用戶在閱讀頁面停留至這個時間時會彈出個提示框來提醒用戶進行休息;閱讀空閑退出:設置一個時間,當用戶停留在閱讀界面并且為對其未進行任何操作至這個時間時,系統(tǒng)會自動關閉本軟件。系統(tǒng)設置中有顯示隱藏文件、使用軟件密碼、退出確認、使用幫助和關于。顯示隱藏文件:當用戶選擇此設置后會在下次啟動本軟件時在文件瀏覽中顯示隱藏文件;使用軟件密碼:用戶可以對此軟件進行密碼設置;退出時確認:當選擇此設置后,退出軟件時會顯示一個確認框進行退出確認,未選擇此設置時則會直接退出本軟件;使用幫助:顯示本軟件的幫助信息;關于:顯示關于本軟件的信息。本軟件的設置信息全部使用SharedPreferences存儲.7。使用幫助。該模塊通過讀取幫助文件在TextView中顯示,并且為TextView添加滾動條。文件中含有本軟件的特點、功能介紹、操作說明等,。8。關于。該模塊的主要功能是通過一個簡單的彈出窗口來顯示本軟件的版本信息、聯(lián)系方式。3項目功能描述3.1軟件歡迎界面模塊功能描述圖4所示為歡迎界面模塊,此模塊作用是為了使軟件的進入更連貫自然,讓用戶不感覺界面的出現(xiàn)突兀。兩秒后跳入其它頁面,如果有密碼跳入密碼驗證頁面如圖6所示,如果是第一次啟動跳入引導頁面如圖5所示.圖4歡迎界面 ?圖5引導界面 ??圖6密碼驗證界面關于歡迎頁面啟動的代碼如下:newHandler().postDelayed(newRunnable(){?@Overridepublicvoidrun(){? Intentintent=null; initSaveData();//判斷是否有密碼if(share.getString(”mi_ma","").equals("")){ //判斷是否為第一次啟動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); 關于引導界面滑動事件代碼:@OverridepublicbooleanonTouch(Viewv,MotionEventevent){switch(event.getAction()){caseMotionEvent。ACTION_DOWN:{? //手指按下的X坐標 downX=event.getX();break;?}caseMotionEvent。ACTION_UP:{floatlastX=event.getX();??//抬起的時候的X坐標大于按下的時候就顯示上一張圖片if(lastX>downX){if(currentPosition〉0){? ? //設置動畫, 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(),"向右滑動",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設置引導頁面動畫,代碼如下(以向左滑動為例):<?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所示是軟件的主頁面,這是一個通過TabHost標簽組件來實現(xiàn)的一個分類管理功能.本界面的標簽在屏幕的最下方,分別是文件管理、我的書架、我的設置。點擊不同的標簽則顯示不同的界面,默認顯示標簽為我的書架,打開選項中會出現(xiàn)對應的視圖。實現(xiàn)了將本程序關聯(lián)成手機默認打開程序中,即從外部打開文本文件時選擇查看方式中會出現(xiàn)本軟件圖標供用戶選擇以本軟件打開。圖7軟件主界面初始化選項卡代碼如下:privatevoidinitTabs(){myTabHost=(TabHost)findViewById(R。id.TabHost1);myTabHost.setup(this.getLocalActivityManager()); //添加文件管理選項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)));//添加我的書架選項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))); //添加我的設置選項myTabHost。addTab(myTabHost ??。newTabSpec(”tab_setting”) ? 。setIndicator(composeLayout("我的設置”,R.drawable.setting))? ??。setContent(newIntent(this,MySetting.class) ?? ?.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)));myTabHost.setCurrentTab(1);myTabHost。setOnTabChangedListener(newOnTabChangedListener()); updateTab(myTabHost);}將程序關聯(lián)成Android系統(tǒng)默認打開程序代碼:〈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所示是書籍管理主頁面,最上面標題欄有導航按鈕和書籍選擇按鈕.當點擊導航按鈕時會從左側(cè)彈出導航欄如圖9所示,并把書籍從每行顯示三個調(diào)整到每行顯示兩個。當點擊導航里的按鈕時會顯示子功能導航,當再點擊其它按鈕時,會收起前面的子功能導航,展開當前的子功能.當單擊書籍選擇按鈕時會彈出書籍選擇窗口,選擇里面的書架則進入相應的書架界面,同時還可以通過左右滑動來切換書架界面。當單擊書籍時會打開相應的書籍閱讀界面,長按某書籍時會彈出書籍操作窗口如圖10所示,書籍操作窗口中有刪除閱讀記錄、刪除閱讀記錄和文件、移動到歷史書架、移動到收藏書籍、查看書籍詳情和分享本書,不同書架中的操作項略有不同。圖8書架效果頁面? ?圖9導航欄頁面??圖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_HISTORY);?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)至閱讀頁面進行閱讀代碼如下: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();}}書籍排序的核心代碼(以按時間排序為例):SimpleDateFormatformat(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+”》”+"這本書還不錯,分享給大家看看!”);sendIntent。setType("text/plain”);startActivity(sendIntent);點擊添加書籍中的快速掃描按鈕,進入此界面開始掃描,通過自定義文件名過濾類來進行搜索并顯示正在掃描界面,其中有掃描到的文件數(shù)目如圖11所示。掃描完成后使用ListView組件顯示掃描結(jié)果,最上面標題欄有返回按鈕、我的書籍標題、重新掃描按鈕。當長按某文件時則切換到多選模式如圖12所示,最上面標題欄改變?yōu)闃擞浫堪粹o、選中的文件數(shù)目顯示、加入書架按鈕、取消按鈕。多選模式下可以點擊文件進行逐個選擇,也可進行全選和取消全選操作。當用戶選擇是標題欄上會有對應的已選文件個數(shù)顯示.選好之后點擊加入書架將會把選中的文件加入最近書架中,也可以點擊取消則取消多選模式。 ?圖11正在掃描 ? ??圖12多選模式時時顯示掃描到的文件個數(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組件顯示文件目錄,不同的文件類型顯示不同的圖標如圖13所示。最上面標題欄有導航按鈕,當點擊導航按鈕時會從左側(cè)彈出導航欄如圖14所示,導航欄中有標記文件按鈕、分類排序按鈕和添加到書架按鈕,點擊標記文件按鈕或長按某文件或目錄時則切換到多選模式,其中有多選按鈕、反選按鈕和取消按鈕;點擊分類排序則彈出子菜單,其中有按名稱排序、按大小排序、按時間排序和按類型排序;點擊添加到書架時如果為選擇文件則自動進入多選模式讓用戶進行文件選擇,如果用戶未選擇則提示“請選擇書籍”,進行選擇是用戶可選擇文件或目錄,系統(tǒng)會自動進行掃描,把符合要求的文件添加到“最近書架"中,并彈出提示信息,其中有失敗個數(shù)、已存在個數(shù)和成功個數(shù)。在多選模式下點擊返回按鈕或點擊標記文件會取消多選模式。非多選模式下,用戶點擊文件時本軟件會根據(jù)文件擴展名來判斷打開文件方式如圖15所示,如果是文本文件則直接用本軟件打開,并把其添加到“最近書架”中,其它格式則調(diào)用對應的軟件打開,如果是未識別的類型則提示“沒有打開此文件的應用”。圖13文件瀏覽頁面 ?圖14文件瀏覽導航欄??圖15打開視頻文件文件路徑導航實現(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("存儲器"); ? }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)。toLowerCase();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)){?//設置文本打開方式為當前應用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,”沒有打開此文件的應用”,Toast.LENGTH_SHORT)。show();?? e.printStackTrace();??}?}}3.5閱讀管理模塊功能描述圖16所示是電子書閱讀主要頁面,本頁面通過自定義一個View視圖來顯示書頁,通過自定義類來讀取文本內(nèi)容并通過onDraw()方法把文件名、文本內(nèi)容、電量信息、時間信息和已讀百分比進行繪制成圖片,并通過View來把繪制的圖片顯示出來。第一次進入閱讀頁面是會有顯示引導頁面來指導用戶如何讀本頁面進行操作如圖17所示.本頁面操作包括點擊事件和滑動事件,點擊左側(cè)屏幕進行向上翻頁,點擊右側(cè)屏幕進行向下翻頁,點擊屏幕中間畫出菜單選項如圖18所示.圖16閱讀引導界面 圖17閱讀引導頁面? 圖18閱讀菜單此菜單是使用PopupWindow組件實現(xiàn),菜單分上下兩部分,上面的菜單有返回按鈕、屏幕亮度調(diào)節(jié)按鈕和添加書簽按鈕;下面的菜單有主題選擇按鈕、搜索按鈕、書簽按鈕、目錄按鈕、字體大小調(diào)節(jié)按鈕、翻頁方式按鈕、夜間模式切換按鈕和退出軟件按鈕.點擊主題選擇按鈕彈出主題選擇窗口如圖19所示,此選項共設置了9種主題供用戶選擇,當用戶選擇了主題閱讀頁面會自動改變?yōu)楫斍斑x擇的主題樣式;點擊屏幕亮度調(diào)節(jié)按鈕彈出屏幕亮度設置窗口如圖20所示,拖動屏幕亮度調(diào)節(jié)條屏幕亮度會隨著用戶的拖動而即時改變;點擊翻頁方式按鈕彈出翻頁方式設置窗口如圖21所示,此設置中共有三個按鈕代表了三種翻頁方式.圖19閱讀主題選擇? 圖20屏幕亮度設置? 圖21翻頁方式設置第一次進入閱讀界面顯示引導頁面的核心代碼實現(xiàn)為:if(share。getBoolean("is_first",true)){???firstDialog();? ?edit。putBoolean(”is_first",false);?? mit();}實現(xiàn)休息提醒和空閑退出代碼:@SuppressLint("HandlerLeak”)HandlermTimeHandler=newHandler(){publicvoidhandleMessage(Messagemsg){if(msg。what==1){???xiuxiDialog(); ?}if(msg.what==2){ ??SysApplication。getInstance()。exit();? }super。handleMessage(msg);?};};對應屏幕事件處理的核心代碼實現(xiàn)為:@OverridepublicbooleanonTouch(Viewv,MotionEvente){ mKXcont=0;if(e.getAction()==MotionEvent。ACTION_DOWN){//手指按下時??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){//移動時 ?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){//離開屏幕時 ?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;}設置窗口代碼實現(xiàn)(此處以字體大小調(diào)節(jié)設置窗口為例):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。seekbar_text); SeekBarseekbar=(SeekBar)myInputView.findViewById(R.id.seekBar1);?seekbarText.setVisibility(View.VISIBLE);?seekbar.setVisibility(View。VISIBLE);intsize=share。getInt("font_size”,35); seekbarText。setText(”當前字體大?。海ⅲ骾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);?seekbar。setOnSeekBarChangeListener(newMyOnSeekBarChangeListener());?confirm.setOnClickListener(newOnClickListener(){? @OverridepublicvoidonClick(Viewv){???dialog.hide();?? popupWindow。dismiss(); ?}?}); title.setText(”字體大小設置");?WindowManagerm=getWindowManager();?Displayd=m。getDefaultDisplay();//為獲取屏幕寬、高 WindowdialogWindow=dialog。getWindow(); android.view.WindowManager.LayoutParamsp=dialogWindow。getAttributes();//獲取對話框當前的參數(shù)值?dialogWindow.setGravity(Gravity。TOP);//寬度設置為屏幕的寬度 p。width=d.getWidth(); p。y=d.getHeight()/2-250;?dialogWindow.setAttributes(p);//設置生效 dialog.show();}3.5.1章節(jié)管理模塊功能描述首次進入章節(jié)查看界面時會進行章節(jié)提取,并顯示目錄生成中頁面如圖22所示,通過對前十章的章節(jié)字數(shù)進行記錄比較選擇一個較為合適的字數(shù)進行跳躍匹配以提高匹配效率,通過通過正則表達式來進行章節(jié)匹配且顯示目錄生成中界面并把結(jié)果通過JSON存儲到用戶手機中以便下次直接從JSON文件中讀取.目錄生成之后使用ListView組件顯示章節(jié)并定位到當前正在閱讀的章節(jié)并以醒目的顏色突出顯示出來,最上面標題欄有返回按鈕和重新生成按鈕.每個章節(jié)都有對應到刪除按鈕以便刪除錯誤的章節(jié)內(nèi)容如圖23所示。當點擊章節(jié)按鈕時跳轉(zhuǎn)的對應的章節(jié)進行閱讀。??圖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;//當前章節(jié)開始位置intstart1=-10000;//上章節(jié)開始位置intcount=0;//統(tǒng)計每章節(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é)查看主頁面,首次進入此界面開始進行章節(jié)提取,通過對前十章的章節(jié)字數(shù)進行記錄比較選擇一個較為合適的字數(shù)進行跳躍匹配以提高匹配效率,通過通過正則表達式來進行章節(jié)匹配且顯示目錄生成中界面并把結(jié)果通過JSON存儲到用戶手機中以便下次直接從JSON文件中讀取.目錄生成之后使用ListView組件顯示章節(jié)并定位到當前正在閱讀的章節(jié)并以醒目的顏色突出顯示出來,最上面標題欄有返回按鈕和重新生成按鈕。每個章節(jié)都有對應到刪除按鈕以便刪除錯誤的章節(jié)內(nèi)容。當點擊章節(jié)按鈕時跳轉(zhuǎn)的對應的章節(jié)進行閱讀。圖24書簽列表刪除單條標簽核心代碼如下: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搜索管理模塊功能描述搜索模塊是輸入要搜索的關鍵詞如圖25所示,點擊確定進行搜索顯示搜索中頁面,搜索完成后會在ListView中顯示搜索到的結(jié)果如圖26所示,其原理與章節(jié)提取類似,就不在此處格外敘述了。 圖25全文搜索 ?? ?圖26搜索結(jié)果列表3.6設置管理模塊功能描述設置管理模塊包括閱讀設置和系統(tǒng)設置如圖27所示。閱讀設置中有連續(xù)閱讀模式、閱讀完成時自動歸類、閱讀休息提醒和閱讀空閑退出。連續(xù)閱讀模式:下次啟動直接進入上次閱讀的界面進行繼續(xù)閱讀;閱讀完成時自動歸類:當書籍閱讀到最后一頁后對此書籍自動移至“歷史閱讀”書架中;閱讀休息提醒:設置一個時間,當用戶在閱讀頁面停留至這個時間時會彈出個提示框來提醒用戶進行休息;閱讀空閑退出:設置一個時間,當用戶停留在閱讀界面并且為對其未進行任何操作至這個時間時,系統(tǒng)會自動關閉本軟件。系統(tǒng)設置中有顯示隱藏文件、使用軟件密碼、退出確認、使用幫助和關于.顯示隱藏文件:當用戶選擇此設置后會在下次啟動本軟件時在文件瀏覽中顯示隱藏文件;使用軟件密碼:用戶可以對此軟件進行密碼設置;退出時確認:當選擇此設置后,退出軟件時會顯示一個確認框進行退出確認,未選擇此設置時則會直接退出本軟件;使用幫助:顯示本軟件的幫助信息;關于:顯示關于本軟件的信息。本軟件的設置信息全部使用SharedPreferences存儲。圖27系統(tǒ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(”關閉");}else{xiuXiMsg.setText(time+””);}dialog.dismiss();}});cancel.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){dialog.dismiss();}});input。requestFocus();input.selectAll();title。setText("閱讀休息提醒設置(分鐘)");WindowManagerm=getWindowManager();//為獲取屏幕寬、高Displayd=m。getDefaultDisplay();WindowdialogWindow=dialog.getWindow();android.view。WindowManager.LayoutParamsp=dialogWindow。getAttributes();//獲取對話框當前的參數(shù)值dialogWindow。setGravity(Gravity.TOP);//寬度設置為屏幕的寬度 p.width=d.getWidth();?p.y=80;//設置生效 dialogWindow。setAttributes(p);dialog.show();}點擊使用軟件密碼按鈕,進入密碼設置模塊有新密碼設置、密碼修改、密碼取消功能。第一次使用密碼時會打開密碼設置如圖28所示,讓用戶設置一個密碼,密碼設置頁面最上面有個返回按鈕,往下有個小的圖案顯示,可以顯示第一次繪制的圖像,再往下時主繪制界面讓用戶進行密碼圖案繪制,繪制的圖案中不能少于4個點。當用戶要修改或取消密碼時,要先進行密碼驗證如圖29所示,只有驗證同伙后才能進行密碼的修改或取消操作如圖30所示,并且本軟件不提供密碼找回功能。密碼繪制界面是自定義的一個ViewGroup組件。 圖28設置密碼? ?圖29驗證密碼??圖30修改或取消密碼密碼繪制界面添加圖標的核心代碼:privatevoidaddChild(){for(inti=0;i<9;i++){? ImageViewimage=newImageView(context);?image.setBackg
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 服裝采購合同違約責任
- 燃料油購銷合同樣本格式
- 終止勞動合同協(xié)議編寫
- 購銷合同與采購合同的關系
- 快餐盒銷售合同
- 金融投資顧問合同
- 網(wǎng)絡內(nèi)容推廣合同
- 借款合同范本的簡化版本解讀
- 企業(yè)員工培訓條款
- 精準廣告制作費用合同
- 2023年電大期末考試勞動與社會保障法
- GB/T 41805-2022光學元件表面疵病定量檢測方法顯微散射暗場成像法
- GB/T 6438-2007飼料中粗灰分的測定
- GB/T 33661-2017農(nóng)歷的編算和頒行
- 《鄉(xiāng)土中國》之《從欲望到需要》同步教學
- 國內(nèi)外總部基地研究多案例及經(jīng)濟分析課件
- 醫(yī)院管理案例分享:醫(yī)院人文關懷-華中科技大學同濟醫(yī)學院附屬協(xié)和醫(yī)院課件
- 風電場場內(nèi)集電線路建安工程施工組織設計
- 北師大版五年級上冊數(shù)學課件第1課時 倍數(shù)與因數(shù)
- 倉庫安全檢查記錄表
- 047模(擠)塑板檢驗作業(yè)指導書
評論
0/150
提交評論