关于SurfaceView与高德地图互相穿透的解决方案
最近项项目中有需求将地图和相机都放在主页面,这个也就是放在同一个framelayout中,这个东西看似很简单的需求,却让我头疼了2天。因为发现高德地图会和相机的预览画面互相穿透(PS:因为我们APP需要在国外上架使用了2套地图很神奇的是谷歌地图没任何问题),根本无法解决此问题。后来去查了高德地图的解决方案
文章图片
文章图片
好了,看到了解决方案了很开心,然后高高兴兴去改了。符截图
文章图片
文章图片
文章图片
也不知道是不是我用的姿势不对,发现并没什么luan用,怎么办呢?毕竟问题要解决是吧,首先从framelayout入手framelayout是将布局层叠在一块,会相互穿透会不会就是因为这个重叠的原因呢,既然和hidefragment无法解决,是不是可以通过visible解决呢。
那什么时候显示什么时候隐藏呢。
【关于SurfaceView与高德地图互相穿透的解决方案】我的做法是这样的
文章图片
文章图片
@Override public void onHiddenChanged(boolean hidden) { super.onHiddenChanged(hidden); if(hidden){ if(mapView!=null) { mapView.setVisibility(View.GONE); } } else { if(mapView!=null) { mapView.setVisibility(View.VISIBLE); } } }
当framgent显示的时候就把地图显示出来,当fragment失去焦点后把地图隐藏 了,这样就解决了地图穿透在相机预览界面上了。
好了下部解决相机穿透在地图上的问题,问题主要来源于surfaceView 所以我的思路是在fragment失去焦点后把surfanceview移除了
文章图片
文章图片
@Override public void onHiddenChanged(boolean hidden) { super.onHiddenChanged(hidden); if (hidden) { isVisible = false; linearLayoutCamera.removeAllViews(); // camera_root.setVisibility(View.GONE); if (camera != null) camera.release(); } else { //camera_root.setVisibility(View.VISIBLE); openCamera(); isVisible = true; } }
我的surfaceview是在linearlayout中。所以在失去焦点时把surfaceview直接移除掉,并把相机释放掉。减少内存的使用,并在获取焦点时再次打开相机并把surfaceview添加进来。以上就完美解决了互相穿透的BUG啦
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- Docker应用:容器间通信与Mariadb数据库主从复制
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 第326天
- Shell-Bash变量与运算符
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- 四首关于旅行记忆的外文歌曲
- 逻辑回归的理解与python示例
- 醒不来的梦
- Guava|Guava RateLimiter与限流算法