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