被父级裁剪的 Android 视图的全尺寸

Posted

技术标签:

【中文标题】被父级裁剪的 Android 视图的全尺寸【英文标题】:Full size of an Android View being clipped by its parent 【发布时间】:2012-11-04 00:27:26 【问题描述】:

请看一下这个 xml 布局。

    <LinearLayout android:id="@+id/dataTableContainer"
                  android:orientation="vertical"
                  android:layout_
                  android:layout_
                  android:clipChildren="true">

        <LinearLayout android:id="@+id/dataTable"
                   android:layout_
                   android:layout_
                   android:orientation="vertical"/>  

    </LinearLayout>

在运行时,“dataTable”元素填充了比“dataTableContainer”可以显示的更宽的子元素。但是,当我在 Eclipse 中检查两个元素的 mMeasuredWidth(甚至是 getWidth() 的返回值)时,它们结果是完全相同的。这不应该是这样。我的理解是,“dataTable”的孩子应该推动它假设自己的宽度,因为它的“wrap_content”设置。相反,“dataTableContainer”应该比它小,因为它的“fill_parent”设置受屏幕尺寸的限制。

我也尝试将“clipChildren”设置为 false,以防宽度被容器裁剪但结果保持不变:表格和容器的宽度相同。

谁能解释发生了什么?

为了给您一些背景信息,我试图做的是收集这些元素的大小,以确定有多少“dataTable”元素位于容器外部,因此不可见。这反过来又需要限制用户可以拖动表格元素的距离。 ScrollView 元素本身会限制运动,但由于我使用的是 LinearLayout,因此我需要复制该限制功能。

【问题讨论】:

内层LinearLayout 不能大于外层,因此宽度相等似乎是合理的。你真的需要根元素是LinearLayout吗?你能把dataTableContainer 换成ScrollView 吗? 感谢您的评论@acj。我认为假设内部元素不能大于外部元素并不那么安全。当然在视觉上它不能,但在内部我会认为渲染引擎知道(并存储在某处)内部元素想要更大但被外部元素剪裁。因此,我预计测量的宽度与 getWidth() 返回的值之间存在差异。 回答你的问题@acj,我不能使用ScrollView,因为我正在尝试创建一个简单的2D ScrollView,它可以水平和垂直滚动。我已经看到了解决方案,但对于我需要做的事情来说,它们似乎有点矫枉过正。拖动内部元素已经可以了,但我不知道如何限制它的运动,以免它离开屏幕! documentation for View drawing 提到“[a] 视图的测量宽度和测量高度值必须尊重视图父级施加的约束”。测量通过后,视图的所需宽度/高度似乎被丢弃。除了填充dataTable,您是否以编程方式更改内部布局的大小或行为? 我的理解是父视图对其子视图施加测量约束,除非您另有说明,这正是您的方法所做的。我认为 Eclipse 正在跟踪本机测量过程中的测量变量。很高兴听到您找到了可行的解决方案。 【参考方案1】:

看来我太信任 Eclipse。在使用断点进行调试以检查应用程序的状态和许多可用变量的值时,我依赖于 eclipse 提供的变量列表,其中包括 mMeasuredWidth/mMeasuredHeight。请注意,这些不是我的源代码中的变量。 Eclipse 不知何故自己找到了它们,并为我检查了这些对象。因此,我假设它们确实以某种方式代表了测量的宽度/高度。然而,我的假设是错误的,只是因为可以以不同的方式测量视图(即使用 MeasureSpec.UNSPECIFIED 或 MeasureSpec.EXACTLY)并且 eclipse 无法知道我需要哪种测量方法。

因此,我通过添加到我的代码来触发我需要的测量:

int measureSpecParams = View.MeasureSpec.getSize(View.MeasureSpec.UNSPECIFIED);
dataTableView.measure(measureSpecParams, measureSpecParams);
int measuredWidth = dataTableView.getMeasuredWidth();
int measuredHeight = dataTableView.getMeasuredHeight();

这确实给了我想要的视图大小,即如果父视图或屏幕限制它,“dataTable”视图会有多大。

【讨论】:

以上是关于被父级裁剪的 Android 视图的全尺寸的主要内容,如果未能解决你的问题,请参考以下文章

Android - 如何使用视图布局尺寸裁剪 jpeg

QuickControls2 图像不会拉伸到父级的全宽

Android,如何裁剪修复图像视图[重复]

来自 FormGroup 的禁用控件(表单自定义表单控件的一部分)被父级中的 .getRawValue() 排除

嵌套在 <li> 中的 <i> 文本颜色的 mPDF CSS 类被父级颜色覆盖

如何自动中心裁剪ImageView Android?