SeekBar и таймер обратного отсчета

я пытаюсь использовать SeekBar для управления скоростью CountDownTimer, и я остановился в 2 проблемах. 1 - DownTimerInterval не сбрасывается, когда я меняю прогресс панели поиска... но добавляю значение прогресса каждый раз, когда я меняю. 2 - Я хочу остановить обратный отсчет, когда прогресс панели поиска установлен на 0 .... и это не работает. Как это исправить?

Вот мой код

rolagem.setOnClickListener(new OnClickListener() {

    public void onClick(View v) {

        rolagemAutomatica();
    }
});

private void rolagemAutomatica() {
    barra = (SeekBar)findViewById(R.exibir_musica.barraFonte);
    barra.setVisibility(1);
    barra.setMax(4);
    barra.setProgress(0);
    barra.setOnSeekBarChangeListener( new SeekBar.OnSeekBarChangeListener() {

        public void onStopTrackingTouch(SeekBar seekBar) {
        }

        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            String[] VR = {"0","10","50","75","100"};
            //Define crono +1 cause position 0 crash the app
            int crono = Integer.parseInt(VR[progress]+1);

            CountDownTimer test = new CountDownTimer(400000 , crono) {

                @Override
                    public void onTick(long millisUntilFinished) {
                        scroll_letra.smoothScrollBy(0,
                                (int) (millisUntilFinished / 300000));

                    }

                    @Override
                    public void onFinish() {
                        // TODO Auto-generated method stub
                    }
                };
                if(crono-1 != 0){
                    test.start();
                }else{
                    test.cancel();
                }
            }
    });


}

person Rafael Godinho Brandão    schedule 19.12.2012    source источник


Ответы (2)


Держите CountDownTimer как поле экземпляра, чтобы вы могли отменить его, когда вам нужно. Если запуск одного с таймером тика 0 приводит к сбою, просто не запускайте его, когда скорость равна 0.

Что-то вроде этого:

barra.setOnSeekBarChangeListener( new SeekBar.OnSeekBarChangeListener() {

    public void onStopTrackingTouch(SeekBar seekBar) {
    }

    public void onStartTrackingTouch(SeekBar seekBar) {

    }

    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        String[] VR = {"0","10","50","75","100"};
        int crono = Integer.parseInt(VR[progress]);

        if (fromUser) {
            this.countDownTimer.cancel();
            if (crono > 0) {
                 this.countDownTimer = new CountDownTimer(400000 , crono) {

                     @Override
                     public void onTick(long millisUntilFinished) {
                         scroll_letra.smoothScrollBy(0,
                                 (int) (millisUntilFinished / 300000));

                     }

                     @Override
                     public void onFinish() {
                         // TODO Auto-generated method stub
                         }
                     };
                     if(crono-1 != 0){
                         test.start();
                     }else{
                         test.cancel();
                     }
                }
            }
        }
});

Есть еще несколько оптимизаций, которые вы могли бы сделать. Например, вы, вероятно, могли бы определить VR как просто массив целых чисел, чтобы вам не нужно было их анализировать, и вы могли бы сохранить их в экземпляре, чтобы вам не приходилось создавать массив снова и снова и т. д.:

 int[] VR = new int[] {0, 10, 50, 75, 100};
person dokkaebi    schedule 19.12.2012
comment
привет, Dokkaebi... извините, что отвечаю позже... много вещей, на которых нужно сосредоточиться в проекте... и это последнее... наконец. Это решение не работает для меня... обратный отсчет не отменяется. Я присматриваю за этим и ищу другой способ сделать это... так что... за помощь. - person Rafael Godinho Brandão; 18.01.2013

Я нашел решение этой проблемы.

я объявляю countDownTimer как глобальную переменную.

CountDownTimer ctimer = null;

после этого... я создаю метод

private void timerRol(int contador) {
    if (contador == 0){
        Log.v(String.valueOf(contador), "Stopped");
    }else{  
        ctimer = new CountDownTimer(400000, contador) {

        @Override
        public void onTick(long millisUntilFinished) {

            scroll_letra.smoothScrollBy(0, (int) (millisUntilFinished / 300000));
        }

        @Override
        public void onFinish() {

        }
    };
    ctimer.start();
    }
}

после создания метода... я вызываю его при OnCreate, передавая значение в качестве параметра... и останавливаю его после вызова.

timerRol(100);
ctimer.cancel();

после этого я создаю панель поиска и вызываю метод, когда пользователь меняет позицию.

barraRolagem = (SeekBar) findViewById(R.exibir_musica.barraRolagem);
    barraRolagem.setVisibility(1);
    barraRolagem.setMax(5);
    barraRolagem.setProgress(0);
    final int[] crono = { 0, 750, 500, 100, 50, 1};

    barraRolagem.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {


                public void onStopTrackingTouch(SeekBar seekBar) {
                    // TODO Auto-generated method stub
                }

                public void onStartTrackingTouch(SeekBar seekBar) {
                    // TODO Auto-generated method stub

                }

                public void onProgressChanged(SeekBar seekBar,
                        int progress, boolean fromUser) {

                    if((crono[progress] == 0)) {

                            ctimer.cancel();
                    }else{

                        Log.v(String.valueOf(crono[progress]), "valor do crono");
                        ctimer.cancel();
                        timerRol(crono[progress]);

                    }
                }
            });
person Rafael Godinho Brandão    schedule 21.01.2013