VrVideoView удалить пользовательский интерфейс

Я пытаюсь отобразить 3D-стереовидео в приложении googlevr в чистом виде, не показывая пользовательский интерфейс. Я знаю о рекомендациях по удобству использования, но устройство, на котором запущено приложение, всегда будет храниться внутри средства просмотра в виде демоверсии, поэтому не ожидается никакого сенсорного взаимодействия.

Я использую VrVideoView. Итак, я уже избавился от полноэкранной кнопки, кнопки информации, кнопки стереорежима, экрана учебника Google картона под названием «просмотр перехода» и отслеживания касаний для перемещения просмотра.

videoWidgetView.setFullscreenButtonEnabled(false);
videoWidgetView.setInfoButtonEnabled(false);
videoWidgetView.setStereoModeButtonEnabled(false);
videoWidgetView.setTransitionViewEnabled(false);
videoWidgetView.setTouchTrackingEnabled(false);

Я также включил полноэкранное стерео по умолчанию.

videoWidgetView.setDisplayMode(VrWidgetView.DisplayMode.FULLSCREEN_STEREO);

Но я не могу удалить кнопку закрытия "x" и кнопку выбора.

Раздражающий пользовательский интерфейс VrVideoView

Я думаю, что "x" - это fullscreenBackButton из VrWidgetView, родитель VrVideoView. Который не имеет методов для управления его видимостью.

Есть ли способ удалить эти две кнопки?
Может быть, создать подклассы и переписать часть кода виджета?
Может быть, просто немного схитрить, добавив черную накладку над этими углами?


Я также пробовал, как было предложено

findViewById(R.id.ui_back_button).setVisibility(GONE);

или даже

findViewById(com.google.vr.widgets.common.R.id.ui_back_button).setVisibility(GONE);

безуспешно, они выдают:
NullPointerException: попытка вызвать виртуальный метод 'void android.view.View.setVisibility(int)' для нулевой ссылки на объект


person Guglie    schedule 23.09.2018    source источник


Ответы (2)


Пожалуйста, проверьте это сообщение: Разделитель Google VR Unity, кнопка «Настройки» и кнопка «Назад» скрыты в версии 0.9.

VrVideoView расширяет VrWidgetView< /а>. Там вы найдете подсказку, как отключить кнопку настроек в методе updateButtonVisibility(): vrUiLayer.setSettingsButtonEnabled(displayMode == 3).

В качестве альтернативы попробуйте отследить идентификатор ресурса кнопок и выполните следующие действия:

findViewById(R.id.ui_back_button).setVisibility(GONE);
findViewById(R.id.ui_settings_button).setVisibility(GONE);

Вы также можете перебрать все ресурсы и попробовать отключить один за другим:

final R.drawable drawableResources = new R.drawable();
final Class<R.drawable> c = R.drawable.class;
final Field[] fields = c.getDeclaredFields();

for (int i = 0, max = fields.length; i < max; i++) {
    final int resourceId;
    try {
        resourceId = fields[i].getInt(drawableResources);
    } catch (Exception e) {
        continue;
    }
    /* make use of resourceId for accessing Drawables here */
}
person RonTLV    schedule 23.09.2018
comment
Хорошо, это кажется близким, я хотел бы получить доступ к vrUiLayer, но он не общедоступен, поэтому я не могу позвонить this.vrUiLayer.setEnabled(false) - person Guglie; 23.09.2018
comment
Кстати, метод findViewById().setVisibility() дает попытку вызвать виртуальный метод 'void android.view.View.setVisibility(int)' для нулевой ссылки на объект - person Guglie; 23.09.2018
comment
Извините, ваше редактирование не работает, поскольку в нем перечислены только представления моего приложения, а не представления из пакета com.google.vr. - person Guglie; 24.09.2018

Для меня это решение работает. Он использует функциональные возможности поля для получения vrUiLayer, который является закрытым членом VrWidgetView, который является родителем VrVideoView.

Field f;
try {
    f = this.videoWidgetView.getClass().getSuperclass().getDeclaredField("vrUiLayer");
    f.setAccessible(true);
    UiLayer vrLayer = (UiLayer) f.get(this.videoWidgetView);

    // - here you can directly access to the UiLayer class - //


    // to hide the up-right settings button
    vrLayer.setSettingsButtonEnabled(false);

    //setting listener to null hides the x button
    vrLayer.setBackButtonListener(null);

    // these visibility options are frequently updated when you play videos,
    // so you have to call them often


    // OR


    vrLayer.setEnabled(false); // <- just hide the UI layer


} catch (NoSuchFieldException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
}

Не забудьте импортировать класс

import com.google.vr.cardboard.UiLayer

Имейте в виду, что использование vrLayer.setEnabled(false) также скрывает центральную линию, оставляя полностью чистый опыт виртуальной реальности.

person Guglie    schedule 15.10.2018