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 (InvocationTargetExceptio n 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的大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值