標籤:
一、Android系統內建VideoView控制項
1. 建立步驟:
(1)內建視頻檔案放入res/raw檔案夾下;
(2)聲明初始化VideoView控制項;
(3)建立視頻檔案Uri路徑,Uri調用parse(),傳入(”android.resource://”+getPackageName()+”/”+R.raw.video)當前字串擷取資源路徑;
(4)為視頻控制項設定播放路徑,VideoView對象調用setVideoURI(),傳入Uri對象;
(5)開始播放,VideoView對象調用start();
2. 重寫控制項onMeasure(),設定VideoView的自訂寬高;MeasureSpec對象調用getSize()傳入widthMeasureSpec常量和heighMeasureSpec常量獲得螢幕寬度和高度,之後調用setMeasuredDimension(),傳入寬度和高度設定控制項的寬度和高度;
3. VideoView控制方法:
start():從當前位置啟動視頻;
pause():暫停視頻;
isPlay():判斷當前視頻是否在播放;
getDuration():獲得當前播放視頻的總時間長度(單位:毫秒);
getCurrentPosition():獲得當前視頻播放時間長度(單位:毫秒);
4. VideoView監聽事件:
setOnPreparedListener():視頻準備監聽,傳入實現MediaPlayer.OnPreparedListener介面的對象,重寫onPrepared(),視頻準備播放之後調用此方法;
setOnCompletionListener():視頻播放完成監聽,傳入實現MediaPlayer.OnCompletionListener介面的對象,重寫onCompleted(),在視頻播放完成之後調用此方法;
setOnErrorListener():視頻播放錯誤監聽,傳入實現MediaPlayer.OnErrorListener介面的對象,重寫onError(),在視頻播放出錯時調用此方法;
setOnTouchListener():觸摸監聽事件,傳入實現View.OnTouchListener介面的對象,重寫onTouch(),觸摸控制項之後調用此方法;
注意:該方法之後如果返回false,則event.getAction()只能監聽到MotionEvent.ACTION_DOWN,無法監聽到MotionEvent.ACTION_UP事件;而只有返回true,可以將觸摸事件向下分發,才能監聽MotionEvent.ACTION_UP事件;
5. VideoView與Seekbar結合的視頻播放控制項效果:
(1)初始化Seekbar和VideoView控制項;
(2)使用本地路徑建立Uri對象,Uri類調用靜態方法parse(),傳入資源路徑字串常量,視頻儲存路徑為res/raw檔案夾下,則字串常量值為:"android.resource://"+getPackageName()+"/" + R.raw.video_test;
(3)關聯VideoView的Uri路徑,VideoView對象調用setVideoURI(),傳入Uri對象;
(4)啟動VideoView播放視頻,VideoView調用start();
(5)為控制布局中的播放暫停按鈕設定點擊監聽事件,傳入實現onClickListener介面的對象,重寫onClick(),在此方法內判斷VideoView控制項的視頻是否播放,調用isPlaying(),如果現正播放,VideoView調用pause()暫停;否則VideoView調用start()開啟,之後擷取視頻當前播放進度和總時間長度,放入Handler對象的訊息佇列中延時1000ms發送;
(6)為VideoView控制項設值視頻播放監聽事件,調用setOnPreparedListener(),在重寫的onPrepared()中擷取當前播放進度和總時間長度,放入訊息佇列延遲1000ms發送;
(7)為Seekbar控制項進度條設值拉動監聽事件,調用setOnSeekBarChangeListener(),傳入實現SeekBar.OnSeekBarChangeListener()介面的對象,重寫onProgressChanged(),在該方法內判斷fromUser為true時為VideoView設定進度,調用seekTo()傳入使用者拖動進度;之後先清空訊息,再重新發送總時間長度和播放進度訊息;
(8)為VideoView控制項設定觸摸事件監聽,調用setOnTouchListener(),傳入實現OnTouchListener介面的對象,重寫onTouch(),在該方法內如果是按下事件,顯示底部導航,同時3000ms後發送訊息通知,隱藏底部導航;
(9)在訊息處理事件中,先判斷訊息類型,如果是控制進度條的訊息,重新設定進度條,之後再次發送VideoView的當前播放時間和總時間長度;如果是隱藏控制欄的訊息類型,則控制欄調用setVisibility(),傳入View.GONE;
二、Android系統底層SurfaceView控制項
1. SurfaceView與MediaPlayer結合使用,代替VideoView的原因:VideoView中內建MediaPlayer,在ListView中的Item中多次使用之後會使系統記憶體過大;
2. 使用步驟:
(1)布局檔案中建立SurfaceView控制項,在Activity中聲明並初始化該控制項;
(2)聲明並執行個體化MediaPlayer對象;
(3)擷取SurfaceHolder對象,用於改變SurfaceView的像素點,SurfaceView對象調用getHolder();
(4)SurfaceHolder對象調用addCallback(),傳入實現SurfaceHolder.Callback介面的對象,重寫三個方法:
方法1:surfaceCreate():當SurfaceView建立時調用此方法,在此方法內開啟視頻播放;
方法2:surfaceChanged():SurfaceView在像素點發生改變時調用此方法;
方法3:surfaceDestroy():SurfaceView在銷毀之後調用此方法;
(5)開啟視頻播放步驟:
(5-1)在視頻播放前重設MediaPlayer,MediaPlayer對象調用reset();
(5-2)擷取視頻地址,建立Uri對象,Uri類調用靜態方法parse(),傳入資源路徑,如“”android:resource://”+getPackageName()+”/”+R.raw.test”;
(5-3)改視頻播放器設定SurfaceHolder,MediaPlayer對象調用setDisplay(),傳入SurfaceHolder對象;
(5-4)關聯視頻播放地址,MediaPlayer對象調用setDataSource()傳入內容物件和Uri對象;
(5-5)開啟非同步準備視頻,MediaPlayer對象調用prepareAsync()即可;
(6)為MediaPlayer設定準備完成監聽事件,MediaPlayer對象調用setOnPreparedListener(),傳入實現MediaPlayer.OnPreparedListener介面的對象,重寫onPrepared(),在該方法內傳入的形參MediaPlayer對象調用start();
Android進階_視頻播放控制項