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() 這個方法。

好了,今天的博文就到這裏,也算是大功一件。

源碼地址下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章