如何刷新/重绘在Android Sceneform中渲染的TextView?

问题描述 投票:0回答:1

我的目的是在Android Sceneform应用程序的增强图像中使用TextView(“信息卡”)显示动态传感器读数。

我使用SceneForm的AugmentedImage示例作为基础。我从Solarsystem示例中复制了信息卡概念,最后(经过一些令人沮丧的努力之后)设法找到了一种从lambda函数中获取TextView的方法,这样我就可以在主要活动中使用setText(相当一些自从我之前的java 1.2体验以来的时间)。我现在能够将textText()成功地添加到带有时间戳值的TextView(使用getText()调试),但是稍后会尝试将其更改为通过HTTP或MQTT获取值。

问题是,一旦使用正确显示的第一个值启动视图,我就无法在屏幕上重新绘制TextView /(infocard)。我试图使TextView实例无效以及其他一些方法来重新绘制节点但没有成功。

在AugmentedImageActivity中:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.ux_fragment);
    fitToScanView = findViewById(R.id.image_view_fit_to_scan);

    LinearLayout mainLayout = (LinearLayout) findViewById(R.layout.activity_main);
    LayoutInflater inflater = getLayoutInflater();
    View infoCardLayout = inflater.inflate(R.layout.info_card_view, mainLayout, false);
    textView = (TextView) infoCardLayout.findViewById(R.id.textView);

    arFragment.getArSceneView().getScene().addOnUpdateListener(this::onUpdateFrame);
}

在AugmentedImageActivity中:

private void onUpdateFrame(FrameTime frameTime) {
    Frame frame = arFragment.getArSceneView().getArFrame();
    Log.d("TW_onUpdateFrame","onUpdateFrame");
    String t = String.valueOf(System.currentTimeMillis());
    t = t.substring(t.length()-6);
    textView.setText(t);

在setImage中的AugmentedImageNode.java中:

  ...
  localPosition.set(0.0f, 0.0f, -0.8f * image.getExtentZ());
  infoCard = new Node();
  infoCard.setParent(this);
  infoCard.setEnabled(true);
  infoCard.setLocalPosition(localPosition);
  infoCard.setLocalRotation(new Quaternion(new Vector3(1.0f,0.0f,0.0f),-90));

  ViewRenderable.builder()
          .setView(context, R.layout.info_card_view)
          .build()
          .thenAccept(
                  (renderable) -> {
                      infoCard.setRenderable(renderable);
                      TextView textView = (TextView) renderable.getView();
                      textView.setText("Value from setImage");
                  })
          .exceptionally(
                  (throwable) -> {
                      throw new AssertionError("Could not load info card view.", throwable);
                  });

我如何以及在哪里获得信息卡的TextView重新粉刷?还要考虑到将来需要通过HTTP异步获取值吗?这个带有thenAccept的lambda函数的ViewRenderable.builder()让我哭泣:)

android arcore sceneform
1个回答
0
投票

您通过在构造函数中对其进行膨胀来创建视图两次,然后让ViewRenderable构建器再次对其进行充气。您保存的那个不是实际渲染的那个。

您只构建一次ViewRenderable,因此thenAccept的回调仅被调用一次。您需要将您在其中获得的视图保存到AugmentedImageNode中的某个变量,然后使用getter函数公开它,以便您可以在AugmentedImageActivity中检索它。然后你会像以前一样在setText中打电话给onUpdateFrame

另外请记住,renderable.getView()为您提供布局视图,您仍然需要调用findViewById来获取textView。

© www.soinside.com 2019 - 2024. All rights reserved.