您的位置:首页 > 移动开发 > Android开发

MediaController是如何依附在VideoView上的

2016-05-04 23:23 691 查看
很多做视频播放器的朋友们非常想用自带的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个时序图,希望能够帮助你理解它们之间的关系(注意其中的注释)。





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的大小。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  视频 android