微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android – 忽略布局宽度和高度

我有一个内部布局的对话框和一个带视频流的SurfaceTexture.当我从视频中收到宽度和高度时,我会调整我的布局:
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上的正确值是(屏幕的边界),但布局没有正确调整大小.

innerlayout被添加到名为“VideoPlayer”的customView中.我将视频播放器背景的颜色设置为红色,因此当我切换到全屏时,整个屏幕变为红色,除了中间的视频流.这意味着底层视图正在适当调整大小,但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,mInnerLayout.getLayoutParams().width,mInnerLayout.getLayoutParams().height));
            }

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

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

我这里的想法已经不多了.我尝试了invalidate(),postInvalidate()和forceLayout(),但那些不起作用.

解决方法

final ViewGroup.LayoutParams layoutParams = mInnerLayout.getLayoutParams();
layoutParams.width = size.x;
layoutParams.height = size.y;
Log.i(TAG,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.

这样做. – (所有想法)

编辑

我不想添加解释,因为这是所有的想法,我需要验证它是否会起作用

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

您也可以在该特定View或Parent上调用View.invalidate()和View.requestLayout(),它也可以解决您的问题,单独调用View.invalidate()不会立即为您做.例如

layoutParams.width = size.x;
layoutParams.height = size.y;
Log.i(TAG,size.y));
//re-setting the layout params is also not neccessary
mInnerLayout.invalidate();
mInnerLayout.requestLayout();

第一种方法解决问题的原因是因为View被删除添加了要求处理Laying的调用

:)你也应该接受它并让赏金期过去:)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐