2011-10-28 1 views
25

재생 상태를 청취하는 이벤트를 찾을 수 없습니다. 대부분 play/pause 주에 관심이 있습니다. 버튼이있는 MediaController을 사용하고 있지만 보조 버튼이있어서 Play/Pause도 있습니다. 사용자 정의 버튼을 사용하면 play/pause을 사용할 수 있지만 MediaControllerplay/pause 버튼을 사용하면 play/pause 버튼을 사용하는 경우 현재 사용자 정의 play/pause 버튼의 이미지를 재생하거나 일시 중지 할 수있는 방법이 없습니다.VideoView 재생 상태 또는 MediaController 재생/일시 중지 이벤트

내가 모르는 이벤트가있어서 재생/일시 중지 중 일부 작업을 수행 할 수 있습니까?

이 매우 비슷한 질문입니다 : How to catch event when click pause/play button on MediaController

답변

81

을 시작할 수 있어야, 그것은해야 후자를 비교적 쉽게 확장하고 자신의 청취자를 추가 할 수 있습니다. 우리가 우리 자신의 수신기를 연결 할 수있는 유일한 차이는 존재로, 일반 VideoView를 사용하여 동일 사용

public class CustomVideoView extends VideoView { 

    private PlayPauseListener mListener; 

    public CustomVideoView(Context context) { 
     super(context); 
    } 

    public CustomVideoView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public CustomVideoView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public void setPlayPauseListener(PlayPauseListener listener) { 
     mListener = listener; 
    } 

    @Override 
    public void pause() { 
     super.pause(); 
     if (mListener != null) { 
      mListener.onPause(); 
     } 
    } 

    @Override 
    public void start() { 
     super.start(); 
     if (mListener != null) { 
      mListener.onPlay(); 
     } 
    } 

    public static interface PlayPauseListener { 
     void onPlay(); 
     void onPause(); 
    } 

} 

:

사용자 정의 VideoView를 지켜 보면서는 가장 기본적인 형태로 다음과 같이 보일 것입니다 그것에.

// Some other code above... 
CustomVideoView cVideoView = (CustomVideoView) findViewById(R.id.custom_videoview); 
cVideoView.setPlayPauseListener(new CustomVideoView.PlayPauseListener() { 

    @Override 
    public void onPlay() { 
     System.out.println("Play!"); 
    } 

    @Override 
    public void onPause() { 
     System.out.println("Pause!"); 
    } 
}); 

cVideoView.setMediaController(new MediaController(this)); 
cVideoView.setVideoURI(...); 
// or 
cVideoView.setVideoPath(...); 
// Some other code below... 

마지막으로, 당신은 또한 당신의 XML 레이아웃에서 선언 할 수 있고 (위 그림과 같이)을 팽창 - 당신의 사용 <package_name>.CustomVideoView 있는지 확인하십시오. 예 :

<mh.so.CustomVideoView android:layout_width="wrap_content" 
    android:layout_height="wrap_content" android:id="@+id/custom_videoview" /> 
+0

천재! 고마워요. 완벽하게 작동했습니다. +50. 자바를 알기 전까지는 기다릴 수 없으며 액션 스크립트 같은 다른 것들도 알고 있습니다. – Ronnie

+1

도움이 된 것을 기쁘게 생각합니다. :) 그런데,'super'에 대한 호출은 대개 ​​메소드를 오버라이드하는 것과 함께 수행됩니다. 재정의하면 기본적으로 기본/수퍼/부모 클래스의 메서드를 다시 정의합니다. 이러한 오버라이드 된 메소드에서'super'를 호출하면 기능을 유지할 수 있습니다. 이는 기능을 추가하는 것이 목표 인 경우 수행하려는 작업입니다. 때로는 * 기능을 대체하기를 원할 수도 있습니다.이 경우'super '를 호출하지 않아도 원하는 결과를 얻을 수 있습니다. –

+1

괜찮 았던 것 같아서 매우 유용하다고 생각했습니다. 감사합니다. – Ronnie

1

당신은 당신이 VideoView와 조합 MediaController를 사용하는 경우 MediaController.MediaPlayerControl 자신을 설정하고 일시 정지를 무시하고

+1

나는'@ 일시 정지() 시작() 메소드 Override', 나는 dispatchEvent에 방법처럼 할 수있는 방법 (dispatchEvent에이 ActionScript 메서드가) 만약 내가 내 사용자 정의를 MediaController에서들을 수 있습니다. 또한, 나는 아직도 모든 일시적인 행동을 멈추고 시작하기를 원한다. 나는 그 경우'super'를 사용 하는가? 결코 진짜로 이해 슈퍼 – Ronnie