2011-04-28 2 views
0

SeekBar을 내 비디오 앱에 연결했지만 바 끝까지 도달하지 못했습니다. 여기 코드는 다음과 같습니다Android SeekBar의 올바른 사용법은 무엇입니까?

videoSeekBar = (SeekBar) activity.findViewById(R.id.videoPlayerSeek); 
videoDuration = player.getDuration(); 
videoSeekBar.setMax(videoDuration); 
videoSeekBar.setProgress(0); 

// Start lengthy operation in a background thread 
new Thread(new Runnable() { 
    public void run() { 
     while (videoPlayProgress < videoDuration) { 
      videoPlayProgress = player.getCurrentPosition(); 

      // Update the progress bar 
      handler.post(new Runnable() { 
       public void run() { 
        videoSeekBar.setProgress(videoPlayProgress); 
       } 
      }); 
     } 
    } 
}).start(); 

을 그리고, 내가 MediaPlayer를에 첨부 된 OnCompleteListener 있습니다. 그것은,

player.getCurrentPosition() 반환 6209

player.getDuration() 반환 맞지 않을 수

6592이라고합니다. 이 시점에서 슬라이더 상태 표시기는 슬라이더 막대 끝에 있지 않지만 약간의 간격이 있습니다. 동영상의 길이가 짧을수록 갭이 커집니다.

답변

3

먼저 < 대신 <=을 고려하십시오.

더 중요한 것은,이를 위해 바쁜 루프 백그라운드 스레드가 필요하거나 원하지 않는다는 것입니다. 비디오가 시작될 때

Runnable r=new Runnable() { 
    public void run() { 
     videoSeekBar.setProgress(player.getCurrentPosition()); 

     if (player.getCurrentPosition()<player.getDuration()) { 
      videoSeekBar.postDelayed(r, 33); 
     } 
    } 
}; 

어딘가에는, rrun() 전화 : 같은과 함께 할 것입니다. 그러면 초당 약 30 번 SeekBar이 업데이트됩니다.

현재 구현은 전경 바쁜 루프이며 주 응용 프로그램 스레드의 대기열에 수천 개의 메시지를 게시하여 비디오 재생 성능을 악화시키고 특별한 이점이없는 배터리를 낭비합니다.

여전히 끝까지 도달하지 못했을 수도 있습니다. setProgress() 전화와 if 테스트 사이에 비디오가 끝날 수도 있습니다. 마지막에 실제로 적용되는 테스트는 OnCompletionListener이므로 끝 부분에 SeekBar을 배치하면됩니다.

+0

여기에있는 모든 내용이 제가 작성한 답변보다 낫습니다. – LeffelMania

+0

안녕하세요 CommonsWare 귀하의 게시물은 매우 도움이됩니다. 그러나 나는 탐색 바를 바꿀 때 비디오가 부드럽게 움직 이도록해야합니다. 내 경우에는 탐색 막대를 움직이면 비디오가 중단되고 최신 위치로 이동합니다. 나를 안내 해줘. – Som

관련 문제