我有一个带有内部布局的对话框和一个带有视频流的 SurfaceTexture
。当我从视频中收到 width
和 height
时,我会像这样调整布局:
private void resizeView(final VideoFormatInfo info) {
final Size size = calculateSize(info.getWidth(), info.getHeight());
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
final ViewGroup.LayoutParams layoutParams = mInnerLayout.getLayoutParams();
layoutParams.width = size.x;
layoutParams.height = size.y;
Log.i(TAG, String.format("run: setting innerlayout bounds to %d,%d", size.x, size.y));
mInnerLayout.setLayoutParams(layoutParams);
}
});
}
现在我有一个全屏按钮,可以将布局调整到整个屏幕。但是当我按下它时,布局会保留在屏幕的一小块区域。
当我检查日志时,size.x
和 size.y
的正确值在那里(屏幕的边界),但布局未正确调整大小.
内部布局被添加到名为“VideoPlayer”的自定义 View 中。我将视频播放器背景的颜色设置为红色,所以当我切换到全屏时,整个屏幕都变成红色,除了中间的视频流。这意味着底层 View 正在正确调整大小,但 innerLayout 不是出于某种原因。
有趣的是,我在视频渲染上有另一个布局,它创建了一个“闪光效果”来模拟拍摄快照时的相机闪光灯。当触发闪光效果时,视频会调整到整个屏幕。
这是我的布局树:
VideoPlayerView (CustomView, not VideoView)
innerLayout (RelativeLayout)
videoSurfaceTexture (SurfaceTextureView)
flashLayout (RelativeLayout)
我还设置了这个用于调试:
@Override
public void onSurfaceTextureSizeChanged(final SurfaceTexture surfaceTexture, final int width, final int height) {
Log.d(TAG, "onSurfaceTextureSizeChanged size=" + width + "x" + height + ", st=" + surfaceTexture);
Log.i(TAG, String.format("innerlayout bounds are %d,%d", mInnerLayout.getLayoutParams().width, mInnerLayout.getLayoutParams().height));
}
当我按下全屏时,内部布局上的值是正确的值(整个屏幕的值),但布局没有调整大小。我可以看出布局没有调整大小,因为我将其背景颜色更改为绿色并添加了一些填充,我可以在屏幕中央看到它占用了很小的空间。
看起来好像 View 没有随着布局更改而更新。
我的想法已经用完了。我尝试了 invalidate()
、postInvalidate()
和 forceLayout()
但它们不起作用。
最佳答案
您错过了 forceLayout()
的一个重要部分:
This method does not call
requestLayout()
orforceLayout()
on the parent.
所以让父级也做一个布局:
mInnerLayout.setLayoutParams(layoutParams);
mInnerLayout.forceLayout();
mInnerLayout.getParent().requestLayout();
关于android - 布局宽度和高度被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38970918/