在 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)
}
}
}
}
我是 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)
}
}
}
}