Android簡單視訊播放器之VideoView(一)
早上起來有時間,發一篇博文,最近在開發電視機頂盒的視訊播放,涉及到Android當中比較常見的視訊播放器控制元件的使用,以此為例,記錄下來。
首先,上效果圖:
通過VideoView播放視訊的步驟:
實現方式:使用XML佈局和java程式碼控制元件繫結的形式。
1、在介面佈局檔案中定義VideoView元件。
2、呼叫VideoView的如下兩個方法來載入指定的視訊
setVidePath(String path):載入path檔案代表的視訊
setVideoURI(Uri uri):載入uri所對應的視訊
3、呼叫VideoView的start()、stop()、psuse()方法來控制視訊的播放
4、VideoView通過setMediaController()方法與MediaController類結合使用,來控制播放、暫停和快進快退。
setMediaController(MediaController mediaController);
下面上程式碼,主介面MainActivity.java :
public class MainActivity extends Activity {
VideoView mVideoView1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 播放網路視訊
// Uri uri = Uri
// .parse("http://vfx.mtime.cn/Video/2016/03/16/mp4/160316113358220143.mp4 ");
// 播放本地視訊
Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getPath()
+ "/Launcher/09.mp4" );
mVideoView1 = (VideoView) this.findViewById(R.id.mVedioView1);
MediaController mediaController = new MediaController(this);
mVideoView1.setMediaController(mediaController);
mVideoView1.setVideoURI(uri);
// mVideoView1.requestFocus();
mVideoView1.start();
}
}
對應的介面佈局 activity_main.xml :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.test_mediaplayer.MainActivity" >
<com.example.test_mediaplayer.WrapVideoView
android:id="@+id/mVedioView1"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</com.example.test_mediaplayer.WrapVideoView>
</LinearLayout>
會發現,佈局中使用個並不是VideoView,而是自定義的WrapVideoView,那麼為什麼要自定義呢?
原因很簡單,Android 的VideoView控制元件在 onMeasure(int widthMeasureSpec, int heightMeasureSpec)
方法中對控制元件的寬高進行了操作,使得視訊的寬高根據實際寬高進行了縮放,如果直接使用VideoView,則會導致如下效果:
可以看到視訊的高正常,但是寬並沒有佔滿全屏,所以,我們可以自己定義一個類來繼承VideoView,重寫onMeasure()
方法。
WrapVideoView.java:
public class WrapVideoView extends VideoView {
public WrapVideoView(Context context) {
super(context);
requestFocus();
}
public WrapVideoView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public WrapVideoView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = getDefaultSize(getWidth(), widthMeasureSpec);
int height = getDefaultSize(getHeight(), heightMeasureSpec);
setMeasuredDimension(width, height);
}
}
這樣一來,呈現的介面就和第一張效果圖一樣了,是不是感覺有點成就感,哈哈。
如果有時間有興趣的話,讀者可以自己去VideoView的原始碼看一下 onMeasure()
這個方法。
好了,今天的博文就到這裡,也算是大功一件。