![基于Vitamio的安卓端手機播放器設計和實現(xiàn)計算機專業(yè)_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/8/5908c390-3c16-4c45-9f4b-0979fb28023a/5908c390-3c16-4c45-9f4b-0979fb28023a1.gif)
![基于Vitamio的安卓端手機播放器設計和實現(xiàn)計算機專業(yè)_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/8/5908c390-3c16-4c45-9f4b-0979fb28023a/5908c390-3c16-4c45-9f4b-0979fb28023a2.gif)
![基于Vitamio的安卓端手機播放器設計和實現(xiàn)計算機專業(yè)_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/8/5908c390-3c16-4c45-9f4b-0979fb28023a/5908c390-3c16-4c45-9f4b-0979fb28023a3.gif)
![基于Vitamio的安卓端手機播放器設計和實現(xiàn)計算機專業(yè)_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/8/5908c390-3c16-4c45-9f4b-0979fb28023a/5908c390-3c16-4c45-9f4b-0979fb28023a4.gif)
![基于Vitamio的安卓端手機播放器設計和實現(xiàn)計算機專業(yè)_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/8/5908c390-3c16-4c45-9f4b-0979fb28023a/5908c390-3c16-4c45-9f4b-0979fb28023a5.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、題目基于Vitamio的安卓端手機播放器摘 要快捷、高效的生活節(jié)奏促使當今人們獲取消息新聞渠道的即時性、多元化。隨著網(wǎng)絡普及率、覆蓋率的不斷擴大和網(wǎng)絡速度的大幅提升,人們早已習慣通過移動手機觀看視頻來了解發(fā)生在當下的事情。眾所周知,各大應用市場都有各種各樣的基于android系統(tǒng)的播放器。本課題基于安卓系統(tǒng),從實用性、簡潔性出發(fā),設計一款可以播放本地視頻、獲取服務端json數(shù)據(jù)以及可接受外部輸入地址的視頻播放器。該視頻播放器是依賴Vitamio SDK,支持小屏與全屏手動切換、播放暫停、音量和亮度調(diào)節(jié)、實時顯示時間的功能。從功能需求到理論分析再到具體實現(xiàn),最終展示實現(xiàn)效果并且總結分析不足與收獲
2、。關鍵詞:android; Vitamio; json; 播放器Android cellphone video player based on the Vitamio SDKABSTRACTOn account of pace of the lifestyle has been quick and convenient, easy and efficient, it is of immediateness and diversity for people who live in this moment to gain news and information. With the popular
3、ity rate and spreading rate of the Internet becoming increased year by year, and the network speed becoming faster and faster, people have been accustomed to realizing and learning about the things which just happened by mobile phone on their hands watching the network videos at any time and in any
4、place.As we all know, there are various video players based on Android system in lots of popular application software markets. The project is also based on Android system. And put the practicability and conciseness as the first, designing a kind of video player which can play local-SDCard videos, ac
5、quire the json datas from windows web server and input known videos URI by users fingers. The next, this article will describe that this player depends on Vitamio SDK and videoview can support a lot of functions, such as switching small-screen or full-screen, achieving play or pause, adjusting volum
6、e or brightness and displaying system time. At last, the order to narrate this project is from function needs to theoretical analysis, from the analysis to the concrete realization, and the end which show final results or phenomena and summarize the harvest and the shorts during this project design.
7、Keywords:android;; Vitamio; json; video player目 錄摘 要iABSTRACTii第一章緒論- 1 -1.1課題背景目的與意義- 1 -1.1.1課題背景- 1 -1.1.2課題的目的及意義- 1 -1.2本文的主要內(nèi)容的結構安排- 2 -第二章軟件的需求及設計的準備- 3 -2.1 軟件需求分析- 3 -2.2 Android知識準備- 3 -2.3 關于Vitamio庫- 5 -2.2.1 如何將Vitamio庫放進項目工程中?- 5 -2.2.2 Vitamio庫中有什么?- 6 -2.3 搭建簡易的Windows Web服務器- 7 -2.3
8、.1 簡單搭建- 7 -2.3.2 客戶端如何與服務端通信?- 7 -第三章軟件設計- 8 -3.1 總體框架設計- 8 -3.1.1 總體流程圖,各頁面關系- 11 -3.2 軟件導航啟動頁設計- 13 -3.2.1 流程概括- 13 -3.2.2 代碼思想詳解- 13 -3.2.3 實現(xiàn)圖解- 16 -3.3 子頁面之本地視頻- 16 -3.3.1 流程概括- 16 -3.3.2 代碼思想詳解- 17 -3.3.3 實現(xiàn)圖解- 19 -3.4 子頁面之本地網(wǎng)絡- 20 -3.4.1 流程概括- 20 -3.4.2 代碼思想詳解- 21 -3.4.3實現(xiàn)圖解- 23 -3.5 子頁面其他非功
9、能性頁面- 23 -3.5.1 流頁面部分概述- 23 -3.5.2 關于我頁面- 24 -3.6 主要功能基于Vitamio的視頻播放頁面- 24 -3.6.1 流程概括- 24 -3.6.2 代碼思想詳解- 24 -3.7 應用程序清單和布局部分解釋- 27 -第四章測試部分- 29 -4.1播放頁面真機測試- 29 -4.1.1測試結論- 29 -結束語- 30 -致謝- 31 -參考文獻- 32 -v第一章 緒 論1.1 課題背景目的與意義1.1.1課題背景在信息科技飛速發(fā)展的今天,人們獲取信息、知識的方式也跟隨著發(fā)生了巨大的變化,便捷了我們的生活。從以前最開始的閱讀書報來了解社會國家
10、大事,到通過電視機觀看新聞,再到出現(xiàn)移動數(shù)據(jù)和寬帶網(wǎng)絡,同時也衍生出的一系列用于人們彼此間進行信息接收與交換的移動設備,如平板電腦、筆記本和手機。這些設備的屏幕尺寸、分辨率、硬件等方面各不相同,使得具備相同功能(例如視頻播放器)的應用,和實際上在這些設備上運用的應用也各有差異。從生活的各個角落我們都可以看到,無論是地鐵、公交站臺的廣告、還是商場廣場的LED屏都播放著各式的視頻。由此可見視頻是傳達信息的一種便捷、普遍而有效手段。而一款能夠具備穩(wěn)定播放視頻功能的播放器也更容易受到人們的青睞。根據(jù)有關數(shù)據(jù)顯示,我國擁有移動電話的用戶量呈現(xiàn)增長趨勢,擁有固定電話的用戶量呈現(xiàn)減小趨勢;移動電話用戶大部分
11、都使用3G/4G(移動寬帶)1。表明了現(xiàn)如今人們越來越追求高速的上網(wǎng)體驗。可移動智能設備應用的播放器需要依附于具體的系統(tǒng)。目前手機端主流的兩種系統(tǒng)有IOS系統(tǒng)和Android系統(tǒng)2。針對大部分用戶使用手機端系統(tǒng)的情況,使用Android系統(tǒng)用戶占的比重較大。Android具有的開放性,使得在這個平臺上做進一步的開發(fā)的可能性就越來越多3。但由于各個品牌手機的主打方向不同,使得手機硬件也各不相同。硬件上的差異和Android自帶庫關于視頻播放編解碼的局限性使得一些格式的視頻不能夠正常播放4。因此,涌現(xiàn)出了一批通過軟件編解碼能夠最大限度地支持各式視頻格式的視頻開源項目。Vitamio便是眾多用于視頻
12、開發(fā)的開源項目之一,并且因為它對于Android系統(tǒng)關于視頻方面的開發(fā)做得比較好,使得開發(fā)初學者更愿意使用它。Vitamio幾乎支持所有的常見視頻格式,如mp4、3gp、rtsp、rtmp等等。除此之外,還包含有一些非常人性化的功能,例如優(yōu)化了設備的CPU和GPU、支持手機和平板各種移動設備、對于視頻播放緩沖的支持和播放畫面的調(diào)節(jié)等等5。1.1.2課題的目的及意義當前各種樣式的播放器有很多,但抽離掉一些美觀的界面包裝元素,歸結到底,這些播放器大體上實現(xiàn)的都是關于視頻播放的一些基本功能(例如:播放、暫停、音量調(diào)節(jié)和亮度調(diào)節(jié)這些功能)。所以就目前來說,能夠依賴一款穩(wěn)定的視頻開源庫,并開發(fā)一款基于A
13、ndroid系統(tǒng)的手機視頻播放應用,是有非常好的應用前景的6。對于可以讓沒有多少視頻開發(fā)方面經(jīng)驗的人能夠輕松上手,有必要運用Vitamio SDK來對視頻播放的基本功能進行設計與實現(xiàn)。1.2 本文的主要內(nèi)容的結構安排本文設計的播放器是基于一個由國人研發(fā)的Android視頻開源項目Vitamio SDK,能夠播放幾乎所有視頻格式,功能強大,簡單易用。本文的具體結構安排如下:第一章 緒論:主要介紹該課題的研究背景、目的及意義。第二章 軟件的需求及設計準備:該章主要分析軟件一些功能需求及其設計中涉及的所需相關android知識儲備,例如:Android組件、Fragment概述、JSON基礎知識、線
14、程和有關把Vitamio庫添加到項目中的方法步驟,還有搭建簡易的Windows端web端服務器等等。第三章 軟件設計:從軟件整體框架著手,逐步介紹各個子頁面及主要視頻播放頁面的設計思路、實現(xiàn)方法及預期效果。子頁面的介紹都是依照由大到小、由粗到細的方法來進行的。第四章 最終實現(xiàn)及真機測試:該部分主要展示最終實現(xiàn)的效果圖以及真機測試的收獲總結。第二章 軟件的需求及設計的準備2.1 軟件需求分析本課題最主要部分是視頻播放的部分。理論上,需要播放本地格式的視頻和流地址的視頻,并且盡量讓視頻播放的控制頁面相同。視頻控制頁面都能控制視頻的播放和暫停,控制視頻音量的大小和亮度的高低。本設計對于視頻可支持的格
15、式要求是,能夠播放rtsp、rtmp和m3u8類型的媒體流,還有mp4、3gp類型的視頻。只需正確使用,Vitamio庫可以完全支持這些視頻格式。進一步地,在能夠成功播放指定要求類型視頻的基礎上,需要應用能夠?qū)崿F(xiàn)展示本地視頻并能點擊播放、接收服務器包含視頻流地址的JSON數(shù)據(jù)并解析,解析完后再展示并實現(xiàn)點擊播放,手動輸入視頻流地址并播放。2.2 android知識準備本部分只涉及到本課題所需要的核心android知識,是對第三章軟件設計思想那一部分的補充說明,比較零散,覆蓋并不全面。1. ActivityActivity的生命周期:Android四大組件之一:activity,它的生命周期就是
16、一個從啟動時的創(chuàng)建到最終用完后銷毀的過程2。#創(chuàng)建一個Activity時生命周期的方法執(zhí)行順序:onCreate()->onStart()->onResume();#銷毀Activity時生命周期的方法執(zhí)行順序:onPause()->onStop()->onDestroy()。#A頁面跳轉(zhuǎn)到B頁面,點擊返回,這個過程中的生命周期:有B完全覆蓋A和B不完全覆蓋A兩種情況,如下所述。1) 在B頁面完全覆蓋A頁面的情況下A跳轉(zhuǎn)B頁面的生命周期方法執(zhí)行順序onPause(A) ->onCreate(B)->onStart(B)->onResume(B)->
17、;onStop(B);B頁面點擊后返回生命周期的執(zhí)行順序:onPause(B)->onReStart(A)->onStart(A)->onResume(A)->onStop(B)->onDestroy(B)。2) 在B頁面不完全覆蓋A頁面的情況下A跳轉(zhuǎn)B頁面的生命周期方法執(zhí)行順序:onPause(A)->onCreate(B)->onStart(B)->onResume(B);B頁面點擊后返回生命周期執(zhí)行順序:onPause(B)->onResume(A)->onStop(B)->onDestroy(B)。#Activity的橫
18、豎屏切換生命周期:默認情況:onPause()->onStop()->onDestroy()->onCreate()->onStart()->onResume()。#屏蔽因為橫豎屏切換而導致生命周期重新執(zhí)行的解決方法:在清單文件中添加android屬性類型中的configChanges(此屬性用于捕獲手機狀態(tài)的改變狀況),讓這個的值為keyboardHidden、screenSize和orientation(這3個值之間用“|”間隔)。#Activity的跳轉(zhuǎn)利用intent顯示啟動:新建并實例化intent;用setClass(此處為當前Activity,此處為
19、想要或?qū)⒁D(zhuǎn)的Activity.class);利用startActivity啟動跳轉(zhuǎn)。2. Fragment、FrameLayout關于Fragment:Fragment與Activity相似,一樣有著它們的生命周期。但又不完全相同,因為通常使用Fragment時,實際上它像一個布局中的控件一樣,是被包含在Activity中的,這樣一來它的生命周期常常會受到Activity的生命周期的控制。Activity往往通過Fragment事務(具體的為:FragmentTransaction)對Fragment進行多個操作改變的控制7。關于FrameLayout:幀布局,它是一個容器;包含在幀布局的
20、組件在其內(nèi)部都占據(jù)一塊區(qū)域,每塊區(qū)域為一幀;android關于布局的gravity屬性,都會依照屬性具體值為這些幀找到對齊的位置8。3. JSON基礎JSON數(shù)據(jù),可以在text文本中進行編輯,且能在數(shù)據(jù)交換和傳輸信息效率發(fā)揮較好的作用。通常JSON文件中的內(nèi)容有對象和數(shù)組兩種結構。JSON對象由大括號括起來,里面的內(nèi)容是若干個鍵值對key:value組成,鍵值對間用逗號分隔開;key為屬性,value為屬性值(類型可以為數(shù)字、字符串、數(shù)組、對象);可以通過對象.key的方式獲取屬性值9。JSON數(shù)組由中括號括起來,數(shù)組中可以包含多個JSON對象。JSON文件的后綴名是“.json”,MIME
21、類型是application/json。4. Handler線程Handler存在的意義是它被用于傳遞并處理消息,可以為android主線程分攤緩解消息處理的壓力。一般情況下,Handler主要用于在新啟動線程中發(fā)送消息,在主線程中獲取并處理接收到的消息。Handler類中包含關于發(fā)送處理消息的函數(shù)方法,主要有如下:sendEmptyMessage(int what):此方法用于發(fā)送空消息,what的值可以是任意整型數(shù)。void handleMessage(Message msg):此方法通常被重寫,和被用于接收、處理消息。final boolean sendEmptyMessageDelay
22、ed(int what, long delayMillis):經(jīng)過多少毫秒后發(fā)送空消息。final boolean sendMessage(Message msg):發(fā)送消息。5. Http協(xié)議圖 1Http請求-響應模型由上圖的Http請求-響應模型可知,http協(xié)議最基礎的模式是:客戶端發(fā)送請求消息,服務端返回響應消息。本課題中,客戶端(手機端)利用已知的URL地址,對服務端發(fā)送請求(常用請求有:GET和POST),服務端返回響應碼給客戶端。通常響應碼有:200-OK-請求成功、400-Bad Request-客戶端請求語法錯誤、404-Not Found-請求資源地址(URL錯誤)不存在
23、等等。2.3 關于Vitamio庫2.2.1 如何將Vitamio庫放進項目工程中?以下步驟是基于AndroidStudio環(huán)境中添加Vitamio庫到項目工程文件里,完全個人摸索添加進工程,具體如下:a.首先,簡單講一下庫的下載及從Vitamio官方下載中心(網(wǎng)址:/Download/),下載AndroidStudio版的Vitamio5.2.3的壓縮包。解壓的壓縮包中有Vitamio庫文件夾和Vitamio-Sample文件夾。b.將Vitamio庫文件夾直接復制粘貼進項目工程中,修改Vitamio文件夾下的build.gradle的Compil
24、eSdkVersion為25、buildToolsVersion為“25.0.0”、minSDKVersion為14、targetSdkVersion為25,盡量將CompileSdkVersion、buildToolsVersion和targetSdkVersion版本號保持一致。c.在主工程下的setting.gradle添加includevitamio。d.在依賴vitamio的module文件目錄下的build.gradle中dependencies里添加compile project(:vitamio)。e.在module的manifest.xml文件中添加幾個權限<uses-
25、permission>(WAKE_LOCK/INTERNET/ACCESS_NETWORK_STATE/READ_EXTERNAL_STORAGE)。并且一定要在manifest文件中初始化vitamio。具體如下:<!-必須初始化-><activityandroid:name="io.vov.vitamio.activity.InitActivity" android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden|navig
26、ation"android:launchMode="singleTop"android:theme="android:style/Theme.NoTitleBar"android:windowSoftInputMode="stateAlwaysHidden"/>2.2.2 Vitamio庫中有什么?本部分只是針對于該設計涉及到內(nèi)容的部分介紹,所以并不十分全面。MediaPlayer類,用于控制音頻或者視頻和網(wǎng)絡流,可以從videoview中找到使用這個類的方法并使用需要的方法10。大部分情況下用法與android.me
27、dia.MediaPlayer相似。MediaPlayer里存在一個監(jiān)聽器OnInfoListener,當有視頻緩沖信息警告和錯誤時調(diào)用該監(jiān)聽。在這個監(jiān)聽中可以利用這些進一步處理發(fā)生的情況,分別有:開始緩沖(MEDIA_INFO_BUFFERING_START)、緩沖結束(MEDIA_INFO_BUFFERING_END)、下載速率變化(MEDIA_INFO_DOWNLOAD_RATE_CHANGED)。MediaPlayer里存在一個監(jiān)聽器OnBufferingUpdateListener,當播放網(wǎng)絡視頻流時,且視頻緩沖發(fā)生變化時調(diào)用該監(jiān)聽器。public void setVideoURI(
28、Uri uri):該方法用于設置視頻播放地址。public void setBufferSize(int bufSize):該方法用于設置視頻緩沖大小。public void setVideoQuality(int quality):該方法用于設置視頻播放畫質(zhì)。public void setOnInfoListener(OnInfoListener l):該方法用于設置視頻緩沖時的信息。VideoView中的存在一些方法: setVideoLayout方法,可以用來設置拉伸、全屏、鋪滿等視頻播放界面布局;pause方法可以用來暫停視頻播放;start方法可以用來恢復暫停的視頻,并繼續(xù)播放視頻。
29、2.3 搭建簡易的Windows Web服務器2.3.1 簡單搭建在Windows電腦中,首先找到并打開“Internet信息服務(IIS)管理器”,找到在自己計算機名稱目錄下的子項“網(wǎng)站”,右鍵新建網(wǎng)站。一般默認情況下,需要將想要通過web網(wǎng)頁讀取的文件放置在默認路徑,例如:C:inetpubMyWeb。這里的MyWeb是自己新建的,為了區(qū)分其他文件夾,里面用于存放通過web讀取處理的文件。然后,在彈出的添加網(wǎng)站窗口中,填寫網(wǎng)站名稱、應用程序池和物理路徑(選擇MyWeb目錄下的路徑),再下拉選擇綁定地址和填寫端口號。此時若點擊“啟動網(wǎng)站”,可以看到之前目錄下存放的文件,也能成功的在瀏覽器里打
30、開并查看文件。特別地,由于本實驗是存放JSON類型的文件。如果沒有在MMIE類型中添加相應關于JSON的設置,瀏覽器將不能成功查看該JSON文件內(nèi)容。進入MMIE類型設置,添加擴展名為.json,修改MMIE類型為text/JSON,修改條目類型為本地。2.3.2 客戶端如何與服務端通信?在簡單搭建電腦Web服務端之后,需要了解一下Android客戶端與Windows服務端通信的方式。本設計中客戶端與服務端的通信依賴http協(xié)議。在Android的庫中,存在一個. HttpURLConnection的類,此類可以訪問http資源。大體上是先發(fā)送一個請求,然后將請求的數(shù)據(jù)以流的形式讀取回來。具體
31、流程:創(chuàng)建一個URL對象用于指向需要請求數(shù)據(jù)的所在位置;利用HttpURLConnection實例化的對象從網(wǎng)絡中獲取請求后服務器返回的數(shù)據(jù);設置連接超時;對服務器響應發(fā)回的碼進行判斷;如果返回的是代表獲取成功的響應碼,就說明成功獲得了網(wǎng)絡中返回的數(shù)據(jù)流。第三章 軟件設計3.1 總體框架設計一個Android軟件功能的實現(xiàn)通常由布局xml文件和若干個Java代碼文件組成。本應用整體布局框架由Drawerlayout、Navigation和Basepager組成。本應用整體操作流程簡述:手機桌面點擊起始啟動頁面過后進入歡迎面,然后進行具體功能項選擇。經(jīng)過啟動頁面之后,用戶就正式進入應用。首先映入
32、眼簾的是歡迎界面,歡迎界面由一個圖片和一句話組成。隨后,用戶用手指從屏幕的左端向右滑動(或者用手指點擊屏幕左上角的圖標)展開本應用的菜單,然后點擊選擇各個子功能。若想要關閉菜單,可以用手指左滑(或者點擊屏幕右側陰影處)。抽屜布局(DrawerLayout)是出自android官方自帶的V4包,即android.support.v4.widget.DrawerLayout。導航視圖(NavgavitionView)則是出自android中自帶的design包,即(android.support.design.widget.NavigationView)。圖 2核心視圖布局框架展示圖從上圖,可以顯
33、而易見地看出導航視圖(NavigationView)位于抽屜布局(DrawerLayout)中的左側部分;導航視圖的寬度是小于抽屜布局內(nèi)容布局的寬度的。導航視圖布局由一個自定義的頭部布局(包含一張圖)和一個menu組成。展開說明如下:NavigationView布局中設置android:layout_gravity="start"(或值為“l(fā)eft”)屬性,表示其在抽屜布局的左邊。在右滑(打開菜單)和左滑(收起菜單)時,需要保證手機屏幕頂部的狀態(tài)欄(statusbar)的背景統(tǒng)一。打開菜單時跟隨系統(tǒng)背景,關閉菜單時是透明色??梢酝ㄟ^在樣式文件中添加兩個屬性在主題中,設置an
34、droid:windowDrawsSystemBarBackgrounds的值為true,設置android:statusBarColor的值為android:color/transparent。前者表示,應用程序的主題(theme)是通過繼承而來的,需要確保系統(tǒng)能繪制狀態(tài)欄(statusbar);后者表示,狀態(tài)欄設置為透明狀態(tài),此時的狀態(tài)欄系統(tǒng)無法控制就交由抽屜布局控制。在代碼中抽屜布局設置,可以通過setStatusBarBackgroundColor設置此時statusbar的顏色,同時抽屜布局文件中也要添加android:fitsSystemWindows="true&quo
35、t;屬性。導航視圖中菜單欄的各個菜單項(item)需要具備每一項的獨立性。為了在點擊事件發(fā)生時,能夠正確跳到各項功能頁面。因此在menu布局中,可以設置各個Item標簽所在group的屬性checkableBehavior值為single,或者也可以添加每一個item標簽的屬性checkable值為: true。在選擇菜單項中各項功能時,為了方便用戶在打開抽屜時知曉當前選擇了哪一項,通過如下思路,為菜單每一項設置了改變顏色狀態(tài)(菜單項中包含圖片和文字顏色統(tǒng)一都改變,選中時是藍色,未選中的為灰色),具體思路如下:設置兩個數(shù)組,一個二維數(shù)組(用于保存選中與未選中狀態(tài))由兩個一維數(shù)組組成,另一個數(shù)組
36、用于保存選中時的顏色和未選中時的顏色;將兩個數(shù)組放在顏色狀態(tài)列表(ColorStateList)里;導航視圖分別設置菜單項圖標顏色和文字顏色。關于點擊每一個菜單項在屏幕底部出現(xiàn)短暫顯示的提示條??梢岳肧nackbar,它是一種類似于Toast和Dialog的,具有反饋性的控件。它能夠出現(xiàn)在手機屏幕中所有視圖的上方,并且顯示一段時間后自動消失。實現(xiàn)應用的各個功能需要以頁面的方式展示,每一個頁面都存在于一個fragment中。每一個頁面都有一個共通點,即都是由視圖和數(shù)據(jù)處理實現(xiàn)相應功能的。現(xiàn)將各個子頁面繼承自一個基類。通過創(chuàng)建一個抽象公共類BasePager作為子頁面的基類(或者說父類)。該類中
37、,創(chuàng)建一個View用于接受各個子頁面返回的實例、創(chuàng)建context用于在構造方法中通過上下文與頁面視圖去實現(xiàn)同一個initView抽象方法,進而實現(xiàn)各個子頁面的視圖。BasePager中還存在兩個方法分別是initView和initData。 initView抽象化的目的是使得每個子類頁面必須通過實現(xiàn)該方法才能實現(xiàn)頁面。initData是一個沒有返回值的公共方法,其目的是當頁面中存在數(shù)據(jù)綁定(例如listView綁定適配器)時處理該方法。此外,還要在該類中設置一個布爾類型的變量isInitData用于避免出現(xiàn)頁面數(shù)據(jù)重復初始化。在Activity中創(chuàng)建一個BasePager類型的數(shù)組(Arra
38、yList),用來存放子頁面。設置整型變量position,用來標記子頁面在數(shù)組中位置。展開說明如下:為導航視圖(NavigationView)的菜單項設置監(jiān)聽,用于跳轉(zhuǎn)到對應頁面。在監(jiān)聽事件中,通過判斷每個子菜單的id來區(qū)分每個頁面,與此同時給每一頁面設置一個position值。例如,當點擊“本地視頻”頁面時position值為0,點擊“本地網(wǎng)絡”頁面時position值為1,點擊“流”頁面時position值為2,點擊“關于我”頁面時position值為3。之后,經(jīng)過每一次判斷子頁面,得到頁面位置position后,需要將頁面放入放入fragment中。單獨創(chuàng)建兩個私有類型的方法setFr
39、agment和getBasePager。setFragment的作用是在acitivity中把頁面添加到fragment中。getBasePager的作用是根據(jù)position位置得到該位置所對應的頁面。核心代碼:private void setFragment() /1.得到FragmentMangerFragmentManager manager = getSupportFragmentManager();/2.開啟事務FragmentTransaction ft = manager.beginTransaction();/3.替換容器內(nèi)的fragmentft.replace(R.id.f
40、l_main_content,new TestFragment(getBasePager();/4.提交事務mit();代碼中,R.id.fl_main_content是一個幀布局的布局資源id,用來存放每一個實例化fragment子頁面的布局。此外,各個子頁面顯示的內(nèi)容布局也都是幀布局(FrameLayout)。FragmentManager一般被用于在activity中管理fragment。需要注意,F(xiàn)ragment類必須實例化為單獨的類TestFragment,否則出錯。附加退出程序的小功能,在activity中重寫onKeyDown方法,判斷是否有按下鍵,創(chuàng)建系統(tǒng)自帶主題的對話框(al
41、ertdialog)用于提醒用戶是否退出程序。在對話框中,用setTitle設置對話框標題,setMessage設置消息信息,添加兩個按鈕(一個退出,一個回到程序)并設置按鈕監(jiān)聽。3.1.1 總體流程圖,各頁面關系圖 3軟件總體框架流程圖圖 4軟件總體子頁面關系流程圖圖 5子頁面布局關系圖3.2 軟件導航啟動頁設計3.2.1 流程概括為了給用戶提供一個更好的體驗,通常需要給應用程序添加一個導航頁面。當打開視頻播放器時,頁面全屏循環(huán)播放小視頻。用手指滑動頁面,就會全屏循環(huán)播放另一個小視頻。當用戶處在啟動頁面,不小心點擊返回鍵,在屏幕下方會彈出Toast提示條“再按一次退出”。如果沒有再按返回鍵,
42、可以繼續(xù)。點擊第三個頁面中的“立即體驗”,用戶算是進入視頻播放器內(nèi)部,進行播放器選擇功能的體驗。3.2.2 代碼思想詳解實現(xiàn)導航啟動頁的是ViewPagerActivity。ViewPagerActivity繼承自FragmentActivity并且設置實現(xiàn)ViewPager類下的OnPagerChangeListener(監(jiān)聽頁面改變)接口。在該activity被onCreate創(chuàng)建方法中分別執(zhí)行initView(頁面初始化)和initDots(初始化“小點”)。其中,initView方法用于在activity中獲取ViewPager布局文件內(nèi)容、實例化三個fragment、創(chuàng)建并設置Vie
43、wPager適配器和添加ViewPager的頁面改變監(jiān)聽。initDots方法的作用是,設置滑動三個頁面時,那三個ImageView(點)的狀態(tài)動態(tài)改變實現(xiàn)。動態(tài)改變?nèi)齻€ImageView具體關鍵代碼及思路如下:1. 獲取三個ImageView所處父集合(ViewGroup)的布局線性布局。利用循環(huán),依次從布局文件中獲取三個ImageView,并賦給事先創(chuàng)建好的ImageView類型數(shù)組,且每個ImageView都設為默認灰色,默認第一個ImageView為白色,代表選中狀態(tài);2. 為使其他ImageView狀態(tài)能夠改變,創(chuàng)建一個方法setCurrentDot的方法,并將其設置在onPageS
44、elected(可以為其傳遞一個當前選中的位置,暫且為設變量position)中;3. 對于setCurrentDot方法,如果傳遞過來的position不等于currentIndex且沒有越出三個的個數(shù)范圍(position在02之間),就將之前被選中的ImageView(位置為currentIndex)顏色設為默認灰色,當前選中“點”(position)顏色設為白色,并將position賦給currentIndex,為下一次狀態(tài)改變做準備。簡單介紹一下ViewPager.OnPagerChangeListener:該接口下有三個方法,分別是onPageScrollStateChanged(
45、如果滑動狀態(tài)改變時調(diào)用)、onPageScrolled(如果當前頁面被滑動時調(diào)用)和onPageSelected(如果新的頁面被選中時調(diào)用)。導航頁面(ViewPager)本身是由三個fragment的集合(List<fragment>)組成,分別為frament1、fragment2、fragment3。為了避免三個fragment重疊的問題,使用ViewPagerAdapter(繼承自FragmentPagerAdapter),給ViewPager設置適配器。三個fragment中播放短視頻思路:1. 整體概述:三個fragment都是通過調(diào)用自定義的VideoView播放工程
46、下raw目錄中的3個短視頻。不同的是,第三個fragment中添加了Button控件,用于跳轉(zhuǎn)到下一個activity。2. 在每個fragment中的onCreateView方法中,首先,獲取以View為格式的對應布局(前提是,每個布局中包含自定義VideoView的布局)。然后,通過view.findViewById()獲取布局文件里VideoView,為其設置播放路徑并播放。3. 最后,設置VideoView播放完成監(jiān)聽,并通過監(jiān)聽實現(xiàn)視頻的自動循環(huán)播放。關鍵代碼:public void onCompletion(MediaPlayer mp) videoview.start();/播放
47、完,再一次重頭播放 4. fragment3中通過一個按鈕控件跳轉(zhuǎn),跳轉(zhuǎn)后要將導航頁的activity銷毀,關鍵跳轉(zhuǎn)代碼如下:Intent intent = new Intent(getActivity(), NavigationViewActivity.class);getActivity().startActivity(intent);getActivity().finish();/銷毀activity關于自定義的播放視頻頁面的說明,出于其功能需求單一(僅僅播放幾秒鐘的小視頻),所以將其繼承自android.widget.videoview。為了能夠使視頻界面能夠豎直滿屏的播放,在自定義的
48、videoview中重寫了onMesure方法,用于重新計算視頻的寬高(getDefaultSize)并存儲視頻的寬高(setMeasuredDimension);重寫setOnPreparedListener用于當視頻被加載且準備播放的情況。除此之外,為了防止在啟動程序時人為誤觸導致意外退出,在導航頁添加了返回鍵監(jiān)聽。當初次點觸返回鍵時,會利用Toast彈出提示“再按一次退出程序”,以提醒用戶;當再次點觸返回鍵時,將立即退出應用程序。具體想法如下:通過導航頁所在的activity中重寫onKeyDown方法,在該方法下先判斷是否有按鍵被按下。如果有,再判斷,按下的鍵是否是返回鍵且僅按一次。如
49、果是,就再次判斷下一次按下的時間距離上一次按下時間是否間隔超過2秒,超過的話就不退出,沒超過就退出。關鍵代碼:Override public boolean onKeyDown(int keyCode, KeyEvent event) if (event.getAction()=KeyEvent.ACTION_DOWN) if (keyCode=KeyEvent.KEYCODE_BACK && event.getRepeatCount()=0) isExit(); return true; return false; private void isExit() if (Syst
50、em.currentTimeMillis() - mExitTime >2000) Toast.makeText(this,"再按一次退出程序",Toast.LENGTH_SHORT).show(); mExitTime=System.currentTimeMillis(); else finish(); System.exit(0); 注: getRepeatCount函數(shù)返回的值是計算重復觸摸或按鍵的次數(shù),有一次即返回值為0;mExitTime的作用是獲得當前按鍵事件發(fā)生的時間。3.2.3 實現(xiàn)圖解圖 6啟動頁面實際效果圖3.3 子頁面之本地視頻3.3.1 流程概
51、括進入應用后,初次選擇本地視頻頁面會有一個加載視頻等待的過程,根據(jù)視頻個數(shù)的多少,處理時間不同。然后展現(xiàn)出所有本地視頻列表,每一項包含一個代表視頻的圖標、視頻的名稱、視頻的時長、視頻占內(nèi)存大小。點擊任意一項即可立即進入該視頻的播放頁面。圖 7本地視頻布局頁面圖3.3.2 代碼思想詳解從本地的SDCard得到本地視頻數(shù)據(jù),通常的解決方法是遍歷所有視頻類型的后綴名,但是過于繁瑣,效率較低。為提高獲取效率,可以根據(jù)內(nèi)容提供者,從中獲取視頻信息。在子線程中獲取本地視頻信息,將獲取的本地視頻信息放入集合中。安卓系統(tǒng)中存在一個內(nèi)容提供者,它通常包含聯(lián)系人信息、系統(tǒng)中的音視頻信息等等。既然有提供者,相輔相成
52、地也存在著內(nèi)容解析者。要想獲得手機SDCard上的視頻信息,首先得知道它所在內(nèi)容提供者的Uri。查詢Android相關技術文檔,得到SDCard中視頻屬于外部存儲器,其內(nèi)容提供者Uri為:MediaStore.Video.Media.EXTERNAL_CONTENT_URI。其次用一個數(shù)組存放想要查詢的具體數(shù)據(jù)列名。最后調(diào)用內(nèi)容解析者的query方法,遍歷查詢特定列名的數(shù)據(jù)。根據(jù)query方法返回的是一個光標(光標Cursor指向列名),當不存在視頻時,光標會返回為空。再利用Cursor.moveToNext循環(huán)獲得視頻的名稱、時長、文件大小及視頻的絕對地址。將獲取到的視頻信息字段裝入一個Be
53、an類(MediaItem)中,方便接下來對于各個信息的設置及獲得。每一MediaItem代表一條視頻。一般情況下,獲取的視頻不止一條,可將各個視頻信息放入一個MediaItem類型的數(shù)組集合中。光標Cursor每循環(huán)一次,創(chuàng)建一個MediaItem(即,一條視頻信息,MediaItem中利用Setter方法設置視頻信息),然后再將MediaItem添加進數(shù)組集合里。當光標指到下一列名為空時,跳出循環(huán),并且釋放光標。此時所有本地視頻已經(jīng)取完。將所有本地視頻信息以列表ListView的形式展示在手機屏幕里。沒有視頻的時候展示“沒有本地視頻”的視圖,有視頻的時候展示視頻列表。當在子線程中才處理完獲
54、取視頻的部分后,不管有沒有視頻,都需要通過handler發(fā)送一個空消息(Message)給主線程。一般當handler需要處理多種情況時,才會發(fā)送非空消息。主線程接收到子線程消息后,負責處理設置ListView適配器和在有無數(shù)據(jù)時的文本控件顯示。主線程中,當有視頻數(shù)據(jù)時設置適配器且隱藏布局中文本,當沒有數(shù)據(jù)時顯示布局中的文本。有一個小細節(jié),無論有沒有數(shù)據(jù)都需要隱藏ProgressBar,否則會一直存在,影響用戶觀感。本地視頻頁面適配器因為每一個視頻頁面的基類都是BasePager,所以頁面的適配器需要繼承自BaseAdapter。單獨自定義一個本地視頻列表Adapter適配器的類:為了方便在在
55、其他地方實例化自定義的適配器,在類中運用構造方法。在該適配器中需要重寫4個方法:getCount,getItem,getItemId,getView。下面簡單介紹一下這四種方法:getCount():該方法的返回值控制該Adapter將會包含列表項的個數(shù)。getItem(int position):該方法的返回值決定第position處的列表項的內(nèi)容。getItemId(int position):該方法的返回值決定第position處的列表項的ID。getView(int position ,View convertView ,ViewGroup parent):該方法的返回值決定第posi
56、tion處的列表項組件。ListView顯示列表的本質(zhì)是一個一個子項顯示的。每一個子項的顯示都需要適配器調(diào)用它的getView方法。getView方法返回的是每個子項的視圖。創(chuàng)建視圖需要用到inflate方法加載布局文件。如果子項的個數(shù)特別多,會占用內(nèi)存,進一步會影響每一個子項加載的速度。其中getView方法中convertView視圖,表示ListView上滑時超出手機屏幕顯示的子項(item)的視圖。通常情況下,因為滑動列表而超出屏幕的convertView視圖會被緩存,所以可以在getView方法中重用convertView視圖來節(jié)省一部分內(nèi)存消耗。在getView方法中,判斷conv
57、ertView視圖是否為空。如果是,用inflate創(chuàng)建出一個子項視圖,然后通過findViewById方法找到控件加載視圖數(shù)據(jù),再將視圖數(shù)據(jù)返回到底層展示出來。從中得到,在資源文件中同一個id,會在每一次調(diào)用getView方法的時候重新查找該id的控件和給控件賦值及其他重復性操作。由于在getView方法中已經(jīng)存在查找控件的操作,通過在適配器類中構建一個內(nèi)部靜態(tài)類ViewHolder(靜態(tài)類只會在初次加載時耗時,之后就會快很多),該類中的變量類型與視頻子項中控件類型一致。再把子項的控件放入ViewHolder中,然后利用view.setTag將此時的ViewHolder類作為view類型存入到子
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年農(nóng)業(yè)策劃與技術信息交流合作規(guī)劃協(xié)議
- 2025年企業(yè)戰(zhàn)略融資及風險投資咨詢服務合同
- 2025年個體勞動者之間的互援協(xié)議
- 2025年產(chǎn)品市場發(fā)展戰(zhàn)略合作協(xié)議
- 2025年企業(yè)增資擴股合同范本解析
- 2025年企業(yè)物業(yè)管理外包合同范文文本
- 2025年勞動合同續(xù)簽與留用規(guī)定概要
- 2025年住房租賃協(xié)議樣本文本
- 2025年飯食店鋪股權買賣合同樣本
- 2025年企業(yè)員工試用期合同標準文本
- 歸檔文件整理規(guī)則
- 醫(yī)院輸血管理委員會工作總結
- 海淀高科技高成長20強暨明日之星年度報告
- 不停電作業(yè)標準流程及表格
- (建筑電氣工程)電氣系統(tǒng)調(diào)試方案
- 2022年煤礦事故應急救援演練方案
- 新人教版八年級下冊初中物理全冊課前預習單
- 第三章-隋唐佛教宗派的興盛與思想發(fā)展課件
- 中國典章制度ppt課件
- 高考古代詩歌鑒賞復習教案
- 負數(shù)的認識1202
評論
0/150
提交評論