關於對Android的videoView和mediaController的吐槽

這幾天在作視頻播放器一直在研究videoview。 java

videoview是和video連用的。2個組件分別都提供一個方法關聯另外一方: android

mediaController-setAnchorView(videoview),videoview-setMediaController(mediaController)。 ide


我習慣在一個佈局文件中設置好videoview的位置以後,在activity的onCreate()中將mediaController 佈局

動態初始化並關聯到已經設置好的videoview上。 spa

可是這裏的說明下在佈局中設置videoview的時候最好給videoview外面單獨套一個的容器。 設計

固然這個外層容器的高度要設定爲wrap_content。這樣就會把視頻播放器和控制器很好的組合在一塊兒。 code

這裏我用的是線性佈局LinearLayout由於我不想控制器把視頻給遮蓋住了。 視頻


<LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:id="@+id/main_videoview_contianer">
        
    <VideoView
        android:id="@+id/videoView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        />
    
    </LinearLayout>


實現的效果圖如圖: xml

用的是模擬器。因此視頻沒有播放出來成了黑色的 繼承

<VideoView
        android:id="@+id/videoView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        />
若是videoview的外層容器的高度是match_parent或者fillparent的話。


視頻控制器會和視頻播放器分離如圖:灰色爲分離的部分。

PS: 不過其實你也能夠先在佈局文件中將mediaController設置好,而後在代碼中初始話videoview而後將videoview添加到mediacontroller中去,由於mediaController是繼承frameLayout的自己就是一個幀式佈局容器:


下面是設置mediaController的方法
public void setAnchorView(View view) {
        if (mAnchor != null) {
            mAnchor.removeOnLayoutChangeListener(mLayoutChangeListener);
        }
        mAnchor = view;
        if (mAnchor != null) {
            mAnchor.addOnLayoutChangeListener(mLayoutChangeListener);
        }

        FrameLayout.LayoutParams frameParams = new FrameLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT
        );

        removeAllViews();
        View v = makeControllerView();
        addView(v, frameParams);
    }
從官方源碼中能夠看出,video會強制撐滿全屏mediacontroller.



mediaController主要實現對videoview的播放控制,可是翻開mediacontroller的源碼才發現。

mediaController能實現的功能太少了。其實這些均可以忍受,惟一讓人不能忍受的的mediaController

暴露的可讓繼承的類覆蓋的方法太少了。

並且提供的監聽器只有上一首和下一首。沒法監聽快進和後退。可是mediaController的快進是固定的15秒快進和固定的5秒後退時間

@Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        int keyCode = event.getKeyCode();
        final boolean uniqueDown = event.getRepeatCount() == 0
                && event.getAction() == KeyEvent.ACTION_DOWN;
        if (keyCode ==  KeyEvent.KEYCODE_HEADSETHOOK
                || keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE
                || keyCode == KeyEvent.KEYCODE_SPACE) {
            if (uniqueDown) {
                doPauseResume();
                show(sDefaultTimeout);
                if (mPauseButton != null) {
                    mPauseButton.requestFocus();
                }
            }
            return true;
        } else if (keyCode == KeyEvent.KEYCODE_MEDIA_PLAY ) {//鍵盤播放健
            if (uniqueDown && !mPlayer.isPlaying()) {
                mPlayer.start();
                updatePausePlay();
                show(sDefaultTimeout);
            }
            return true;
        } else if (keyCode == KeyEvent.KEYCODE_MEDIA_STOP //鍵盤中止鍵
                || keyCode == KeyEvent.KEYCODE_MEDIA_PAUSE) {//鍵盤暫停鍵 
            if (uniqueDown && mPlayer.isPlaying()) {
                mPlayer.pause();
                updatePausePlay();
                show(sDefaultTimeout);
            }
            return true;
        } else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN //聲音下調鍵
                || keyCode == KeyEvent.KEYCODE_VOLUME_UP   //聲音上調鍵
                || keyCode == KeyEvent.KEYCODE_VOLUME_MUTE //靜音鍵
                || keyCode == KeyEvent.KEYCODE_CAMERA) {   //打開相機鍵
            // don't show the controls for volume adjustment
            return super.dispatchKeyEvent(event);
        } else if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_MENU) {
            if (uniqueDown) {
                hide();
            }
            return true;
        }
        show(sDefaultTimeout);
        return super.dispatchKeyEvent(event);
    }
很明顯咱們能夠看到,mediaController的設計時間早徹底是針對那些有鍵盤的手機,如今的手機那裏會有什麼播放和暫停鍵。
相關文章
相關標籤/搜索