自定义SeekBar控制系统音量点击外部隐藏popupWindow并响应外部点击事件

## 一般的媒体开发都会涉及到音量的调整这一块,而且不是调用系统的音量控制条,需要自己定义个性化
##的UI显示。最近在做音乐和视频播放这一块内容的时候也有这个需求。好吧我先上个效果图。。。
#### 这是设计给的效果图,嗯 我看了以后觉得用一个dialog显示出来就可以了。然后我就开始搞了。但
####我真的被整的无语了,因为不管我怎么弄,显示出来的效果始终和设计要的效果不一样。
####也看了其他文章,但是都没有解决。然后改用popupWindow解决了。好吧 来看代码。

挺好看的

 //自定义弹出框设置音量
 private PopupWindow popupWindow;
    private void setVoice() {
        if (popupWindow != null && popupWindow.isShowing()) {
            return;
        }
        View layout = LayoutInflater.from(this.getActivity()).inflate(R.layout.voice_item, null);
        popupWindow = new PopupWindow(layout,
                300,
                200);
        //点击空白处时,隐藏掉pop窗口
        ***popupWindow.setOutsideTouchable(true);
        popupWindow.setFocusable(false);***
        popupWindow.setBackgroundDrawable(new BitmapDrawable());
        //添加弹出、弹入的动画
//        popupWindow.setAnimationStyle(R.style.Popupwindow);
        popupWindow.showAtLocation(layout, Gravity.CENTER, 0, 0);
        final ImageView imageVoice = (ImageView) layout.findViewById(R.id.image_voice);
        SeekBar seekBar = (SeekBar) layout.findViewById(R.id.voice_change);
        //获取媒体服务
        final AudioManager am = (AudioManager) MusicPlayFragment.this.getActivity().getSystemService(MusicPlayFragment.this.getActivity().AUDIO_SERVICE);
        //获取系统最大音量
        int maxVolume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        seekBar.setMax(maxVolume);
        //获取当前音量
        int currentVolume = am.getStreamVolume(AudioManager.STREAM_MUSIC);
        seekBar.setProgress(currentVolume);
        seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if (fromUser) {
                    //设置音量
                    am.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0);
                    int currentVolume = am.getStreamVolume(AudioManager.STREAM_MUSIC);
                    if (currentVolume == 0) {
                        imageVoice.setImageResource(R.drawable.multimedia_music_alertclose);
                        imageButton.setImageResource(R.drawable.multimedia_music_close);
                        seekBar.setProgress(currentVolume);
                    } else {
                        imageVoice.setImageResource(R.drawable.multimedia_music_alertopen);
                        imageButton.setImageResource(R.drawable.multimedia_music_open);
                        seekBar.setProgress(currentVolume);
                    }
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
            }
        });
    }
注释已经写得很清晰了 有一点需要解释下
//点击空白处时,隐藏掉pop窗口
        popupWindow.setOutsideTouchable(true);
        popupWindow.setFocusable(false);
        为什么要这样写呢?你注意看我们设计的效果图,如果说我们点击了音量按键,弹出了PopupWindow,但是我不想调节
        音量。我直接点了下一首按钮。这时候是不是应该切换到下一首,并且隐藏popupWindow。这样写的目的就是为了响应
        外部区域的点击事件。如果你不需要响应外部点击事件的话可以写成
        popupWindow.setFocusable(true);
        点击外部不想隐藏popupWindow的话写成
         popupWindow.setOutsideTouchable(false);
        popupWindow.setFocusable(true);
       
下面这个可以直接调用系统自带的音量调节器,用到的(估计你也用不到 )可以直接拿走。
 /**
     * 设置播放音量
     */
    private void setVolume() {
        final AudioManager audio = (AudioManager) MusicPlayFragment.this.getActivity().getSystemService(Context.AUDIO_SERVICE);
        final int setVolFlags = AudioManager.FLAG_PLAY_SOUND | AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE |
                AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_VIBRATE;

        audio.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
        audio.setStreamVolume(AudioManager.STREAM_MUSIC, audio.getStreamVolume(AudioManager.STREAM_MUSIC), setVolFlags);
    }
这个代码有些是参考别人的。请原谅我记不起作者是谁了,总之先记录下来吧。希望能帮到那些看这个文章到的人吧。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值