我有一些非常奇怪的问题 .
第一个问题如下:我读了如何覆盖onMeasure() . 我做的 . 我期待当我在onMeasure中设置宽度/高度时,它们在onDraw中将完全相同,但显然这不是真的 . 此外,我除了measuredWidth将与绘制阶段的宽度相同,但同样不是这样 .
onMeasure可以多次调用 . 在每次调用时,我使用计算的宽度和高度调用setMeasuredDimension . 因此,例如,第一次我的视图应该是480 x 245,在第二次调用时我会再次根据父级重新计算它,它应该是90 x 245 .
令我非常惊讶的是,不知何故,除了第一个电话之外,它只是忽略了一切 . 所以在这种情况下我的最终视图大小是480 x 245 .
第二个问题如下:我的视图高度是match_parent,我的父高是0.那么当我不知道它时,我应该如何在onMeasure上设置正确的高度?
任何想法如何让android不要忽略我的setMeasureDimensions调用以及如何设置match_parent?
1 回答
分配给视图的空间不仅取决于您测量的大小,下面是该过程的快照:
在测量父级时调用
View.onMeasure
. 你得到的MeasureSpec
本质上是你最多可以占用多少空间(非常概括) .根据这些规格,您可以确定自己的大小,从逻辑上测量自己的孩子并调用
setMeasuredDimension
不久之后,您的父母会根据您测量的内容为您指定具体尺寸(但这也意味着它可能会有所不同) . 然后,因为这些将是您的尺寸,这是您必须使用的尺寸 . 此时调用的回调是
onLayout
,您将根据受影响的维度在过程中布置您的子项 .完成所有这些之后,将绘制
View
,即View.dispatchDraw
被调用并导致onDraw
的简单视图 . 如果你是ViewGroup
,自己画画也意味着画你的孩子 .绘图时,系统传递
Canvas
,其尺寸为屏幕的尺寸,并使用平移和剪裁,画布沿视图传递,以便绘制自己 . 这避免了抽奖期间的分配 . 因此,如果您想知道专用于您的空间,则不应使用Canvas.getWidth
或Canvas.getHeight
这些是屏幕的尺寸,而是检索剪裁的尺寸(Canvas.getClipBounds()
)最后,当您正确检索剪辑边界时,它们通常应与宽度和高度相同(
View.getWidth
或View.getHeight
),但它们可能不同,例如,如果缩放了画布 .总结一下:
onMeasure
目的,是确定子项的大小,以便ViewGroup
可以计算它们的dezired大小 .onLayout
目的是影响每个视图的宽度和高度,传播给子视图 .onDraw
目的是渲染您的视图 .