Мое намерение состоит в том, чтобы показывать динамические показания датчика с помощью TextView («информационная карта») в расширенном изображении приложения Android Sceneform.
В качестве основы я использую образец AugmentedImage SceneForm.Я скопировал концепцию информационной карты из примера Solarsystem и, наконец, (после нескольких трудных дней усилий) смог найти способ вывести TextView из лямбда-функции, чтобы я мог использовать setText в основной деятельности (довольно многовремя с моего предыдущего опыта java 1.2).Теперь я могу успешно установить TextText () для TextView (отлаженный с помощью getText ()) со значениями временной метки, но позже попытаюсь изменить его для получения значения через HTTP или MQTT.
Проблема в том, чтоЯ не могу перерисовать TextView / (инфокарту) на экране после того, как представление было инициировано с первым значением, которое отображается правильно.Я попытался сделать недействительным экземпляр 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);
В AugmentedImageNode.java в setImage:
...
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 в будущем?Этот ViewRenderable.builder () с лямбда-функциями thenAccept заставляет меня плакать:)