我正在尝试使用SeekBar来控制CountDownTimer的速度,但我在两个问题中停了下来。1-当我更改搜索栏progress...but时,DownTimerInterval不会重置。每次更改时,都会添加进度值。2-当搜索栏进度设置为0....and it set时,我想停止倒计时。如何解决这个问题?
以下是我的代码
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();
}
}
});
}发布于 2012-12-20 01:25:29
保留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数组,这样就不必解析它们,也可以将它们保留在实例上,这样就不必一遍又一遍地创建数组,等等:
int[] VR = new int[] {0, 10, 50, 75, 100};发布于 2013-01-22 02:47:39
我找到了这个问题的解决方案。
我将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上调用它,以parameter...and的形式传递一个值,在调用之后停止它。
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]);
}
}
});https://stackoverflow.com/questions/13957569
复制相似问题