【转载】解决SurfaceView调用setZOrderOnTop(true)遮挡其他控件的问题

  1. SurfaceView遮挡其他控件的项目背景:

    最近在做播放器项目,由于底层实现是用Surface和OpenGL切换渲染,所以在布局里面同时使用了GLSurfaceView和SurfaceView,同时播放控制按钮是自定义的,也没有使用Android自己提供的MediaCtroller控件。在这种背景下,问题出现了,如果有相关开发基础的同学应该知道,当SurfaceView和GLSurfaceView同时在一个布局里面,如果想让SurfaveView显示图片或者视频必须要调用SurfaceView.setZOrderOnTop(true),也就是说必须把SurfaceView置于Activity显示窗口的最顶层才能正常显示,然后调用了SurfaceView.setZOrderOnTop(true)又导致了其他控件比如播放、快进等按钮被遮挡。网上有很多解决方案,比如解决SurfaceView设置透明造成遮盖其他组件的替代方案,对于视频播放的页面都不够完美,因为它是直接在SurfaceView上面绘制相关的控件,试想一下如果在SurfaceView的某些区域绘制了一些按钮,势必会挡住一部分视频画面,这样对于用户来说是很难接受的。

  2. 从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,遮挡问题完美解决!

  

本文出自 “西城天部” 博客,请务必保留此出处http://marller.blog.51cto.com/8699646/1762028

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中的SurfaceView是用于在后台线程上绘制复杂图形和动画效果的视图。当在SurfaceView上绘制图形时,可能会遇到遮挡问题,原因有以下几种: 1. Z轴顺序问题:绘制在SurfaceView上的绘图会按照绘制顺序进行堆叠,后绘制的绘图会覆盖先绘制的绘图。所以如果某个图形遮挡了其他图形,可以尝试调整绘制的顺序。 2. 透明度问题:如果SurfaceView或绘制的图形具有不透明度,那么它们可能会遮挡后面的图形。可以尝试调整透明度,或者使用透明背景。 3. 窗口遮挡:如果SurfaceView所在的窗口被其他窗口遮挡,那么SurfaceView上的图形也会被遮挡。可以尝试将SurfaceView所在的窗口移到顶层。 4. 大小和位置设置问题:如果SurfaceView的大小或位置设置不正确,也会导致图形被遮挡。可以尝试调整SurfaceView的大小和位置。 解决这些问题的方法有以下几种: 1. 调整绘制顺序:你可以尝试修改绘制的顺序,让需要显示在前面的图形后绘制。 2. 调整透明度:如果SurfaceView或绘制的图形具有透明度,可以尝试调整透明度来解决遮挡问题。 3. 调整窗口设置:如果SurfaceView所在的窗口被其他窗口遮挡,可以尝试调整窗口设置,将SurfaceView所在的窗口移到顶层。 4. 调整SurfaceView的大小和位置:确保SurfaceView的大小和位置设置正确,以免遮挡其他图形。 总之,遮挡问题可能由于绘制顺序、透明度、窗口设置或SurfaceView的大小和位置设置不正确而引起。通过调整这些参数,可以解决SurfaceView遮挡问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值