ArFragment中加载界面无法自动隐藏的问题求助
解决ArFragment自定义更新监听器导致加载图片无法自动隐藏的问题
你遇到的问题其实是因为setOnUpdateListener()会替换掉ArFragment内部用于管理默认平面检测加载UI的监听器——当你设置自己的监听器后,原来负责自动隐藏加载图的原生逻辑就无法执行了,所以才会出现菜单能正常显示,但加载图一直留在界面上的情况。
下面给你两种可行的解决方案:
方案1:添加而非替换更新监听器(推荐)
ArSceneView的Scene支持添加多个更新监听器,用addOnUpdateListener()代替setOnUpdateListener(),这样既可以执行你的自定义逻辑,又能保留ArFragment原生的加载图管理逻辑:
ArSceneView arSceneView = arFragment.getArSceneView(); // 使用addOnUpdateListener,保留原生监听器 arSceneView.getScene().addOnUpdateListener(frameTime -> { Frame frame = arSceneView.getArFrame(); if (frame == null) { return; } if (frame.getCamera().getTrackingState() != TrackingState.TRACKING) { return; } for (Plane plane : frame.getUpdatedTrackables(Plane.class)) { if (plane.getTrackingState() == TrackingState.TRACKING) { Log.e("Plane Detected",""); hsv.setVisibility(View.VISIBLE); } } });
方案2:手动控制加载图的显示与隐藏
如果你确实需要替换原生监听器,可以通过ArFragment的PlaneDiscoveryController手动管理加载图的状态,在你的逻辑中添加显示/隐藏的判断:
ArSceneView arSceneView = arFragment.getArSceneView(); arSceneView.getScene().setOnUpdateListener(frameTime -> { Frame frame = arSceneView.getArFrame(); if (frame == null) { return; } TrackingState cameraTrackingState = frame.getCamera().getTrackingState(); PlaneDiscoveryController discoveryController = arFragment.getPlaneDiscoveryController(); // 摄像头追踪丢失时,显示加载图 if (cameraTrackingState != TrackingState.TRACKING) { discoveryController.show(); return; } boolean hasTrackingPlane = false; for (Plane plane : frame.getUpdatedTrackables(Plane.class)) { if (plane.getTrackingState() == TrackingState.TRACKING) { hasTrackingPlane = true; break; } } if (hasTrackingPlane) { Log.e("Plane Detected",""); hsv.setVisibility(View.VISIBLE); // 检测到平面时隐藏加载图 discoveryController.hide(); } else { // 未检测到有效平面时显示加载图 discoveryController.show(); } });
简单总结一下:方案1更省心,完全复用原生逻辑;方案2适合需要精细控制加载图显示时机的场景,根据你的需求选择就好。
内容的提问来源于stack exchange,提问作者Daniyal Javaid
相关产品推荐
相关产品推荐

