這幾天在作視頻播放器一直在研究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的設計時間早徹底是針對那些有鍵盤的手機,如今的手機那裏會有什麼播放和暫停鍵。