一、Android系統自帶VideoView控制項 1. 創建步驟: (1)自帶視頻文件放入res/raw文件夾下; (2)聲明初始化VideoView控制項; (3)創建視頻文件Uri路徑,Uri調用parse(),傳入(”android.resource://”+getPackageName()+” ...
一、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();