You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:57:25