在ArFragment中隐藏加载屏幕

时间:2018-05-15 11:26:28

标签: android augmented-reality arcore sceneform

我是ArCore的新手并使用ArFragment。我想展示我的菜单"查看平面时查看并隐藏此加载图像。 enter image description here

我使用" 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);
                    }
                }
            });

3 个答案:

答案 0 :(得分:2)

您可以通过隐藏视图,然后将其设置为null以使其不会重新出现,从而解决在启动时始终显示平面发现视图的问题。在onCreate()添加:

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

答案 1 :(得分:0)

如果您设置了自己的OnUpdateListener,则必须在arFragment.onUpdate(frameTime);的实施中致电OnUpdateListener。在你的情况下:

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。

答案 2 :(得分:0)

我有以下代码,可能更易于使用。通过扩展ArFragment类,您可以操纵视图和行为。

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

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

@RequestParam