很多音乐播放器界面上都有一个音量seekbar,那么在android里面是如何实现的呢?
首先分析下要解决的问题:1.获取媒体播放的音量。
2.通过seekbar可以增减音量
3.用户按下音量键增减音量,seekbar保持同步
对于第一个问题:Android系统提供AudioManager类来获得系统audio服务。
对于第二个问题:实现seekBarChangeLIstener里面onProgressChanged方法。
对于第三个问题:用线程来同步更新UI。
设置音量的代码:
1
private
void
setVolum()
2
{
3
4
maxVolume
=
mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
5
volSeekBar.setMax(maxVolume);
6
currentVolume
=
mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
7
volSeekBar.setProgress(currentVolume);
8
mVolume.setText(currentVolume
*
100
/
maxVolume
+
"
"
);
9
}
实现seekbar控制音量代码:
OnSeekBarChangeListener seekBarChangeListener
=
new
OnSeekBarChangeListener()
{
public
void
onProgressChanged(SeekBar seekBar,
int
progress,
boolean
fromUser) {
//
TODO Auto-generated method stub
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress,
0
);
}
public
void
onStartTrackingTouch(SeekBar seekBar) {
//
TODO Auto-generated method stub
}
public
void
onStopTrackingTouch(SeekBar seekBar) {
//
TODO Auto-generated method stub
}
};
线程更新UI代码:
1
Handler myHandler
=
new
Handler(){
2
public
void
handleMessage(Message msg) {
3
switch
(msg.what) {
4
case
PROGRESS_CHANGED:
5
setVolum();
6
/*
sendEmptyMessageDelayed(PROGRESS_CHANGED, 200);
*/
7
break
;
8
}
9
}
10
};
11
12
class
myVolThread
implements
Runnable {
13
public
void
run() {
14
while
(
!
Thread.currentThread().isInterrupted()) {
15
16
Message message
=
new
Message();
17
message.what
=
PROGRESS_CHANGED;
18
MainActivity.
this
.myHandler.sendMessage(message);
19
try
{
20
Thread.sleep(
100
);
21
}
catch
(InterruptedException e) {
22
Thread.currentThread().interrupt();
23
}
24
}
25
}
26
}
最后贴上MainActivity代码:
01 | public class MainActivity extends Activity { |
03 | protected static final int PROGRESS_CHANGED = 0x101 ; |
04 | private SeekBar volSeekBar ; |
05 | private TextView mVolume ; |
06 | private AudioManager mAudioManager; |
07 | private int maxVolume, currentVolume; |
09 | Thread myVolThread = null ; |
10 | Handler myHandler = new Handler(){ |
11 | public void handleMessage(Message msg) { |
13 | case PROGRESS_CHANGED: |
20 | public void onCreate(Bundle savedInstanceState) { |
21 | super .onCreate(savedInstanceState); |
22 | setContentView(R.layout.main); |
24 | volSeekBar= (SeekBar)findViewById(R.id.volum_seek); |
25 | mVolume = (TextView)findViewById(R.id.volum_val); |
26 | mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); |
29 | OnSeekBarChangeListener seekBarChangeListener = new OnSeekBarChangeListener() |
32 | public void onProgressChanged(SeekBar seekBar, int progress, |
35 | mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0 ); |
38 | public void onStartTrackingTouch(SeekBar seekBar) { |
43 | public void onStopTrackingTouch(SeekBar seekBar) { |
50 | volSeekBar.setOnSeekBarChangeListener(seekBarChangeListener); |
51 | new Thread( new myVolThread()).start(); |
54 | private void setVolum() |
57 | maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); |
58 | volSeekBar.setMax(maxVolume); |
59 | currentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); |
60 | volSeekBar.setProgress(currentVolume); |
61 | mVolume.setText(currentVolume* 100 /maxVolume + " " ); |
64 | class myVolThread implements Runnable { |
66 | while (!Thread.currentThread().isInterrupted()) { |
68 | Message message = new Message(); |
69 | message.what =PROGRESS_CHANGED; |
70 | MainActivity. this .myHandler.sendMessage(message); |
73 | } catch (InterruptedException e) { |
74 | Thread.currentThread().interrupt(); |