代码以托管到码云,有兴趣的小伙伴可以下载看看
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
手机影音第九天,控制视频全屏播放与退出全屏播放,音量调节按钮来控制视频音量与静音的实现
原文地址:http://cm0425.blog.51cto.com/10819451/1949571