自定义视频播放器

前言

这段时间公司要做视频播放的项目,之前没有任何这方面的相关经验,经过多方查阅写出来一个demo,相对而言还是比较完整的,在这边记录一下,顺便能够帮助更多的人来学习视频的播放,也顺便作为自己的一个笔记。

源码下载地址:
http://download.csdn.net/download/huang3513/9776971

首先看一下效果图:
这里写图片描述

1.首先要在SDCard中放置一个视频文件(咱们示例本地的视频播放)

String path = Environment.getExternalStorageDirectory().getAbsolutePath()+"/cjyx.mp4";

2.由于使用源生的VideoView在播放的时候,屏幕会出现空白的情况,为了从新测量屏幕的尺寸我们自定义一个VideoView,其实就是重写onMeasure()方法。

/**
 * @author :huangxianfeng on 2017/3/9.
 * 自定义一个VideoView
 */
public class CustomVideoView extends VideoView{

    int defaultWidth = 1920;
    int defaultHeight = 1080;
    public CustomVideoView(Context context) {
        super(context);
    }
    public CustomVideoView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public CustomVideoView(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);
        int width = getDefaultSize(defaultWidth,widthMeasureSpec);
        int height = getDefaultSize(defaultHeight,heightMeasureSpec);
        setMeasuredDimension(width, height);
    }
}

3.由于我们在改变屏幕的亮度和改变音量的大小,我们要根据手势在屏幕上的滑动距离来判断,所以我要拿到屏幕的尺寸、音量、和亮度的最大值和当前值。

 /**
         * 获取的当前的屏幕的宽度和高度
         */
        screen_width = getResources().getDisplayMetrics().widthPixels;
        screen_hright = getResources().getDisplayMetrics().heightPixels;
        /**
         * 当前设备的最大音量
         */
        int  streamMaxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        /**
         * 获取设备的当前音量
         */
        int streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
//屏幕的当前亮度
 WindowManager.LayoutParams attributes = getWindow().getAttributes();
        mBrightness = attributes.screenBrightness;//当前的亮度

4.视频播放我们避免不了会横屏播放视频,那么在播放时,会遇到从竖屏变换到横屏的时候,每次视频都会从头开始播放,因为在横竖屏切换的时候,系统把Activity给销毁了,并创建了一个新的Activity播放导致。

但在Manifest.xml中注册Activity的时,添加属性:

android:configChanges="orientation|screenSize|keyboard|keyboardHidden"

即可避免Activity的销毁。

但仅仅是上面的那些还是不够的,我们接下来要监听横竖屏的改变,当屏幕发生改变的时候,我们进行相对于的屏幕设置:

/**
     * 1.此系统方法是监听屏幕的改变
     * 监听到屏幕的方向的改变
     * @param newConfig
     */
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        /**
         * 当屏幕方向为横屏的时候
         */
        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
            setVideoViewScale(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);
            volume_img.setVisibility(View.VISIBLE);
            volume_seek.setVisibility(View.VISIBLE);
            isFullScreen = true;
            //移出半屏的状态
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
            //设置全屏
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        }else{//为竖屏的时候
            setVideoViewScale(ViewGroup.LayoutParams.MATCH_PARENT, ScreenUtil.getInstance().px2Dp(MainActivity.this, 240));
            volume_img.setVisibility(View.GONE);
            volume_seek.setVisibility(View.GONE);
            isFullScreen = false;
            //设置全屏
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
            //移出半屏的状态
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
        }
    }

5.如效果图所示,左下角有一个播放进度时间,还一个总时间,实现方法的计算如下代码:

 /**
     * 时间格式的转换 并设置播放时间和总时间
     * @param textview
     * @param millsecond
     */
    private void updateTextViewWithTimeFormat(TextView textview,int millsecond){
        int second = millsecond/1000;
        int hh = second/3600;//小时
        int mm = second%3600/60;//分钟
        int ss = second%60;//秒

        String str = null;
        if (hh!=0){
            str = String.format("%02d:%02d:%02d",hh,mm,ss);
        }else{
            str = String.format("%02d:%02d",mm,ss);
        }
        textview.setText(str);
    }

上面代码还要依赖一个对屏幕宽度和高度重新赋值的方法:

 /**
     * 对屏幕宽度和高度从新赋值
     * @param width
     * @param height
     */
    private void setVideoViewScale(int width,int height){
        ViewGroup.LayoutParams layoutParams = mVideoView.getLayoutParams();
        layoutParams.width = width;
        layoutParams.height = height;
        mVideoView.setLayoutParams(layoutParams);
        ViewGroup.LayoutParams layoutParams1 = videoLayout.getLayoutParams();
        layoutParams1.width = width;
        layoutParams1.height = height;
        videoLayout.setLayoutParams(layoutParams1);
    }

6.在不断更新时间变换时,我们采用Handler自己更新自己的方式,来实现时间进度的变换:

 /**
     * 实时更新视频的时间
     */
    private Handler UIHandler = new Handler(){

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            if (msg.what == UPDATEUI) {
                //获取视频当前的播放时间
                int currentPosition = mVideoView.getCurrentPosition();
                //获取视频播放的总时间
                int totalDuration = mVideoView.getDuration();

                //格式化视频播放时间
                updateTextViewWithTimeFormat(tiem_current_tv,currentPosition);
                updateTextViewWithTimeFormat(time_total_tv,totalDuration);
                //设置视频总时间
                play_seek.setMax(totalDuration);
                play_seek.setProgress(currentPosition);

                //自己更新自己来实现UI时间界面的更新
                UIHandler.sendEmptyMessageDelayed(UPDATEUI,500);
            }
        }
    };

7.然后播放进度时,我们可以通过对SeekBar的监听,来拖动视频的播放进度:

        /**
         * Seekbar设置监听事件
         */
        play_seek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                updateTextViewWithTimeFormat(tiem_current_tv, progress);
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                UIHandler.removeMessages(UPDATEUI);
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                int progress = seekBar.getProgress();
                //另视频播放的进度遵循SeekBar停止拖动的这一刻进度
                mVideoView.seekTo(progress);
                UIHandler.sendEmptyMessage(UPDATEUI);
            }
        });

8.如上我们获取到了屏幕亮度和音量的大小接下来我们就可以根据对VideoView的手势监听setOnTouchListener来控制亮度和音量:

        /**
         * 控制VideoView的手势事件
         */
        mVideoView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                float x = event.getX();
                float y = event.getY();
                Log.e("Main", "x=" + x + ";y=" + y);

//                float lastX=0, lastY=0;
                switch (event.getAction()) {
                    /**
                     * 手指落下屏幕的那一刻调用(只调用一次)
                     */
                    case MotionEvent.ACTION_DOWN:
                        lastX = x;
                        lastY = y;
                        break;
                    /**
                     * 手指在屏幕上移动(调用多次)
                     */
                    case MotionEvent.ACTION_MOVE:
                        //计算偏移量
                        float detlaX = x - lastX;
                        float detlaY = y - lastY;
                        //计算滑动时x轴和y轴的偏移量的绝对值
                        float absdetlaX = Math.abs(detlaX);
                        float absdetlaY = Math.abs(detlaY);
                        //滑动的绝对值与之前设定的临界值进行比较
                        if (absdetlaX > threshold && absdetlaY > threshold) {
                            if (absdetlaX < absdetlaY) {//y轴大于x轴的滑动,滑动是有效的
                                isAdjust = true;
                            } else {
                                isAdjust = false;
                            }
                        } else if (absdetlaX < threshold && absdetlaY > threshold) {
                            isAdjust = true;
                        } else if (absdetlaX > threshold && absdetlaY < threshold) {
                            isAdjust = false;
                        }
                        Log.e("Main", "手势是否合法" + isAdjust);
                        if (isAdjust) {
                            /**
                             * 在判断当前手势是否和发的情况下,去区分此时的手势是调节亮度还是调节音量
                             */
                            if (x < screen_width / 2) {
                                /**
                                 * 调节亮度
                                 */
//                                if (detlaY > 0) {
//                                    /**
//                                     * 降低亮度
//                                     */
////                                    Log.e("Main", "降低亮度" + detlaY);
//                                } else {
//                                    /**
//                                     * 升高亮度
//                                     */
////                                    Log.e("Main", "升高亮度" + detlaY);
//                                }
                                changeBrightness(-detlaY);

                            } else {
//                                /**
//                                 * 调节音量
//                                 */
//                                if (detlaY > 0) {
//                                    /**
//                                     * 减小音量
//                                     */
////                                    Log.e("Main", "减小音量" + detlaY);
//                                } else {
//                                    /**
//                                     * 增加音量
//                                     */
////                                    Log.e("Main", "增加音量" + detlaY);
//                                }
                                changeVolume(-detlaY);
                            }
                        }
                        lastX = x;
                        lastY = y;
                        break;
                    /**
                     * 手指离开屏幕的那一刻(调用一次)
                     */
                    case MotionEvent.ACTION_UP:
                        //抬起的时候进行对调节亮度的和音量的图标进行隐藏
                        progress_layout.setVisibility(View.GONE);
                        break;
                }
                return true;
            }
        });

根据手势判断出用户左屏幕和右屏幕,再判断出上滑还是下滑来实现音量的改变(此方法包含音量图标的显示和隐藏):

 /**
     * 改变音量
     */
    private void changeVolume(float detlaY){
        //最大
        int max = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        //当前音量
        int current = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
        int index = (int)(detlaY/screen_hright*max*3);
        int volume =Math.max(current + index, 0);
        mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volume, 0);
        //当处于隐藏状态的时候,进行显示
        if (progress_layout.getVisibility() == View.GONE){
            progress_layout.setVisibility(View.VISIBLE);
        }
        /**
         * 1.设置音量图标的显示
         * 2.并且从新进行参数的设置
         */
        operation_bg.setImageResource(R.drawable.video_volume_bg);
        ViewGroup.LayoutParams layoutParams = operation_percent.getLayoutParams();
        layoutParams.width = (int) (ScreenUtil.getInstance().dp2Px(MainActivity.this,94)*(float)volume/max);
        operation_percent.setLayoutParams(layoutParams);
        volume_seek.setProgress(volume);
    }

根据手势判断出用户左屏幕和右屏幕,再判断出上滑还是下滑来实现亮度的改变(此方法包含亮度图标的显示和隐藏):

/**
     * 改变屏幕的显示亮度
     * @param detlaY
     */
    private void changeBrightness(float detlaY){
        WindowManager.LayoutParams attributes = getWindow().getAttributes();
        mBrightness = attributes.screenBrightness;//当前的亮度
        float index = detlaY/screen_hright/3;
        mBrightness +=index;
        if (mBrightness > 1.0f){
            mBrightness= 1.0f;
        }
        if (mBrightness < 0.01f){
            mBrightness= 0.01f;
        }
        attributes.screenBrightness = mBrightness;
        //当处于隐藏状态的时候,进行显示
        if (progress_layout.getVisibility() == View.GONE){
            progress_layout.setVisibility(View.VISIBLE);
        }
        /**
         * 1.设置亮度图标的显示
         * 2.并且从新进行参数的设置
         */
        operation_bg.setImageResource(R.drawable.video_brightness_bg);
        ViewGroup.LayoutParams layoutParams = operation_percent.getLayoutParams();
        layoutParams.width = (int) (ScreenUtil.getInstance().dp2Px(MainActivity.this,94)*mBrightness);
        operation_percent.setLayoutParams(layoutParams);
        getWindow().setAttributes(attributes);
    }

以上是对主要方法的介绍,那么贴出主Activity的所有代码如下:

/**
 * @author :huangxianfeng on 2017/3/9.
 * 自定义视频播放器
 * 说明:以下这行代码可以实现,在横竖屏切换的时候,Activity不进行销毁,而是继续变换之前的进度播放
 * android:configChanges="orientation|screenSize|keyboard|keyboardHidden"
 */
public class MainActivity extends Activity {

    private CustomVideoView mVideoView;
    /**
     * 底部整个布局,控制布局显示和隐藏
     */
    private LinearLayout controllerLayout;
    /**
     * 暂停的Img按钮
     */
    private ImageView play_controller_img;
    /**
     * 显示总时间和单独时间
     */
    private TextView tiem_current_tv,time_total_tv;
    /**
     * 总的SeekBar和音量的SeekBar
     */
    private SeekBar play_seek,volume_seek;
    /**
     * 控制全屏的Img
     */
    private ImageView screen_img;
    public static final int UPDATEUI = 1;

    /**
     * 获取的当前的屏幕的宽度和高度
     */
    private int screen_width,screen_hright;
    private RelativeLayout videoLayout;
    /**
     * 音频管理器
     */
    private AudioManager mAudioManager;
    /**
     * 音量
     */
    private ImageView volume_img;

    /**
     * 设置屏幕是竖屏还是横屏开关
     */
    private boolean isFullScreen = false;

    /**
     * 在手机屏幕上的滑动是否合法
     */
    private boolean isAdjust = false;
    //防止手势误触的临界值(可修改)
    private int threshold = 30;

    //调节亮度
    private float mBrightness;

    //触摸时当前的x轴和y轴的滑动距离
    private float lastX,lastY;

    /**
     * 音量的图像变化
     */
    private ImageView operation_bg,operation_percent;

    /**
     * 音量布局隐藏控制
     */
    private FrameLayout progress_layout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mAudioManager = (AudioManager)getSystemService(AUDIO_SERVICE);
        initUI();
        setPlayerEvent();

        String path = Environment.getExternalStorageDirectory().getAbsolutePath()+"/cjyx.mp4";
        /**
         * 本地视频播放
         */
        mVideoView.setVideoPath(path);
        mVideoView.start();
        UIHandler.sendEmptyMessage(UPDATEUI);
    }

    /**
     * 初始化UI布局
     */
    private void initUI() {
        mVideoView = (CustomVideoView)findViewById(R.id.videoview);
        controllerLayout = (LinearLayout)findViewById(R.id.controllerbar_layout);
        play_controller_img = (ImageView)findViewById(R.id.pause_img);
        screen_img = (ImageView)findViewById(R.id.screen_img);
        tiem_current_tv = (TextView)findViewById(R.id.time_current_tv);
        time_total_tv = (TextView)findViewById(R.id.time_total_tv);
        play_seek = (SeekBar)findViewById(R.id.play_seek);
        volume_seek = (SeekBar)findViewById(R.id.volume_seek);
        videoLayout = (RelativeLayout)findViewById(R.id.video_layout);
        volume_img = (ImageView)findViewById(R.id.volume_img);
        operation_bg = (ImageView)findViewById(R.id.operation_bg);
        operation_percent = (ImageView)findViewById(R.id.operation_percent);
        progress_layout = (FrameLayout)findViewById(R.id.progress_layout);

        /**
         * 获取的当前的屏幕的宽度和高度
         */
        screen_width = getResources().getDisplayMetrics().widthPixels;
        screen_hright = getResources().getDisplayMetrics().heightPixels;
        /**
         * 当前设备的最大音量
         */
        int  streamMaxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        /**
         * 获取设备的当前音量
         */
        int streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
        volume_seek.setMax(streamMaxVolume);
        volume_seek.setProgress(streamVolume);
    }

    /**
     * 时间格式的转换 并设置播放时间和总时间
     * @param textview
     * @param millsecond
     */
    private void updateTextViewWithTimeFormat(TextView textview,int millsecond){
        int second = millsecond/1000;
        int hh = second/3600;//小时
        int mm = second%3600/60;//分钟
        int ss = second%60;//秒

        String str = null;
        if (hh!=0){
            str = String.format("%02d:%02d:%02d",hh,mm,ss);
        }else{
            str = String.format("%02d:%02d",mm,ss);
        }
        textview.setText(str);
    }


    /**
     * 实时更新视频的时间
     */
    private Handler UIHandler = new Handler(){

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            if (msg.what == UPDATEUI) {
                //获取视频当前的播放时间
                int currentPosition = mVideoView.getCurrentPosition();
                //获取视频播放的总时间
                int totalDuration = mVideoView.getDuration();

                //格式化视频播放时间
                updateTextViewWithTimeFormat(tiem_current_tv,currentPosition);
                updateTextViewWithTimeFormat(time_total_tv,totalDuration);
                //设置视频总时间
                play_seek.setMax(totalDuration);
                play_seek.setProgress(currentPosition);

                //自己更新自己来实现UI时间界面的更新
                UIHandler.sendEmptyMessageDelayed(UPDATEUI,500);
            }
        }
    };




    @Override
    protected void onPause() {
        super.onPause();
        //暂停的时候要停止UI时间界面的刷新
        UIHandler.removeMessages(UPDATEUI);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }


    private void setPlayerEvent() {
        /**
         * 控制视频的播放和暂停
         */
        play_controller_img.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mVideoView.isPlaying()) {
                    play_controller_img.setImageResource(R.drawable.play_btn_style);
                    //暂停播放
                    mVideoView.pause();

                } else {
                    play_controller_img.setImageResource(R.drawable.pause_btn_style);
                    //开始播放
                    mVideoView.start();
                    UIHandler.sendEmptyMessage(UPDATEUI);
                }
            }
        });


        /**
         * Seekbar设置监听事件
         */
        play_seek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                updateTextViewWithTimeFormat(tiem_current_tv, progress);
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                UIHandler.removeMessages(UPDATEUI);
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                int progress = seekBar.getProgress();
                //另视频播放的进度遵循SeekBar停止拖动的这一刻进度
                mVideoView.seekTo(progress);
                UIHandler.sendEmptyMessage(UPDATEUI);
            }
        });

        /**
         * 音量Seekbar设置监听事件
         */
        volume_seek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                /**
                 * 设置当前设备的音量
                 */
                mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0);
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });

        /**
         * 手动横竖屏的切换
         */
        screen_img.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (isFullScreen) {
                    //调用系统切换为竖屏状态
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                } else {
                    //调用系统切换为横屏或全屏状态
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                }
            }
        });


        /**
         * 控制VideoView的手势事件
         */
        mVideoView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                float x = event.getX();
                float y = event.getY();
                Log.e("Main", "x=" + x + ";y=" + y);

//                float lastX=0, lastY=0;
                switch (event.getAction()) {
                    /**
                     * 手指落下屏幕的那一刻调用(只调用一次)
                     */
                    case MotionEvent.ACTION_DOWN:
                        lastX = x;
                        lastY = y;
                        break;
                    /**
                     * 手指在屏幕上移动(调用多次)
                     */
                    case MotionEvent.ACTION_MOVE:
                        //计算偏移量
                        float detlaX = x - lastX;
                        float detlaY = y - lastY;
                        //计算滑动时x轴和y轴的偏移量的绝对值
                        float absdetlaX = Math.abs(detlaX);
                        float absdetlaY = Math.abs(detlaY);
                        //滑动的绝对值与之前设定的临界值进行比较
                        if (absdetlaX > threshold && absdetlaY > threshold) {
                            if (absdetlaX < absdetlaY) {//y轴大于x轴的滑动,滑动是有效的
                                isAdjust = true;
                            } else {
                                isAdjust = false;
                            }
                        } else if (absdetlaX < threshold && absdetlaY > threshold) {
                            isAdjust = true;
                        } else if (absdetlaX > threshold && absdetlaY < threshold) {
                            isAdjust = false;
                        }
                        Log.e("Main", "手势是否合法" + isAdjust);
                        if (isAdjust) {
                            /**
                             * 在判断当前手势是否和发的情况下,去区分此时的手势是调节亮度还是调节音量
                             */
                            if (x < screen_width / 2) {
                                /**
                                 * 调节亮度
                                 */
//                                if (detlaY > 0) {
//                                    /**
//                                     * 降低亮度
//                                     */
////                                    Log.e("Main", "降低亮度" + detlaY);
//                                } else {
//                                    /**
//                                     * 升高亮度
//                                     */
////                                    Log.e("Main", "升高亮度" + detlaY);
//                                }
                                changeBrightness(-detlaY);

                            } else {
//                                /**
//                                 * 调节音量
//                                 */
//                                if (detlaY > 0) {
//                                    /**
//                                     * 减小音量
//                                     */
////                                    Log.e("Main", "减小音量" + detlaY);
//                                } else {
//                                    /**
//                                     * 增加音量
//                                     */
////                                    Log.e("Main", "增加音量" + detlaY);
//                                }
                                changeVolume(-detlaY);
                            }
                        }
                        lastX = x;
                        lastY = y;
                        break;
                    /**
                     * 手指离开屏幕的那一刻(调用一次)
                     */
                    case MotionEvent.ACTION_UP:
                        //抬起的时候进行对调节亮度的和音量的图标进行隐藏
                        progress_layout.setVisibility(View.GONE);
                        break;
                }
                return true;
            }
        });
    }

    /**
     * 改变音量
     */
    private void changeVolume(float detlaY){
        //最大
        int max = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        //当前音量
        int current = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
        int index = (int)(detlaY/screen_hright*max*3);
        int volume =Math.max(current + index, 0);
        mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volume, 0);
        //当处于隐藏状态的时候,进行显示
        if (progress_layout.getVisibility() == View.GONE){
            progress_layout.setVisibility(View.VISIBLE);
        }
        /**
         * 1.设置音量图标的显示
         * 2.并且从新进行参数的设置
         */
        operation_bg.setImageResource(R.drawable.video_volume_bg);
        ViewGroup.LayoutParams layoutParams = operation_percent.getLayoutParams();
        layoutParams.width = (int) (ScreenUtil.getInstance().dp2Px(MainActivity.this,94)*(float)volume/max);
        operation_percent.setLayoutParams(layoutParams);
        volume_seek.setProgress(volume);
    }

    /**
     * 改变屏幕的显示亮度
     * @param detlaY
     */
    private void changeBrightness(float detlaY){
        WindowManager.LayoutParams attributes = getWindow().getAttributes();
        mBrightness = attributes.screenBrightness;//当前的亮度
        float index = detlaY/screen_hright/3;
        mBrightness +=index;
        if (mBrightness > 1.0f){
            mBrightness= 1.0f;
        }
        if (mBrightness < 0.01f){
            mBrightness= 0.01f;
        }
        attributes.screenBrightness = mBrightness;
        //当处于隐藏状态的时候,进行显示
        if (progress_layout.getVisibility() == View.GONE){
            progress_layout.setVisibility(View.VISIBLE);
        }
        /**
         * 1.设置亮度图标的显示
         * 2.并且从新进行参数的设置
         */
        operation_bg.setImageResource(R.drawable.video_brightness_bg);
        ViewGroup.LayoutParams layoutParams = operation_percent.getLayoutParams();
        layoutParams.width = (int) (ScreenUtil.getInstance().dp2Px(MainActivity.this,94)*mBrightness);
        operation_percent.setLayoutParams(layoutParams);
        getWindow().setAttributes(attributes);
    }

    /**
     * 1.此系统方法是监听屏幕的改变
     * 监听到屏幕的方向的改变
     * @param newConfig
     */
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        /**
         * 当屏幕方向为横屏的时候
         */
        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
            setVideoViewScale(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);
            volume_img.setVisibility(View.VISIBLE);
            volume_seek.setVisibility(View.VISIBLE);
            isFullScreen = true;
            //移出半屏的状态
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
            //设置全屏
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        }else{//为竖屏的时候
            setVideoViewScale(ViewGroup.LayoutParams.MATCH_PARENT, ScreenUtil.getInstance().px2Dp(MainActivity.this, 240));
            volume_img.setVisibility(View.GONE);
            volume_seek.setVisibility(View.GONE);
            isFullScreen = false;
            //设置全屏
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
            //移出半屏的状态
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
        }
    }

    /**
     * 对屏幕宽度和高度从新赋值
     * @param width
     * @param height
     */
    private void setVideoViewScale(int width,int height){
        ViewGroup.LayoutParams layoutParams = mVideoView.getLayoutParams();
        layoutParams.width = width;
        layoutParams.height = height;
        mVideoView.setLayoutParams(layoutParams);
        ViewGroup.LayoutParams layoutParams1 = videoLayout.getLayoutParams();
        layoutParams1.width = width;
        layoutParams1.height = height;
        videoLayout.setLayoutParams(layoutParams1);
    }
}

主Activity的布局activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <RelativeLayout
        android:id="@+id/video_layout"
        android:layout_width="match_parent"
        android:layout_height="240dp">

        <com.zhjy.hxf.hzvideoview.view.CustomVideoView
            android:id="@+id/videoview"
            android:layout_width="match_parent"
            android:layout_height="240dp" />

        <include layout="@layout/layout_progress"></include>


        <LinearLayout
            android:id="@+id/controllerbar_layout"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_alignParentBottom="true"
            android:orientation="vertical">

            <SeekBar
                android:id="@+id/play_seek"
                android:layout_width="match_parent"
                android:layout_height="5dp"
                android:layout_marginLeft="-20dp"
                android:clickable="true"
                android:layout_marginRight="-20dp"
                android:indeterminate="false"
                android:max="100"
                android:progress="20"
                android:progressDrawable="@drawable/seekbar_style2"
                android:thumb="@null" />


            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="#101010"
                android:gravity="center_vertical">


                <LinearLayout
                    android:id="@+id/left_layout"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:gravity="center_vertical"
                    android:orientation="horizontal">


                    <ImageView
                        android:id="@+id/pause_img"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="16dp"
                        android:src="@drawable/pause_btn_style" />

                    <TextView
                        android:id="@+id/time_current_tv"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="32dp"
                        android:text="00:00:00"
                        android:textColor="#ffffff"
                        android:textSize="14sp" />

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="5dp"
                        android:text="/"
                        android:textColor="#4c4c4c"
                        android:textSize="14sp" />

                    <TextView
                        android:id="@+id/time_total_tv"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="5dp"
                        android:text="00:00:00"
                        android:textColor="#4c4c4c"
                        android:textSize="14sp" />

                </LinearLayout>

                <LinearLayout
                    android:layout_width="10dp"
                    android:layout_height="match_parent"
                    android:layout_alignParentRight="true"
                    android:layout_toRightOf="@id/left_layout"
                    android:gravity="center_vertical|right"
                    android:orientation="horizontal">

                    <ImageView
                        android:id="@+id/volume_img"
                        android:layout_width="23dp"
                        android:layout_height="23dp"
                        android:src="@drawable/ic_yinliang"
                        android:visibility="gone" />

                    <SeekBar
                        android:id="@+id/volume_seek"
                        android:layout_width="100dp"
                        android:layout_height="5dp"
                        android:indeterminate="false"
                        android:max="100"
                        android:progress="20"
                        android:progressDrawable="@drawable/seekbar_style"
                        android:thumb="@null"
                        android:visibility="gone" />

                    <View
                        android:layout_width="1dp"
                        android:layout_height="match_parent"
                        android:layout_marginBottom="5dp"
                        android:layout_marginLeft="32dp"
                        android:layout_marginTop="5dp"
                        android:background="#1e1e1e" />

                    <ImageView
                        android:id="@+id/screen_img"
                        android:layout_width="25dp"
                        android:layout_height="25dp"
                        android:layout_marginLeft="16dp"
                        android:layout_marginRight="16dp"
                        android:src="@drawable/screen" />

                </LinearLayout>

            </RelativeLayout>

        </LinearLayout>

    </RelativeLayout>

</RelativeLayout>

源码下载地址:
http://download.csdn.net/download/huang3513/9776971
转载请注明出处,如有好的意见和建议欢迎留言。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯狂的沙粒

您的鼓励是我创作最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值