Android Изменение размера VirtualDisplay «в полете» - PullRequest
0 голосов
/ 15 апреля 2020

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

  • Начальный поток
  • В неопределенный период потока могут поступить определенные c данные, которые указывают, что мои возможности потоковой передачи изменились
  • Обновите параметры 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 Ответ

0 голосов
/ 30 апреля 2020

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

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

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

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

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());

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...