通过SeekBar控制音量大小可以带来良好的用户体验并且直观地展现当前音量大小。
1.自定义SeekBar样式
由于系统自带的SeekBar样式一般不满足日常开发需求,所以需要我们去自定义样式。这里就简单做个示例。
首先在Layout中添加SeekBar控件。
<SeekBar
android:id="@+id/seekBar"
android:layout_centerInParent="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxHeight="4dp"
android:minHeight="4dp"
android:progressDrawable="@drawable/seek_bar_voice_bg"
android:thumb="@drawable/seek_bar_voice_circle" />
这里使用progressDrawable设置SeekBar进度条样式,使用thumb设置拖动点样式,具体代码如下:
seek_bar_voice_bg
<?xml version="1.0" encoding="utf-8"?>
<layer-list
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<solid android:color="#65686A" />
</shape>
</item>
<item android:id="@android:id/secondaryProgress">
<clip>
<shape>
<solid android:color="#ff51495e" />
</shape>
</clip>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<solid android:color="#2287FE" />
</shape>
</clip>
</item>
</layer-list>
seek_bar_voice_circle
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" >
<solid
android:color="#FF9A33"
/>
<size
android:width="20dp"
android:height="20dp"/>
</shape>
2.控制系统音量
完成了SeekBar之后我们监听用户调节SeekBar的值,然后相对应的去调整系统音量。这里我们需要用到系统提供的AudioManager。
am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
//获取系统最大音量
int maxVolume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
seekBar.setMax(maxVolume);
//获取当前音量
int currentVolume = am.getStreamVolume(AudioManager.STREAM_MUSIC);
seekBar.setProgress(currentVolume);
设置SeekBar的最大值和当前值之后,要接听SeekBar拖动事件。
seekBar.setOnSeekBarChangeListener(new SeekBar.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);
seekBar.setProgress(currentVolume);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
3.监听系统音量变化刷新SeekBar
当用户通过物理音量键或者其他方式调节系统音量时,我们需要刷新SeekBar的值。当系统音量发生改变时,会发送android.media.VOLUME_CHANGED_ACTION广播。因此我们可以定义一个BroadcastReceiver来实现。
private class VolumeReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals("android.media.VOLUME_CHANGED_ACTION")){
int currentVolume = am.getStreamVolume(AudioManager.STREAM_MUSIC);
seekBar.setProgress(currentVolume);
}
}
}
注册广播
receiver = new VolumeReceiver();
IntentFilter filter = new IntentFilter() ;
filter.addAction("android.media.VOLUME_CHANGED_ACTION") ;
activity.registerReceiver(receiver, filter) ;
最后不要忘了注销广播
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(volumeReceiver);
}
4.隐藏系统自带调节音量控件
当我们用物理音量键调节音量的时候,会弹出系统自带的调节音量控件,如图:
大多数情况下我们是不希望弹出系统自带的调节音量控件的,因此我们可以监听物理音量键的按键事件,然后屏蔽系统自带的调节音量控件,代码如下:
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN) {
am.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, 0);
}else if (event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP) {
am.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, 0);
}
return true;
}
————————————————————————————————————