Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在ArFragment中隐藏加载屏幕_Android_Augmented Reality_Arcore_Sceneform - Fatal编程技术网

Android 在ArFragment中隐藏加载屏幕

Android 在ArFragment中隐藏加载屏幕,android,augmented-reality,arcore,sceneform,Android,Augmented Reality,Arcore,Sceneform,我对ArCore和使用ArFragment是新手。我想在检测到飞机时显示我的“菜单”视图并隐藏此加载图像。 我使用了“arFragment.getArSceneView.getScene().setOnUpdateListener”。 每当我实现我自己的“setOnUpdateListener”时,我都能够显示我的菜单,但这个加载图像不会隐藏。此图像仅在我未实现updateListener时自动隐藏。 下面是activity_main.xml的片段和MainActivity.java的侦听器

我对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);
                    }
                }
            });

ArSceneView ArSceneView=arFragment.getArSceneView();
arSceneView.getScene().setOnUpdateListener(
帧时间->{
Frame Frame=arSceneView.getArFrame();
if(frame==null){
返回;
}
if(frame.getCamera().getTrackingState()!=TrackingState.TRACKING){
返回;
}
用于(平面:frame.getUpdatedTrackables(平面.class)){
if(plane.getTrackingState()==TrackingState.TRACKING){
Log.e(“*******************”,”);
hsv.setVisibility(视图可见);
}
}
});

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

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

编辑:在最近的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);
        });

这样,在发现平面后,您仍然可以显示指令视图,而不必保留它。

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

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

OnWindowFocusChanged from BaseArFragment将强制屏幕扩展为全屏。通过重写该方法,我删除了更改屏幕的标志,只保留了保持屏幕打开和明亮的标志

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)
            }
        }
    }
}

我将传递反馈,最好有一种启用和禁用动画的方法。根据文档,“如果设置了setOnUpdateListener(Scene.OnUpdateListener),那么必须手动调用onUpdate(FrameTime)”。这个“帧时”箭头函数也称为onUpdate函数吗?arSceneView.getScene().setOnUpdateListener(帧时间->{});是的,这是Java8语法。frameTime是传递给listener方法的变量,->指向要运行的代码。这可以是一个函数、一条语句或大括号中的一组语句。