1. 程式人生 > >手機影音第九天,控制視頻全屏播放與退出全屏播放,音量調節按鈕來控制視頻音量與靜音的實現

手機影音第九天,控制視頻全屏播放與退出全屏播放,音量調節按鈕來控制視頻音量與靜音的實現

視頻的全屏播放 音量變化與靜音

代碼以托管到碼雲,有興趣的小夥伴可以下載看看

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

手機影音第九天,控制視頻全屏播放與退出全屏播放,音量調節按鈕來控制視頻音量與靜音的實現