Android UI控件 拖动条SeekBar

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值