Vitamio自定義控制器MediaController樣式
阿新 • • 發佈:2019-02-05
先看一下效果圖
比自帶控制器多出上面選單,並將視訊名稱改到上面顯示
先是佈局檔案 mymdiacontroller
然後是控制器程式碼MyMediaController.java<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <RelativeLayout android:layout_width="match_parent" android:layout_height="34dp" android:background="#77000000"> <ImageButton android:id="@+id/mediacontroller_top_back" android:layout_width="50dp" android:layout_height="match_parent" android:layout_alignParentStart="true" android:background="@null" android:src="@drawable/left_white_arrow"/> <TextView android:id="@+id/mediacontroller_file_name" style="@style/MediaController_Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_marginLeft="5dp" android:ellipsize="marquee" android:singleLine="true" android:text="file name"/> <TextView android:id="@+id/mediacontroller_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="5dp" android:text="17:22" android:textColor="#ffffff" android:textSize="15sp"/> </RelativeLayout> <RelativeLayout android:id="@+id/rl_med" android:layout_width="match_parent" android:layout_height="50dp" android:layout_alignParentBottom="true" android:background="#77000000"> <ImageButton android:id="@+id/mediacontroller_play_pause" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="5dp" android:background="@drawable/mediacontroller_button" android:contentDescription="@string/mediacontroller_play_pause" android:src="@drawable/mediacontroller_pause"/> <TextView android:id="@+id/mediacontroller_time_current" style="@style/MediaController_Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="5dp" android:layout_toRightOf="@id/mediacontroller_play_pause" android:text="33:33:33" /> <TextView android:id="@+id/mediacontroller_time_total" style="@style/MediaController_Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="5dp" android:text="33:33:33"/> <SeekBar android:id="@+id/mediacontroller_seekbar" style="@style/MediaController_SeekBar" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_toLeftOf="@id/mediacontroller_time_total" android:layout_toRightOf="@id/mediacontroller_time_current" android:focusable="true" android:max="1000"/> </RelativeLayout> </RelativeLayout> </LinearLayout>
public class MyMediaController extends MediaController { private GestureDetector mGestureDetector; private ImageButton img_back; private TextView textViewTime; private VideoView videoView; private Activity activity; private Context context; private int controllerWidth = 0;//設定mediaController高度為了使橫屏時top顯示在螢幕頂端 //返回監聽 private View.OnClickListener backListener = new View.OnClickListener() { public void onClick(View v) { if(activity != null){ activity.finish(); } } }; //videoview 用於對視訊進行控制的等,activity為了退出 public MyMediaController(Context context, VideoView videoView , Activity activity) { super(context); this.context = context; this.videoView = videoView; this.activity = activity; WindowManager wm = (WindowManager) context .getSystemService(Context.WINDOW_SERVICE); controllerWidth = wm.getDefaultDisplay().getWidth(); mGestureDetector = new GestureDetector(context, new MyGestureListener()); } @Override protected View makeControllerView() { //加入佈局檔案,mymediacontroller佈局名稱 View v = ((LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(getResources().getIdentifier("mymediacontroller", "layout", getContext().getPackageName()), this); v.setMinimumHeight(controllerWidth); img_back = (ImageButton) v.findViewById(getResources().getIdentifier("mediacontroller_top_back", "id", context.getPackageName())); img_back.setOnClickListener(backListener); textViewTime = (TextView)v.findViewById(getResources().getIdentifier("mediacontroller_time", "id", context.getPackageName())); return v; } @Override public boolean dispatchKeyEvent(KeyEvent event) { // System.out.println("MYApp-MyMediaController-dispatchKeyEvent"); return true; } @Override public boolean onTouchEvent(MotionEvent event) { if (mGestureDetector.onTouchEvent(event)) return true; // 處理手勢結束 switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_UP: break; } return super.onTouchEvent(event); } private class MyGestureListener extends GestureDetector.SimpleOnGestureListener { @Override public boolean onSingleTapUp(MotionEvent e) { return false; } @Override public boolean onSingleTapConfirmed(MotionEvent e) { //當收拾結束,並且是單擊結束時,控制器隱藏/顯示 toggleMediaControlsVisiblity(); return super.onSingleTapConfirmed(e); } @Override public boolean onDown(MotionEvent e) { return true; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { return super.onScroll(e1, e2, distanceX, distanceY); } //雙擊暫停或開始 @Override public boolean onDoubleTap(MotionEvent e) { playOrPause(); return true; } } //設定時間 public void setTime(String time){ if (textViewTime != null) textViewTime.setText(time); } //隱藏/顯示 private void toggleMediaControlsVisiblity(){ if (isShowing()) { hide(); } else { show(); } } //播放與暫停 private void playOrPause(){ if (videoView != null) if (videoView.isPlaying()) { videoView.pause(); } else { videoView.start(); } } }
上面程式碼直接複製就可以使用了.
Activity中使用示例
public class CompanyVideoActivity extends BaseActivity implements Runnable{
//返回佈局id @Override protected int getLayoutId() { return R.layout.activity_company_video; } private VideoView mVideoView; private MyMediaController myMediaController; private static final int TIME = 0; private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case TIME: myMediaController.setTime(msg.obj.toString()); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //設定為全屏 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); //設定視訊解碼監聽 if (!io.vov.vitamio.LibsChecker.checkVitamioLibs(this)) return; mVideoView = (VideoView) findViewById(R.id.vv_videoplay); //設定播放地址 mVideoView.setVideoURI(Uri.parse("http://112.253.22.157/17/z/z/y/u/zzyuasjwufnqerzvyxgkuigrkcatxr/hc.yinyuetai.com/D046015255134077DDB3ACA0D7E68D45.flv")); //建立控制器 myMediaController = new MyMediaController(this,mVideoView,this); //設定控制器 mVideoView.setMediaController(myMediaController); //設定高畫質 mVideoView.setVideoQuality(MediaPlayer.VIDEOQUALITY_HIGH); //設定顯示時長 myMediaController.show(5000); mVideoView.requestFocus(); new Thread(this).start(); } @Override public void onConfigurationChanged(Configuration newConfig) { if (mVideoView != null){ mVideoView.setVideoLayout(VideoView.VIDEO_LAYOUT_SCALE, 0); } super.onConfigurationChanged(newConfig); } @Override protected void onDestroy() { super.onDestroy(); } @Override public void run() { // TODO Auto-generated method stub while (true) { //時間讀取執行緒 SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); String str = sdf.format(new Date()); Message msg = new Message(); msg.obj = str; msg.what = TIME; mHandler.sendMessage(msg); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } //隱藏狀態列 @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus && Build.VERSION.SDK_INT >= 19) { View decorView = getWindow().getDecorView(); decorView.setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); } } }
清單檔案設定
<activity android:name=".activity.CompanyVideoActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
android:launchMode="singleTop"/>
最後放一些常用方法:
public void onFinishInflate()
//從XML載入完所有子檢視後呼叫。初始化控制檢視(呼叫initControllerView方法,設定事件、繫結控制元件和設定預設值)。
public void setAnchorView(View view)
//設定MediaController繫結到一個檢視上。例如可以是一個VideoView物件,或者是你的activity的主檢視。
//引數 view 可見時繫結的檢視
public void setMediaPlayer(MediaPlayerControl player)
//設定媒體播放器。並更新播放/暫停按鈕狀態。
public void setInstantSeeking(boolean seekWhenDragging)
//設定使用者拖拽SeekBar時畫面是否跟著變化。(VPlayer預設完成操作後再更新畫面)
public void show()
//顯示MediaController。預設顯示3秒後自動隱藏。
public void show(int timeout)
//顯示MediaController。在timeout毫秒後自動隱藏。
//引數 timeout 超時時間,單位毫秒。為0時控制條的hide()將被呼叫。
public void setFileName(String name)
//設定視訊檔名稱。
public void setInfoView(OutlineTextView v)
//設定儲存MediaController的操作資訊。例如進度改變時更新v。
public void setAnimationStyle(int animationStyle) //更改MediaController的動畫風格。 //如果MediaController正在顯示,呼叫此方法將在下一次顯示時生效。 //引數 animationStyle 在MediaController顯示或隱藏時使用的動畫風格。設定-1為預設風格,0沒有動畫,或設定一個明確的動畫資源。public
boolean isShowing() //獲取MediaController是否已經顯示。public void hide() //隱藏MediaController。public void setOnShownListener(OnShownListener l) //註冊一個回撥函式,在MediaController顯示後被呼叫。public void setOnHiddenListener(OnHiddenListener l) //註冊一個回撥函式,在MediaController隱藏後被呼叫。public
boolean onTouchEvent(MotionEvent event) //呼叫show()並返回true。public boolean onTrackballEvent(MotionEvent ev) //呼叫show()並返回false。public void setEnabled(boolean enabled) //設定MediaController的可用狀態。包括進度條和播放/暫停按鈕。 protected View makeControllerView() //建立控制播放的佈局檢視。子類可重寫此方法建立自定義檢視。