我正在尝试使用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();
}
}
});
}
答案 0 :(得分:0)
将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定义为一个整数数组,这样您就不必解析它们,并且可以将它们保留在实例上,这样您就不必一遍又一遍地创建数组等:< / p>
int[] VR = new int[] {0, 10, 50, 75, 100};
答案 1 :(得分:0)
我找到了解决这个问题的方法。
我将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]);
}
}
});