解决SurfaceView调用setZOrderOnTop(true)遮挡其他控件的问题
2016-04-09 12:04
543 查看
SurfaceView遮挡其他控件的项目背景:
最近在做播放器项目,由于底层实现是用Surface和OpenGL切换渲染,所以在布局里面同时使用了GLSurfaceView和SurfaceView,同时播放控制按钮是自定义的,也没有使用Android自己提供的MediaCtroller控件。在这种背景下,问题出现了,如果有相关开发基础的同学应该知道,当SurfaceView和GLSurfaceView同时在一个布局里面,如果想让SurfaveView显示图片或者视频必须要调用SurfaceView.setZOrderOnTop(true),也就是说必须把SurfaceView置于Activity显示窗口的最顶层才能正常显示,然后调用了SurfaceView.setZOrderOnTop(true)又导致了其他控件比如播放、快进等按钮被遮挡。网上有很多解决方案,比如解决SurfaceView设置透明造成遮盖其他组件的替代方案,对于视频播放的页面都不够完美,因为它是直接在SurfaceView上面绘制相关的控件,试想一下如果在SurfaceView的某些区域绘制了一些按钮,势必会挡住一部分视频画面,这样对于用户来说是很难接受的。
从SurfaceView源码中寻找解决方案:
由于在网上找的解决方案都不能满足要求,没办法有折回来查看了下SurfaceView的源码,在查看源码的时候看到这个方法setZOrderMediaOverlay(boolean isMediaOverlay),下来我们来看看源码中对这个方法的描述:
Control whether the surface view's surface is placed on top of another regular surface view in the window (but still behind the window itself).This is typically used to place overlays on top of an underlying media surface view.
Note that this must be set before the surface view's containing window is attached to the window manager.
Calling this overrides any previous call to {@link #setZOrderOnTop}.
大概的意思就是说控制窗口中表面的视图层是否放置在常规视图层的顶部。
最终,我在调用setZOrderOnTop(true)之后调用了setZOrderMediaOverlay(true),OK,遮挡问题完美解决!
最近在做播放器项目,由于底层实现是用Surface和OpenGL切换渲染,所以在布局里面同时使用了GLSurfaceView和SurfaceView,同时播放控制按钮是自定义的,也没有使用Android自己提供的MediaCtroller控件。在这种背景下,问题出现了,如果有相关开发基础的同学应该知道,当SurfaceView和GLSurfaceView同时在一个布局里面,如果想让SurfaveView显示图片或者视频必须要调用SurfaceView.setZOrderOnTop(true),也就是说必须把SurfaceView置于Activity显示窗口的最顶层才能正常显示,然后调用了SurfaceView.setZOrderOnTop(true)又导致了其他控件比如播放、快进等按钮被遮挡。网上有很多解决方案,比如解决SurfaceView设置透明造成遮盖其他组件的替代方案,对于视频播放的页面都不够完美,因为它是直接在SurfaceView上面绘制相关的控件,试想一下如果在SurfaceView的某些区域绘制了一些按钮,势必会挡住一部分视频画面,这样对于用户来说是很难接受的。
从SurfaceView源码中寻找解决方案:
由于在网上找的解决方案都不能满足要求,没办法有折回来查看了下SurfaceView的源码,在查看源码的时候看到这个方法setZOrderMediaOverlay(boolean isMediaOverlay),下来我们来看看源码中对这个方法的描述:
Control whether the surface view's surface is placed on top of another regular surface view in the window (but still behind the window itself).This is typically used to place overlays on top of an underlying media surface view.
Note that this must be set before the surface view's containing window is attached to the window manager.
Calling this overrides any previous call to {@link #setZOrderOnTop}.
大概的意思就是说控制窗口中表面的视图层是否放置在常规视图层的顶部。
最终,我在调用setZOrderOnTop(true)之后调用了setZOrderMediaOverlay(true),OK,遮挡问题完美解决!
相关文章推荐
- Android自定义View过程解析
- Android自定义View软键盘实现搜索
- codeigniter中view通过循环显示数组数据的方法
- MVVM模式中ViewModel和View、Model有什么区别?
- Android应用开发中View绘制的一些优化点解析
- 自定义滑动按钮为例图文剖析Android自定义View绘制
- Android自定义View实现带数字的进度条实例代码
- Android重写View并自定义属性实例分析
- android开发教程之view组件添加边框示例
- Android动态添加View的问题解决方法
- Android viewpager中动态添加view并实现伪无限循环的方法
- Android自定义View之酷炫圆环(二)
- android获得当前view在屏幕中坐标的方法
- Android View如何测量
- 4种Android获取View宽高的方式
- Android获取屏幕或View宽度和高度的方法
- Android中将View的内容保存为图像的简单实例
- Android View移动的六种方法小结
- Android View添加 Listener 实例代码
- Android编程之View简单学习示例