在 ArFragment 中隐藏加载屏幕

Hide Loading Screen In ArFragment

我是 ArCore 新手,正在使用 ArFragment。我想在检测到飞机时显示我的 "menu" 视图并隐藏此加载图像。

我使用了“arFragment.getArSceneView.getScene().setOnUpdateListener”。 每当我实现自己的 "setOnUpdateListener" 时,我都能够显示我的菜单,但此加载图像不会隐藏。此图像仅在我未实施 updateListener 时自动隐藏。 这是来自 activity_main.xml 的片段和来自 MainActivity.java

的听众
<fragment android:name="com.google.ar.sceneform.ux.ArFragment"
    android:id="@+id/ux_fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

        ArSceneView arSceneView =arFragment.getArSceneView();
    arSceneView.getScene().setOnUpdateListener(
            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("********************","");
                        hsv.setVisibility(View.VISIBLE);
                    }
                }
            });

您可以解决让平面发现视图始终在启动时显示的问题,方法是隐藏视图,然后将其设置为 null,这样它就不会重新出现。在 onCreate() 添加:

arFragment = (ArFragment) 
        getSupportFragmentManager().findFragmentById(R.id.ux_fragment);
arFragment.getPlaneDiscoveryController().hide();
arFragment.getPlaneDiscoveryController().setInstructionView(null);

编辑:在最近的 Sceneform 版本中不再需要以下内容。如果您可以使用 addOnUpdateListener 而不是 setOnUpdateListener,则您不必执行我在下面描述的操作。

如果您设置自己的 OnUpdateListener,则必须在 OnUpdateListener 的实现中调用 arFragment.onUpdate(frameTime);。在你的情况下是:

ArSceneView arSceneView = arFragment.getArSceneView();
arSceneView.getScene().setOnUpdateListener(
        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("********************","");
                    hsv.setVisibility(View.VISIBLE);
                }
            }
            arFragment.onUpdate(frameTime);
        });

通过这种方式,您仍然可以显示 InstructionView,而无需在发现平面后保留它。

我有以下代码,可能更容易使用。通过扩展 ArFragment class,您有多种可能性来操纵视图和行为。

OnResume 调用 onStart() 将显示 planeDiscoveryController(四处移动的手),直到它找到一个 Plane。这就是我在自己的 onResume 方法中调用 hide() 的原因。

BaseArFragment 的 OnWindowFocusChanged 将强制屏幕扩展为全屏。通过覆盖该方法,我删除了正在改变我的屏幕的标志,只保留用于保持屏幕打开和明亮的标志。

class ProductArFragment : ArFragment() {

    override fun onResume() {
        super.onResume()
        planeDiscoveryController.hide()
    }

    override fun onWindowFocusChanged(hasFocus: Boolean) {
        activity?.let { act ->
            if (hasFocus) {
                act.window.addFlags(WindowManager
                        .LayoutParams.FLAG_KEEP_SCREEN_ON)
            }
        }
    }
}