Изменение размера Android VirtualDisplay "в полете"

Недавно в проекте я столкнулся с проблемой изменения размера VirtualDisplay"в полете". Итак, вариант использования:

  • Начать трансляцию
  • В неопределенный период потоковой передачи могут появиться определенные данные, которые указывают на то, что мои возможности потоковой передачи изменились.
  • Обновить VirtualDisplay's параметры без восстановления, чтобы избежать потери состояния

Я нашел в документации для VirtualDisplay resize, хотя он, похоже, не влияет на входящие новые параметры. Для реализации использую

  virtualDisplay = mDisplayManager.createVirtualDisplay("DispName",
                        getResolution().getResolutionWidth(), getResolution().getResolutionHeight(),
                        getDisplayDensity(), inputSurface, DisplayManager.VIRTUAL_DISPLAY_FLAG_PRESENTATION);

где inputSurface создан mediaEncoder.createInputSurface()и к этому моменту настроены должным образом. Итак, вопрос в том, как изменить размерVirtualDisplay? Я также не нашел примеров, как это сделать в официальных источниках, буду признателен за любую помощь!

ОБНОВЛЕНИЕ Просто забыл упомянуть, я поставилListener за VirtualDisplays а также onChange метод срабатывает, хотя проверка того, были ли изменены фактические показатели, дает отрицательные результаты

1 ответ

Решение

Отвечая на свой вопрос

Изменение размера методVirtualDisplay работает довольно хорошо, хотя с моей стороны это было непонимание того, как добиться очень конкретного поведения, когда только базовый макет изменяет его размер, хотя элементы сохраняют свои свойства в меньшем окне

Итак, в случае, если вы хотите получить какое-то "скалярное" изменение размера (например, все становится больше или меньше), вы должны вызвать изменение размера

Но когда ваш проект требует некоторого изменения размера и
увеличения элементов управления, хотя экран становится меньше,
вам следует проверить расширение вашего конкретного объекта.Presentation класс, связанный с VirtualDisplay и просто обновите макет вручную, не имея VirtualDisplay измененный размер

public void resizeView(final int newWidth, final int newHeight) {
    uiHandler.post(new Runnable() {
        @Override
        public void run() {
            try {
                Constructor<? extends ViewGroup.LayoutParams> ctor = 
                        mainView.getLayoutParams().getClass().getDeclaredConstructor(int.class, int.class);
                mainView.setLayoutParams(ctor.newInstance(newWidth, newHeight));
                mainView.requestLayout();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

где uiHandler можно просто получить даже в фоновом режиме с

Handler uiHandler = new Handler(Looper.getMainLooper());

Надеюсь, это будет кому-нибудь полезно!

Другие вопросы по тегам