如果您正在将MediaController
与VideoView
结合使用,那么扩展后者并添加自己的监听器应该相对容易。
自定义的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
完全相同,唯一的区别是我们现在可以将自己的监听器连接到它上面。
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(...);
cVideoView.setVideoPath(...);
最后,您也可以在xml布局中声明它并进行充气(如上所示)-只需确保使用<package_name>.CustomVideoView
。例如:
<mh.so.CustomVideoView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/custom_videoview" />
super
通常与重写方法一起使用。通过重写,您基本上正在重新定义基类/超级/父类的方法。如果在这样的重写方法中调用super
,则将保留其功能,这是如果您的目标是添加功能,则需要执行的操作。但有时您可能想要替换功能,在这种情况下,不调用super
可能会得到所需的结果。 - MH.VideoView
没有提供任何回调来获取缓冲更新。但是,您可以尝试在OnPreparedListener
回调中获取对底层MediaPlayer
实例的引用,并将OnBufferingUpdateListener
设置为该实例。请注意,这将覆盖VideoView
的侦听器,但这不应该是什么大问题,因为后者仅使用它来跟踪缓冲百分比(但不在任何地方使用它,除了在getBufferPercentage()
中返回它)。 - MH.