標籤:視頻的全屏播放 音量變化與靜音
代碼以託管到碼雲,有興趣的小夥伴可以下載看看
https://git.oschina.net/joy_yuan/MobilePlayer
一、視頻全屏播放與退出全屏
系統預設的videoview類,沒有調整大小的方法,因此需要自訂一個類,繼承videoview,然後重寫裡面的三個構造方法,再自訂一個調整視頻播放頁面大小的方法。
1、布局檔案
同時,在視頻播放的布局檔案中,videoview布局要引用上面自訂的類。
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:gravity="center" android:background="#000000" android:layout_width="match_parent" android:layout_height="match_parent"> <com.yuanlp.mobileplayer.view.MyVideoView android:layout_centerInParent="true" android:id="@+id/videoview" android:layout_width="match_parent" android:layout_height="match_parent"/> <include layout="@layout/media_controller" android:id="@+id/media_controller"/></RelativeLayout>
2、自訂的類
package com.yuanlp.mobileplayer.view;import android.content.Context;import android.util.AttributeSet;import android.view.ViewGroup;import android.widget.VideoView;/** * Created by 原立鵬 on 2017/7/19. */public class MyVideoView extends VideoView { //在代碼中建立的時候用,即new public MyVideoView(Context context) { this(context,null); } //當在布局檔案中使用該類的時候,系統自動使用該構造方法 public MyVideoView(Context context, AttributeSet attrs) { this(context, attrs,0); } /** * 當需要樣式時,使用該類 * @param context * @param attrs * @param defStyleAttr */ public MyVideoView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } /** * 測量 * @param widthMeasureSpec * @param heightMeasureSpec */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); setMeasuredDimension(widthMeasureSpec, heightMeasureSpec); } /** * 設定視頻的寬高 * @param width * @param height */ public void setVideoSize(int width,int height){ ViewGroup.LayoutParams params=getLayoutParams(); params.width=width; params.height=height; setLayoutParams(params); }}
3、設定全屏播放
在準備播放視頻的回調方法中,擷取視頻的長、寬;
/** * 準備好播放時的監聽 */class MyOnPreparedListener implements MediaPlayer.OnPreparedListener { @Override public void onPrepared(MediaPlayer mp) { videoview.start(); //開始播放 duration = videoview.getDuration(); //擷取視頻總時間長度 seekbarVideo.setMax(duration); //設定播放進度的最大值 //發送訊息,來更新視頻進度 handler.sendEmptyMessage(PROGRESS); //設定顯示的視頻總時間長度 tvDuration.setText(utils.stringForTime(duration)); //預設進入播放時,隱藏 media_controller.setVisibility(View.GONE); isShow=false; //設定為隱藏 //擷取播放器播放視頻的寬度和高度 videoHeight=mp.getVideoHeight(); videoWidth=mp.getVideoWidth(); // videoview.setVideoSize(mp.getVideoWidth(),mp.getVideoHeight()); setVideoType(DEFAULTSCREEN); }}
利用系統的DisplayMetrics來擷取手機螢幕的寬高;
/** * 擷取手機螢幕的寬度高度像素 */DisplayMetrics displayMetrics=new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);screenWidth=displayMetrics.widthPixels;screenHeight=displayMetrics.heightPixels;
4、當雙擊螢幕後,去判斷當前是否是全屏,定義一個全域變數isFullScreen,預設false來判斷是否全屏,
4.1 如果不是全屏,那麼就設定為全屏,將isFullScreen設定為true,
將螢幕的寬,設定為視頻的寬,螢幕的高,設定為視頻的高
將右下角的那個視頻是否全屏的表徵圖換了
else{ //是預設,設定為全屏 setVideoType(FULLSCREEN);}。。。。。。private void setVideoType(int screen) { if (screen==FULLSCREEN){ //1、設定視頻畫面大小 videoview.setVideoSize(screenWidth,screenHeight); //2、設定按鈕變化 btVideoSwitchScreen.setBackgroundResource(R.drawable.bt_video_switch_screen_default_selector); //3、設定isFullScreen=true; isFullScreen=true; }else if (screen==DEFAULTSCREEN){ int mVideoWidth=videoWidth; //視頻真實寬度 int mVideoHeight=videoHeight; //視頻真實高度 videoview.setVideoSize(mVideoWidth,mVideoHeight); btVideoSwitchScreen.setBackgroundResource(R.drawable.bt_video_switch_screen_full_selector); isFullScreen=false; }}
4.2 如果當前已經是全屏,那麼就設定isFullScreen為false,設定為正常螢幕大小
根據前面擷取到的準備播放時的回調方法裡的寬高設定為播放器的寬高
if (isFullScreen){ //是全屏,則設定為預設 setVideoType(DEFAULTSCREEN);}
二、設定seekbarvoice這個控制播放器音量
1、 播放器音量可以通過AudioManager來擷取執行個體控制
/** * 執行個體化音量管理器 */audioManager= (AudioManager) getSystemService(Context.AUDIO_SERVICE);currentVoice=audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); //當前音量maxVoice=audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); //最大音量/2、設定seekbarvoice音量進度條的最大值和當前值,注意,音量最大值為15.//設定音量監聽seekbarVoice.setOnSeekBarChangeListener(new VoiceOnSeekBarChangeListener());//設定音量seekbarVoice.setMax(maxVoice);seekbarVoice.setProgress(currentVoice);
3、建立音量進度條的變化監聽類
/** * 音量進度條變化監聽 */class VoiceOnSeekBarChangeListener implements SeekBar.OnSeekBarChangeListener { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (fromUser){ if (progress>0){ isMuteVoice=false; }else{ isMuteVoice=true; } setVoice(progress,isMuteVoice); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { handler.removeMessages(HIDEVIDEO); } @Override public void onStopTrackingTouch(SeekBar seekBar) { handler.sendEmptyMessageDelayed(HIDEVIDEO,3000); }}public void setVoice(int progress,boolean isMuteVoice) { if (isMuteVoice){ seekbarVoice.setProgress(0); //音量控制器控制音量變化 //audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,progress,1); //第三個參數設定1,表示顯示系統音量進度 audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,0,0); //第三個參數設定1,表示顯示系統音量進度 }else { //音量控制器控制音量變化 //audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,progress,1); //第三個參數設定1,表示顯示系統音量進度 audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,progress,0); seekbarVoice.setProgress(progress); currentVoice=progress; //把音量賦值給當前音量 Log.d(TAG, "setVoice: 當前聲音"+currentVoice); System.out.println("setVoice ----------當前聲音"+currentVoice); }}
通過進度條變化時的progress值,來控制系統音量和設定seekbar上的進度。
4、點擊聲音按鈕時,會設定靜音與否
if ( v == btnVoice ) { // Handle clicks for btnVoice isMuteVoice=!isMuteVoice; setVoice(currentVoice,isMuteVoice);// if (isMuteVoice){// //是靜音,設定為不靜音// isMuteVoice=false;// seekbarVoice.setProgress(currentVoice);// audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,currentVoice,0);// }else {// //不是靜音,設定為靜音// isMuteVoice=true;// seekbarVoice.setProgress(0);// audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,0,0);//// } }
至此,視頻的全屏播放,音量變化與靜音已經做好
本文出自 “YuanGuShi” 部落格,請務必保留此出處http://cm0425.blog.51cto.com/10819451/1949571
手機影音第九天,控制視頻全屏播放與退出全屏播放,音量大小按鈕來控制視頻音量與靜音的實現