1. 程式人生 > >Android上定義播放器控制元件UniversalVideoView

Android上定義播放器控制元件UniversalVideoView

在Android上播放視訊最簡單的方法是使用SDK中內建的VideoView,然後加上MediaController來控制視訊播放暫停等,但是這樣有一個缺點是無法定製自己的控制UI,所以這裡提供一個自定義播放控制元件,它可以設定多種自定義屬性(如loading樣式,錯誤視訊等),並且很容易在全屏與非全屏之間切換,另外支援Android V2.3及以上系統.

使用方法

完整的使用方法請參考專案裡的Sample.


1. 在build.gradle檔案上加入以下依賴包.

dependencies {
      compile 'com.linsea:universalvideoview:1.1.0@aar'
 }

2. 在佈局檔案中加入自定義View,注意要使UniversalVideoView和UniversalMediaController位於同一個父Layout中, 這樣控制條才會浮在視訊之上.
            <FrameLayout
                android:id="@+id/video_layout"
                android:layout_width="fill_parent"
                android:layout_height="200dp"
                android:background="@android:color/black">

                <com.universalvideoview.UniversalVideoView
                    android:id="@+id/videoView"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:layout_gravity="center"
                    app:uvv_autoRotation="true"
                    app:uvv_fitXY="false" />

                <com.universalvideoview.UniversalMediaController
                    android:id="@+id/media_controller"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    app:uvv_scalable="true" />

            </FrameLayout>

3. 在onCreate方法中設定相關事件的監聽.

View mBottomLayout;
View mVideoLayout;
UniversalVideoView mVideoView;
UniversalMediaController mMediaController;

mVideoView = (UniversalVideoView) findViewById(R.id.videoView);
mMediaController = (UniversalMediaController) findViewById(R.id.media_controller);
mVideoView.setMediaController(mMediaController);

mVideoView.setVideoViewCallback(new UniversalVideoView.VideoViewCallback() {
    @Override
    public void onScaleChange(boolean isFullscreen) {
        this.isFullscreen = isFullscreen;
        if (isFullscreen) {
            ViewGroup.LayoutParams layoutParams = mVideoLayout.getLayoutParams();
            layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
            layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT;
            mVideoLayout.setLayoutParams(layoutParams);
            //設定全屏時,無關的View消失,以便為視訊控制元件和控制器控制元件留出最大化的位置
            mBottomLayout.setVisibility(View.GONE);
        } else {
            ViewGroup.LayoutParams layoutParams = mVideoLayout.getLayoutParams();
            layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
            layoutParams.height = this.cachedHeight;
            mVideoLayout.setLayoutParams(layoutParams);
            mBottomLayout.setVisibility(View.VISIBLE);
        }
    }

    @Override
    public void onPause(MediaPlayer mediaPlayer) { // 視訊暫停
        Log.d(TAG, "onPause UniversalVideoView callback");
    }

    @Override
    public void onStart(MediaPlayer mediaPlayer) { // 視訊開始播放或恢復播放
        Log.d(TAG, "onStart UniversalVideoView callback");
    }

    @Override
    public void onBufferingStart(MediaPlayer mediaPlayer) {// 視訊開始緩衝
        Log.d(TAG, "onBufferingStart UniversalVideoView callback");
    }

    @Override
    public void onBufferingEnd(MediaPlayer mediaPlayer) {// 視訊結束緩衝
        Log.d(TAG, "onBufferingEnd UniversalVideoView callback");
    }

});

注意:
UniversalVideoView 沒有儲存播放的狀態,如播放到第幾分鐘了,所以需要應用自己儲存這些狀態並恢復.
如果為了避免在旋轉螢幕時系統重啟Activity,需要新增Activity的屬性:
android:configChanges="orientation|keyboardHidden|screenSize

4 定製屬性

為了保證定製UI的靈活度,提供以下屬性:

uvv_fitXY

UniversalVideoView的屬性,布林值,true時設定視訊縮放時在X,Y方向上鋪滿View設定的寬度和高度,這樣可能使視訊變形.false時則縮放時保持視訊的長寬比例,與SDK中的VideoView類似.

uvv_autoRotation

UniversalVideoView的屬性,布林值,true時視訊會根據重力響應通知客戶進行全屏與非全屏之間的切換.

uvv_scalable

UniversalMediaController屬性,布林值,是否顯示控制條右下方的縮放按鈕,如果不想全屏播放時,可以設定為false不顯示.