MediaController是如何依附在VideoView上的

很多做视频播放器的朋友们非常想用自带的VideoView来显示视频,用MediaController做为控制视频播放的组件,但是将这两个类全部copy过来之后会出现诸如之下很多问题:
 
1.“com.android.internal.policy.PolicyManager”是系统隐藏类,不允许在应用程序中直接引用。
   这时候采用反编译方式,骗过系统编译器即可,反编译代码如下。
   public static Window getPolicyWindow(Context context) {
Window window = null;
try {
Class<?> policyManagerClass = Class
.forName("com.android.internal.policy.PolicyManager");
Class<?>[] parMakeNewWindow = { Context.class };
Class<?>[] parConstructor = {};

Method makeNewWindow = policyManagerClass.getDeclaredMethod(
"makeNewWindow", parMakeNewWindow);

Object[] args = { context };
window = (Window) makeNewwindows.invoke(null, args);
} catch (ClassNotFoundException e) {
LogHelper.e(TAG, "getPolicyWindow, ", e);
} catch (NoSuchMethodException e) {
LogHelper.e(TAG, "getPolicyWindow, ", e);
} catch (IllegalAccessException e) {
LogHelper.e(TAG, "getPolicyWindow, ", e);
} catch (InvocationTargetException e) {
LogHelper.e(TAG, "getPolicyWindow, ", e);
}
return window;
}

2. 视频显示页面VideoView 很明显与 视频播放控制相关按钮MediaController实现了彻底分离,但这两个类是如何协同作用的呢?或者说MediaController是如何依附在VideoView上,并点击其中按钮就能控制VideoView中所播放的视频的播放与暂停呢?

为了更好的解决这个问题,我画了2个时序图,希望能够帮助你理解它们之间的关系(注意其中的注释)。


MediaController是如何依附在VideoView上的


1.       控制组件位于FrameLayout中.

2.       FrameLayout位于Window (通过mWindow.setContentView(this)).

3.       控制组件的显示与隐藏 是通过mDecor对象(就是包含控制组件的View)是否添加到WindowManager中来完成(通过mWindowManager.removeView(mDecor) 或mWindowManager.addView(mDecor)).


两个类的职责:

1.       VideoView功能如下:

(1)       视频容器。 MediaPlayer 的各种Listener在此监听

(2)       控制显示的视频的大小

(3)       控制MediaController中控制组件的显示与否

2.       MediaController功能如下:所有的页面控制逻辑都放置在此

(1)       手势监听(单击,双击等)

(2)       播放,上一首,下一首按钮的功能实现

(3)   SeekBar的更新


注意事项:

  注意VideoView中的onMeasure(int widthMeasureSpec, int heightMeasureSpec);

有时候无法设置全屏显示视频,显示的视频的大小受该方法控制。该方法负责控制SurfaceView的整体大小,视频是被填充在它里面,视频最大也就是SurfaceView的大小。

展开阅读全文

没有更多推荐了,返回首页