布局宽度和高度被忽略

Gab*_*tin 6 layout android

我有一个内部布局和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);
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)

现在我有一个全屏按钮,应该将布局调整到整个屏幕.但是当我按下它时,布局仍然在屏幕的一个小区域内.

当我检查日志中正确的值size.x和size.y是否(屏幕的边界),但布局没有正确调整大小.

innerlayout被添加到名为"VideoPlayer"的customView中.我将视频播放器背景的颜色设置为红色,因此当我切换到全屏时,整个屏幕变为红色,除了中间的视频流.这意味着底层视图正在适当调整大小,但innerLayout不是出于某种原因.

有趣的是,我在视频渲染上有另一种布局,可以创建"闪光效果"来模拟拍摄快照时的相机闪光.触发该闪光效果后,视频将调整为整个屏幕.

所以这是我的布局树:

VideoPlayerView (CustomView, not VideoView)
     innerLayout (RelativeLayout)
         videoSurfaceTexture (SurfaceTextureView)
         flashLayout (RelativeLayout)
Run Code Online (Sandbox Code Playgroud)

我也将其设置为调试:

 @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));
            }
Run Code Online (Sandbox Code Playgroud)

当我按全屏时,内部布局上的值是正确的值(整个屏幕的值),但布局没有调整大小.我可以告诉它布局没有调整大小,因为我将其背景颜色更改为绿色并添加了一些填充,我可以在屏幕中心看到它占用一小块空间.

看起来好像某个视图没有更新布局更改.

我这里的想法已经不多了.我想invalidate(),postInvalidate()和forceLayout()而那些不工作.

Ell*_*ltz 2

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));
 ViewGroup parent = ((ViewGroup)mInnerLayout.getParent());
 parent.removeView(mInnerLayout);
 mInnerLayout.setLayoutParams(layoutParams);
 parent.addView(mInnerLayout);//you might need to get the index so you slot it in there.
Run Code Online (Sandbox Code Playgroud)

这样就可以了。-(所有想法)

编辑

我不想添加解释,因为这都是想法,我需要验证它是否有效

但我的代码的解释是LayoutParams 是用来Parent布局其子项的,因此它仅在布局脉冲或时间时有用。改变layoutParams对象会使View对象变脏,在布局脏对象之前需要满足其他因素View,所以这就是为什么值改变但View不改变的原因。

您也可以直接打电话,View.invalidate()并且它也可以解决您的问题,单独打电话不会立即为您解决问题。例如View.requestLayout()ViewParentView.invalidate()

layoutParams.width = size.x;
layoutParams.height = size.y;
Log.i(TAG, String.format("run: setting innerlayout bounds to %d,%d", size.x, size.y));
//re-setting the layout params is also not neccessary
mInnerLayout.invalidate();
mInnerLayout.requestLayout();    
Run Code Online (Sandbox Code Playgroud)

第一种方法解决您的问题的原因是因为View删除和添加需要处理布局

:) 另外你应该刚刚接受它并让赏金期过去:)