Android UI控件 拖动条SeekBar

来源:互联网 发布:server2008 网络驱动 编辑:程序博客网 时间:2024/06/05 20:53

之前所讲的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方法后拖动条进度又回去了,原因未知,可能后线程有关,在以后线程的学习中再回过头来看。

0 0
原创粉丝点击