2012-07-19 3 views
2

손가락이 슬라이더에서 들어올 때까지 MediaPlayer에 대한 업데이트가 발생하지 않도록 MediaController 진행 슬라이더로 터치 이벤트를 잡아야합니다.MediaController 진행 슬라이더 제어하기

[아마도 내 상황은 독특합니다. 각 "프로그램"마다 여러 개의 "스택"으로 구성된 스트리밍 비디오를 재생하고 있습니다. 다음 스택은 이전 스택이 완료 될 때까지로드되지 않습니다. 슬라이더는 모든 스택의 지속 시간을 나타내야하며 "엄지 손가락"의 진행은 총 지속 시간을 나타낼 필요가 있습니다. 이것은 쉽게 앞뒤로 타임 라인을 따라 MediaPlayerControlgetBufferPercentage(), getCurrentPosition()getDuration() 방식 (엄지를 이동) "세정"더 문제

을 대체함으로써 행해진 다. 이로 인해 데이터 소스가 set 번으로 여러 번 이동하고 모든 이동에 대해 seekTo이 발생하면 매우 신속하게 작동이 중단되고 중단됩니다. 사용자가 스크럽을 마칠 때까지 MediaPlayer가 아무런 동작도하지 않는 것이 좋습니다.

다른 사람들이 작성한 것처럼 그렇습니다. MediaController를 직접 구현하는 것이 가장 좋습니다. 그런데 왜 모든 것을 다시 할 수 있습니까? MediaController를 확장하려고 시도했지만 빠르게 복잡해졌습니다. 슬라이더에 터치 이벤트를 잡아 내고 싶었습니다.

답변

15

하나를 MediaController의 요소에 대한 핸들을 얻을 수 있습니다 :

seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 
    @Override 
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
     // Log.i("TAG", "#### onProgressChanged: " + progress); 
     // update current position here 
     } 

    @Override 
    public void onStartTrackingTouch(SeekBar seekBar) { 
     // Log.i("TAG", "#### onStartTrackingTouch"); 
     // this tells the controller to stay visible while user scrubs 
     mController.show(3600000); 
     // if it is possible, pause the video 
     if (playerState == MPState.Started || playerState == MPState.Paused) { 
      mediaPlayer.pause(); 
      playerState = MPState.Paused; 
     } 
    } 

    @Override 
    public void onStopTrackingTouch(SeekBar seekBar) { 
     int seekValue = seekBar.getProgress(); 
     int newMinutes = Math.round((float)getTotalDuration() * (float)seekValue/(float)seekBar.getMax()); 
     // Log.i("TAG", "#### onStopTrackingTouch: " + newMinutes); 
     mController.show(3000); // = sDefaultTimeout, hide in 3 seconds 
    } 
}); 

: 그런 다음 세 개의 public 메소드를 구현해야합니다 SeekBar를에 리스너를 설정

final int topContainerId1 = getResources().getIdentifier("mediacontroller_progress", "id", "android"); 
final SeekBar seekbar = (SeekBar) mController.findViewById(topContainerId1); 

주의 사항 : 왼편 TextView 시간 값을 제거 할 때 현재 위치가 업데이트되지 않습니다. (나는이 마진을 감당할 수 없을만큼 놀라운 방법을 사용했다.)

+0

고마워요! 시간이 많이 남았습니다. –

+2

SeekBar **의 인스턴스 생성은 ** VideoView.onPrepared (..) 콜백 메소드에서 발생해야합니다. – Moonlit

+0

왼손잡이 시간 텍스트 뷰어를 업데이트하는 방법을 아는 것이 굉장 할 것입니다 ... – Moonlit