2012-12-19 3 views
0

저는 CountDownTimer의 속도를 제어하기 위해 SeekBar를 사용하려고하는데 2 가지 문제에서 중단됩니다. 1 - 내가 seekbar 진행률을 변경할 때 DownTimerInterval이 재설정되지 않지만 변경 될 때마다 진행률 값을 추가하십시오. 2 - seekbar 진행률이 0으로 설정된 경우 카운트 다운을 중지하고 싶습니다. 작동하지 않습니다. 어떻게 해결할 수 있습니까?SeekBar 및 CountDownTimer

여기 당신이 필요로 할 때 당신이 그것을 취소 할 수 있도록

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

가 인스턴스 필드로 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을 인스턴스에 유지할 수 있으므로 배열을 반복해서 만들 필요가 없습니다. 예 :

int[] VR = new int[] {0, 10, 50, 75, 100}; 
+0

안녕하세요 ... 나중에 회신 해 주셔서 감사합니다 ... 프로젝트에 집중할 많은 것들 ... 이것이 마지막 것입니다 ... 마침내. 이 솔루션은 나를 위해 작동하지 않습니다 ... countDown 취소하지 않습니다. 나는 이것을 보면서 다른 방법을 찾고있다. 그래서 도움을 요청했다. –

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(); 

그 다음에 seekbar를 만들고 사용자가 위치를 변경할 때이 메서드를 호출합니다.

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]); 

        } 
       } 
      });