之前所讲的ProgressBar是不可拖动的,是软件自动进行的。而像音乐播放器这种拖动条用户是可以通过拖动来进行操作的,这就需要用到SeekBar。
下面的程序使用SeekBar简单实现了一个播放器的播放条,没有进行拖动时会自动前进,用户进行拖动后在拖动后的地方开始继续。
public class MainActivity extends AppCompatActivity {
//定义的拖动条
private SeekBar sb;
//用来显示进度
private TextView tv;
private Timer timer;
private TimerTask timerTask;
//一开始进度为0
public int BarProgress = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sb = (SeekBar) findViewById(R.id.seekBar);
tv = (TextView) findViewById(R.id.textView);
//最大进度为50
sb.setMax(50);
/*开始每隔一秒计一次时
* 这里计时后不用tv.setText,因为sb有一个监听器,只要当拖动条改变,不管改变是否来自用户,都会执行
* 详细的见后面的注释*/
timer = new Timer();
timerTask = new TimerTask() {
@Override
public void run() {
if (BarProgress <= 50) {
sb.setProgress(BarProgress);
BarProgress++;
}
}
};
timer.schedule(timerTask, 1000, 1000);
/*设置拖动的监听器,SeekBar.OnSeekBarChangeListener()是一个抽象接口,需要实现三个方法
* public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
* public void onStartTrackingTouch(SeekBar seekBar)
* 和public void onStopTrackingTouch(SeekBar seekBar) */
sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
/*当拖动条进度改变时执行,传入的参数分别是进度条,改变时的进程,和改变是否来自用户拖动
* 这里这种播放器的进度条的改变有两种情况,一种是播放时自动前进,另一种是用户进行拖动
* 显然前者的fromUser=false,后者的fromUser=true*/
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
tv.setText(String.valueOf(progress));
BarProgress = progress;
}
//当拖动开始时执行,拖动一开始,定时器停止
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
timer.cancel();
timerTask.cancel();
timer = null;
timerTask = null;
}
//当拖动结束时执行,拖动一结束,定时器重新开始工作
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
if (timer == null && timerTask == null && BarProgress <= 50) {
timer = new Timer();
timerTask = new TimerTask() {
@Override
public void run() {
sb.setProgress(BarProgress);
BarProgress++;
}
};
timer.schedule(timerTask, 1000, 1000);
}
}
});
}
}
如果将计时器放在拖动条监听器外面,在onProgressChanged方法中对BarProgress进行改变,会导致修改不成功,跳出onProgressChanged方法后拖动条进度又回去了,原因未知,可能后线程有关,在以后线程的学习中再回过头来看。