2

我是 ArCore 的新手并使用 ArFragment。我想在检测到飞机时显示我的“菜单”视图并隐藏这个加载图像。 在此处输入图像描述

我使用了“ 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);
                    }
                }
            });
4

3 回答 3

4

您可以通过隐藏视图来解决让平面发现视图始终在启动时显示的问题,然后将其设置为空,这样它就不会重新出现。补充onCreate()

arFragment = (ArFragment) 
        getSupportFragmentManager().findFragmentById(R.id.ux_fragment);
arFragment.getPlaneDiscoveryController().hide();
arFragment.getPlaneDiscoveryController().setInstructionView(null);
于 2018-05-15T21:28:12.427 回答
0

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

如果您设置自己的,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 而不会停留。

于 2018-06-04T13:59:51.393 回答
0

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

OnResume 调用 onStart() 将显示 planeDiscoveryController(手四处移动),直到找到一个平面。这就是我在自己的 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)
            }
        }
    }
}
于 2020-02-26T10:40:17.823 回答