Изменение размера 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());
Надеюсь, это будет кому-нибудь полезно!