2011-10-28 159 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