2011-10-28 161 views
25

我似乎無法找到偵聽播放狀態的事件。我最感興趣的是play/pause狀態。我正在使用MediaController,它有一個Play/Pause按鈕,但我有一個輔助按鈕,它也控制着Play/Pause。使用我的自定義按鈕,我可以play/pause,但如果我play/pause使用MediaControllerplay/pause按鈕,我目前無法將自定義的play/pause按鈕上的圖像更改爲播放或暫停。VideoView播放狀態或MediaController播放/暫停事件

有沒有我不知道的事件,所以我可以在播放/暫停期間做一些工作?

這是一個非常類似的問題:How to catch event when click pause/play button on MediaController

回答

81

如果你在組合使用MediaControllerVideoView,它應該是相對容易擴展後者並添加自己的偵聽器。然後

定製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給你。我不能等到我知道Java以及我知道其他事情如動作腳本。 – Ronnie

+1

很高興有幫助。 :)順便說一下,調用'super'通常與重寫方法一起完成。通過重寫,你基本上重新定義了基類/超類/父類的方法。如果你用這種重寫的方法調用'super',你會保留它的功能,如果你的目標是*添加*功能,這就是你想要做的。有時候你可能想要*替換*功能,在這種情況下,你可以通過不調用'super'來獲得期望的結果。 –

+1

好吧,這是我認爲和非常有用的知道,謝謝 – Ronnie

1

您應該能夠設置自己的MediaController.MediaPlayerControl並覆蓋暫停和啓動

+1

如果我'@ Override'暫停()的start()方法,我該怎麼辦像dispatchEvent方法(dispatchEvent是一個ActionScript方法),我可以聽我定製的MediaController。另外,我仍然希望暫停和開始所有常規行爲,在這種情況下是否使用'super'?從來沒有真正理解超級 – Ronnie