Android自定义视频播放器(五)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zxd1435513775/article/details/81626882

参看:Android自定义视频播放器(一):https://blog.csdn.net/zxd1435513775/article/details/81507909
参看:Android自定义视频播放器(二):https://blog.csdn.net/zxd1435513775/article/details/81533053
参看:Android自定义视频播放器(三):https://blog.csdn.net/zxd1435513775/article/details/81535065
参看:Android自定义视频播放器(四):https://blog.csdn.net/zxd1435513775/article/details/81562032

一、引言

下面要实现,点击屏幕隐藏控制面板,若控制面板显示,则过几秒自动隐藏控制面板的效果。
首先需要,把控制面板自定义布局加上id,并实例化。

<include layout="@layout/media_controller" android:id="@+id/media_controller"/>

此处也可以再media_controller布局的根元素上加,效果一样。

二、隐藏和显示控制面板

1、隐藏方法

/**
 * 隐藏控制面板
 */
private void hideMediaController() {
    media_controller.setVisibility(View.GONE);
    isshowMediaController = false;    //该参数用于表示面板是否显示,默认隐藏
}

2、显示方法

 /**
 * 显示控制面板
 */
private void showMediaController() {
    media_controller.setVisibility(View.VISIBLE);
    isshowMediaController = true;
}

3、在MyPreparedListener中设置隐藏

private class MyPreparedListener implements MediaPlayer.OnPreparedListener {
    @Override
    public void onPrepared(MediaPlayer mediaPlayer) {
        //视频准备好了,进行播放
        mediaPlayer.start();

        //视频的总时长,并关联SeekBar的总长度
        int duration = videoView.getDuration();
        //设置SeekBar进度的总长
        seekbarVideo.setMax(duration);
        //设置视频的总时间
        tvDuration.setText(utils.stringForTime(duration));
        //发消息
        handler.sendEmptyMessage(PROGRESS);

        //默认是隐藏控制面板
        hideMediaController();

    }
}

4、实现手势识别器

   class MySimpleOnGestureListener extends GestureDetector.SimpleOnGestureListener {

        //长按监听
        @Override
        public void onLongPress(MotionEvent e) {
            startAndPause();
        }

        //点击两次监听
        @Override
        public boolean onDoubleTapEvent(MotionEvent e) {
            //setFullScreenAndDefault();
            return super.onDoubleTapEvent(e);
        }

        //点击一次监听
        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            if (isshowMediaController) {
                //隐藏
                hideMediaController();
                //把隐藏消息移除
                handler.removeMessages(HIDE_MEDIACONTROLLER);
            } else {
                //显示
                showMediaController();
                //过4秒,自动发消息隐藏控制面板消息
                handler.sendEmptyMessageDelayed(HIDE_MEDIACONTROLLER, 4000);
            }
            return super.onSingleTapConfirmed(e);
        }

需要在初始化的时候,初始化手势识别器

//实例化手势识别器,并且重写双击,点击,长按
detector = new GestureDetector(this, new MySimpleOnGestureListener());

需要在onTouchEvent方法中,将事件传递给手势识别器:

//3.把事件传递给手势识别器
detector.onTouchEvent(event);

5、Handler消息处理

 case HIDE_MEDIACONTROLLER://隐藏控制面板
                hideMediaController();
                break;

三、需要注意的地方

1、需要移除handler发送的消息的地方

(1)声音SeekBar的事件监听处
 class VoiceOnSeekBarChangeListener implements SeekBar.OnSeekBarChangeListener {

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        if (fromUser) {
            if (progress > 0) {
                isMute = false;
            } else {
                isMute = true;
            }
            updataVoice(progress, isMute);
        }
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        handler.removeMessages(HIDE_MEDIACONTROLLER);
    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        handler.sendEmptyMessageDelayed(HIDE_MEDIACONTROLLER, 4000);
    }
}
(2)视频播放SeekBar的事件监听处
 class VideoOnSeekBarChangeListener implements SeekBar.OnSeekBarChangeListener {

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        if (fromUser) {
            videoview.seekTo(progress);
        }

    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {

        handler.removeMessages(HIDE_MEDIACONTROLLER);
    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        handler.sendEmptyMessageDelayed(HIDE_MEDIACONTROLLER, 4000);
    }
}
(3)物理按键,调节声音的事件监听处
 /**
     * 监听物理健,实现声音的调节大小
     *
     * @param keyCode
     * @param event
     * @return
     */
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
            currentVoice--;
            updataVoice(currentVoice, false);
            handler.removeMessages(HIDE_MEDIACONTROLLER);
            handler.sendEmptyMessageDelayed(HIDE_MEDIACONTROLLER, 4000);
            return true;
        } else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
            currentVoice++;
            updataVoice(currentVoice, false);
            handler.removeMessages(HIDE_MEDIACONTROLLER);
            handler.sendEmptyMessageDelayed(HIDE_MEDIACONTROLLER, 4000);
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
(4)所有点击事件监听处
 @Override
    public void onClick(View v) {
        if (v == btnVoice) {
            isMute = !isMute;
            // Handle clicks for btnVoice
            updataVoice(currentVoice, isMute);
        } else if (v == btnSwichPlayer) {
            // Handle clicks for btnSwichPlayer
            showSwichPlayerDialog();
        } else if (v == btnExit) {
            // Handle clicks for btnExit
            finish();
        } else if (v == btnVideoPre) {
            // Handle clicks for btnVideoPre
            playPreVideo();
        } else if (v == btnVideoStartPause) {
            // Handle clicks for btnVideoStartPause
            startAndPause();
        } else if (v == btnVideoNext) {
            // Handle clicks for btnVideoNext
            playNextVideo();
        } else if (v == btnVideoSiwchScreen) {
            // Handle clicks for btnVideoSiwchScreen
            setFullScreenAndDefault();
        }

        handler.removeMessages(HIDE_MEDIACONTROLLER);
        handler.sendEmptyMessageDelayed(HIDE_MEDIACONTROLLER, 4000);
    }
6、onTouchEvent()方法中
@Override
public boolean onTouchEvent(MotionEvent event) {
    //把事件传递给手势识别器
    detector.onTouchEvent(event);

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN://手指按下
            ...
            handler.removeMessages(HIDE_MEDIACONTROLLER);
            break;
        case MotionEvent.ACTION_MOVE://手指移动
            ...
            break;
        case MotionEvent.ACTION_UP://手指离开
            handler.sendEmptyMessageDelayed(HIDE_MEDIACONTROLLER, 4000);
            break;
    }
    return super.onTouchEvent(event);
}

猜你喜欢

转载自blog.csdn.net/zxd1435513775/article/details/81626882