手机影音第九天,控制视频全屏播放与退出全屏播放,音量调节按钮来控制视频音量与静音的实现

author author     2022-09-09     352

关键词:

    代码以托管到码云,有兴趣的小伙伴可以下载看看

    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

手机影音第八天控制视频播放页面的上面与下边的控制器布局的消失与隐藏

    默认打开播放器播放视频时,视频页面的上部与下部的控制栏都是隐藏的,单击视频后显示,再单击隐藏,长按视频后暂停,再长按就播放。同时解决了一个消失与隐藏的一个小bug      &nb... 查看详情

手机看视频不是全部能全屏,怎么处理?

手机要看视频网页全屏的话,可以将手机设置为横屏就可以播放了。 装个moboplayer就可以了,安卓最好的视频播放器。你的视频是多少分辨率了,分辨率越小看到越不是全屏的,是要把视频转换。建议您:播放视频时检查屏... 查看详情

手机app的视频都不能全屏播放了,怎么解决?

...果重新下载了,还是不能全屏,快放上去,可以看看你的手机设置的问题。参考技术A视频不能全屏播放,由于全面屏机型屏幕比例大,而目前大多视频拍摄时的比例是16:9,视频画面的比例小于手机屏幕比例,所以在播放时会向... 查看详情

androidwebview播放html5视频,退出全屏后为啥就是黑屏了

AndroidWebView播放html5视频,能进入全屏状态,也能播放,但是退出全屏后为什么就是黑屏了参考技术A能把你播放视频这段的代码发给我看下吗?谢谢。我的播放不能全屏、454988138@qq.com谢谢啦、查看原帖>>本回答被提问者采纳 查看详情

电影播放完毕后退出全屏

...电影视图顶部获得“播放符号”,以便用户只需按下它,视频就会开始。有人知道如何实现吗? 查看详情

iosvideo怎么禁止自动全屏

最近做一个移动端微信页面项目,在微信页面中有视频播放,但是需要禁止IOS的自动全屏播放(前提必须使用video标签)。如:在iPhonesafari点击视频会弹出播放器进行全屏播放。在网上看了看别人给出的答案,引用如下:可以在v... 查看详情

手机影音第五天视频列表的显示与播放以及个别牌子手机播放的问题

先展示下本次做好的效果:    650)this.width=650;"src="https://s5.51cto.com/wyfs02/M01/9C/0F/wKioL1lrhoyiiun2AAAztkGqncQ474.jpg"style="float:none;"title="QQ图片20170716233005.jpg"alt="wKioL1lrhoyi 查看详情

手机看视频不是全部能全屏,怎么处理?

如果是手机在网页看视频的话,有些网站用安卓或者苹果看视频即使按了全屏按钮,也只是在竖屏状态下的半全屏观看模式。所以可以将手机屏幕设置横屏,这样就可以全屏观看。以iphone手机为例。设置横屏方法如下:1、在iphon... 查看详情

怎么把主屏内容放到扩展屏上

...影扩展模式如何实现主屏控制播放器,扩展屏全屏显示用QQ影音3.9版本操作,可以实现这个功能。如图设置:注意打钩的地方,因为本人只有一个屏幕,不能选择。如果有2块屏幕,这里可以选择全屏输出到哪块屏幕的。这样就可... 查看详情

苹果13promax如何全屏看视频

参考技术A苹果手机看视频全屏怎么设置满屏?苹果手机看1、打开一个有视频的公众号,进入到视频播放的界面。2、播放视屏,并打开全屏,就会看到只能竖着全屏了,并没有横向的全屏,视频还是那个小窗口。3、从手机的底... 查看详情

强制 iOS iPhone youtube 嵌入播放器退出全屏

...问题描述】:我正在创建一个网站,用户可以在其中观看视频,并在此过程中回答问题。但是,我有一个问题。当用户在iPhone上观看YouTube嵌入视频时,它会在iOS播放器中启动,而不是在YouTube播放器中启动。当我试图让播 查看详情

嵌入式 IFRAME 视频在 Android 中退出全屏后继续在后台播放

】嵌入式IFRAME视频在Android中退出全屏后继续在后台播放【英文标题】:EmbeddedIFRAMEvideokeepsplayinginbackgroundafterexitingfullscreeninAndroid【发布时间】:2012-10-2023:34:02【问题描述】:我已经搜索了很多解决此问题的方法,但显然我找不到... 查看详情

手机影音第十四天,本地音乐列表的展示与播放(利用视频播放的布局)

    代码已经托管到码云,有兴趣的小伙伴可以下载看看    https://git.oschina.net/joy_yuan/MobilePlayer效果图:    650)this.width=650;"src="https://s5.51cto.com/wyfs02/M01 查看详情

bootstrapmodal在弹出框中播放视频,全屏后chrome按esc后不仅退出视频也退出了modal

想要在第一次按下esc后只退出视频全屏,再一次按下esc再隐藏modal,火狐浏览器是ok的,就是chrome和IE不行!参考技术A在代码中,把model框的esc事件给禁止了 查看详情

MP 电影播放器​​视图控制器滞后于 ios 中的视频播放

...点滞后。这是我用来播放全屏视频的代码,它存储在我的手机/ipa 查看详情

在没有任何用户控制或交互的情况下在 iPhone 上播放全屏视频?

】在没有任何用户控制或交互的情况下在iPhone上播放全屏视频?【英文标题】:PlayingfullscreenvideooniPhonewithoutanyusercontrolsorinteraction?【发布时间】:2011-08-0318:36:35【问题描述】:我正在开发一款带有介绍视频的iOS游戏。如何在没有... 查看详情

我用html5的video标签做的视频页面,在iphone上测试的时候视频都是全屏的,怎么才能不全屏?

我只想视频是占一片区域,播放的时候不是全屏,只是它原来的大小。PC上用浏览器没问题,iphone点击播放就新开了个window来播放视频,怎么禁止它自动全屏。另外我在pc上测试的时候可以用html5的video标签里的.muted=true;来设置静... 查看详情

html5视频标签与Android全屏播放

】html5视频标签与Android全屏播放【英文标题】:html5videotagtoplayfullscreenwithAndroid【发布时间】:2012-07-1001:33:39【问题描述】:我正在创建一个移动网站,其中有一个视频我想在有人点击链接时播放:<divid="player"></div><ahr... 查看详情