安卓-进度条(持续更新)
在日常开发中经常用到进度条,比如音乐播放时的时长显示,音量显示。这里对目前已经使用过的有关于进度条的知识进行一个总结。
ProgressBar(进度条)
常用属性
由类关系图可知:
ProgressBar继承于View类,直接子类有AbsSeekBar和ContentLoadingProgressBar。
AbsSeekBar的子类有SeekBar和RatingBar。
常用属性:
- android:max:进度条的最大值
- android:progress:进度条已完成进度值
- android:progressDrawable:设置轨道对应的Drawable对象
- android:indeterminate:如果设置成true,则进度条不精确显示进度
- android:indeterminateDrawable:设置不显示进度的进度条的Drawable对象
- android:indeterminateDuration:设置不精确显示进度的持续时间
- android:secondaryProgress:二级进度条,类似于视频播放的一条是当前播放进度,一条是缓冲进度,前者通过progress属性进行设置!
在java中我们可以调用下述方法:
- getMax():返回这个进度条的范围的上限
- getProgress():返回进度
- getSecondaryProgress():返回次要进度
- incrementProgressBy(int diff):指定增加的进度
- isIndeterminate():指示进度条是否在不确定模式下
- setIndeterminate(boolean indeterminate):设置不确定模式下
SeekBar(拖动条)
因为在自己开发的安卓音乐播放器(源码地址:https://gitee.com/luozhaosong/new-music-app)中使用的是SeekBar,所以本文对SeekBar的使用介绍的较多。
SeekBar的基本用法
属性:
因为SeekBar是ProgressBar的子类,所以ProgressBar的属性SeekBar都有。
事件:
类似于按钮,安卓给SeekBar也设置了监听器。
SeekBar.OnSeekBarChangeListener
所以对于SeekBar的事件,我们只需要重写三个对应的方法:
onProgressChanged:进度发生改变时会触发
onStartTrackingTouch:按住SeekBar时会触发
onStopTrackingTouch:放开SeekBar时触发
实例(控制音量)
private void volumeControl() {
audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
volumeSeekBar.setMax(audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC));
volumeSeekBar.setProgress(audioManager.getStreamVolume(AudioManager.STREAM_MUSIC));
volumeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,volumeSeekBar.getProgress(),1);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
VolumeChangeReceiver volumeChangeReceiver = new VolumeChangeReceiver();
volumeChangeReceiver.setVolumeChangeReceiver(() -> {
volumeSeekBar.setProgress(audioManager.getStreamVolume(AudioManager.STREAM_MUSIC));
});
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.media.VOLUME_CHANGED_ACTION");
registerReceiver(volumeChangeReceiver, intentFilter);
}
- 先把SeekBar长度和音量大小绑定在一起。
- 根据个人需求设置SeekBar初始位置(没有设置的话初始位置是0)
- 对SeekBar进行监听:
-
进度发送改变会触发:保证音量跟进度实时绑定。
-
按住SeekBar会触发:当SeekBar被按住需要作出什么反应,例如:当歌曲时间SeekBar被按住时需要马上停止SeekBar的自动刷新,否则会出现SeekBar进度乱跳的bug。
-
放开SeekBar时会被触发:当SeekBar被松开时发生的事件,例如:当歌曲SeekBar被松开时,需要让歌曲从SeekBar被松开的进度开始播放和SeekBar继续自动刷新。
-
放开SeekBar时会被触发:当SeekBar被松开时发生的事件,例如:当歌曲SeekBar被松开时,需要让歌曲从SeekBar被松开的进度开始播放和SeekBar继续自动刷新。
-