Android VirtualDisplay 调整大小 "on flight"
Android VirtualDisplay resize "on flight"
最近在项目中我遇到了调整大小的挑战 VirtualDisplay
"on flight"。所以用例是:
- 开始直播
- 在未确定的流媒体期间,可能会出现特定数据,表明我的流媒体功能已更改
- 无需重新创建即可更新
VirtualDisplay's
参数,从而避免状态丢失
我在文档中找到了 VirtualDisplay
resize 方法,尽管它似乎对传入的新参数没有影响。为了实施,我正在使用
virtualDisplay = mDisplayManager.createVirtualDisplay("DispName",
getResolution().getResolutionWidth(), getResolution().getResolutionHeight(),
getDisplayDensity(), inputSurface, DisplayManager.VIRTUAL_DISPLAY_FLAG_PRESENTATION);
其中 inputSurface
由 mediaEncoder.createInputSurface()
创建并在此时正确配置。所以,问题是,如何调整 VirtualDisplay
的大小?我也没有在官方资源中找到任何示例如何做到这一点,将不胜感激!
更新
只是忘了提及,我已经为 VirtualDisplays
设置了 Listener
并触发了 onChange
方法,尽管检查实际指标是否已更改显示负面结果
回答我自己的问题
VirtualDisplay
的 resize 方法工作得很好,尽管从我的角度来看,这是对如何实现非常具体的行为的误解,当只有底层布局改变它的大小时,尽管元素保持它们的大小较小 window
的属性
所以,如果你想获得某种 "scalar" 调整大小(就像所有东西变大或变小),你应该调用 resize
但是,每当您的项目需要某种调整大小并制作控件时
更大,虽然屏幕变小了 你应该检查你的混凝土 Presentation
class 链接到 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());
我希望这对某些人有用!
最近在项目中我遇到了调整大小的挑战 VirtualDisplay
"on flight"。所以用例是:
- 开始直播
- 在未确定的流媒体期间,可能会出现特定数据,表明我的流媒体功能已更改
- 无需重新创建即可更新
VirtualDisplay's
参数,从而避免状态丢失
我在文档中找到了 VirtualDisplay
resize 方法,尽管它似乎对传入的新参数没有影响。为了实施,我正在使用
virtualDisplay = mDisplayManager.createVirtualDisplay("DispName",
getResolution().getResolutionWidth(), getResolution().getResolutionHeight(),
getDisplayDensity(), inputSurface, DisplayManager.VIRTUAL_DISPLAY_FLAG_PRESENTATION);
其中 inputSurface
由 mediaEncoder.createInputSurface()
创建并在此时正确配置。所以,问题是,如何调整 VirtualDisplay
的大小?我也没有在官方资源中找到任何示例如何做到这一点,将不胜感激!
更新
只是忘了提及,我已经为 VirtualDisplays
设置了 Listener
并触发了 onChange
方法,尽管检查实际指标是否已更改显示负面结果
回答我自己的问题
VirtualDisplay
的 resize 方法工作得很好,尽管从我的角度来看,这是对如何实现非常具体的行为的误解,当只有底层布局改变它的大小时,尽管元素保持它们的大小较小 window
所以,如果你想获得某种 "scalar" 调整大小(就像所有东西变大或变小),你应该调用 resize
但是,每当您的项目需要某种调整大小并制作控件时
更大,虽然屏幕变小了 你应该检查你的混凝土 Presentation
class 链接到 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());
我希望这对某些人有用!