Android 在ArFragment中隐藏加载屏幕
我对ArCore和使用ArFragment是新手。我想在检测到飞机时显示我的“菜单”视图并隐藏此加载图像。 我使用了“arFragment.getArSceneView.getScene().setOnUpdateListener”。 每当我实现我自己的“setOnUpdateListener”时,我都能够显示我的菜单,但这个加载图像不会隐藏。此图像仅在我未实现updateListener时自动隐藏。 下面是activity_main.xml的片段和MainActivity.java的侦听器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的侦听器
<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方法的变量,->指向要运行的代码。这可以是一个函数、一条语句或大括号中的一组语句。