## 一般的媒体开发都会涉及到音量的调整这一块,而且不是调用系统的音量控制条,需要自己定义个性化
##的UI显示。最近在做音乐和视频播放这一块内容的时候也有这个需求。好吧我先上个效果图。。。
#### 这是设计给的效果图,嗯 我看了以后觉得用一个dialog显示出来就可以了。然后我就开始搞了。但
####我真的被整的无语了,因为不管我怎么弄,显示出来的效果始终和设计要的效果不一样。
####也看了其他文章,但是都没有解决。然后改用popupWindow解决了。好吧 来看代码。
![挺好看的](https://img-blog.csdn.net/20181016194347227?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxOTk0NDY3NDMz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
//自定义弹出框设置音量
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);
}
这个代码有些是参考别人的。请原谅我记不起作者是谁了,总之先记录下来吧。希望能帮到那些看这个文章到的人吧。