Android onMeasure和draw()

时间:2014-08-18 17:56:38

标签: android android-layout

我有一些非常奇怪的问题。

第一个问题如下: 我读了如何覆盖onMeasure()。我做的。我期待当我在onMeasure中设置宽度/高度时,它们在onDraw中将完全相同,但显然这不是真的。 另外,除了measuredWidth与绘制阶段的宽度相同,但同样不是真的。

onMeasure可以被多次调用。在每次调用时,我使用计算的宽度和高度调用setMeasuredDimension。因此,例如,第一次我的视图应该是480 x 245,在第二次调用时我会再次根据父级重新计算它,它应该是90 x 245。

对于我的惊喜,不知何故,android只是忽略了除了第一个电话之外的所有事情。所以在这种情况下,我的最终视图大小为480 x 245。

第二个问题如下: 我的视图高度是match_parent,我的父高是0.那么当我不知道它时,我应该如何在onMeasure上设置正确的高度?

任何想法如何让android不要忽略我的setMeasureDimensions调用以及如何设置match_parent?

1 个答案:

答案 0 :(得分:1)

分配给视图的空间不仅取决于您测量的大小,这里是该过程的快照:

    在您的父母的测量过程中,
  • View.onMeasure被调用。你得到的MeasureSpec基本上可以占用多少空间(非常概括)。

  • 根据这些规范,您可以确定自己的规模,从逻辑上衡量自己的孩子并致电setMeasuredDimension

  • 不久之后,您的父母会根据您的测量结果为您指定具体尺寸(但这也意味着它可能会有所不同)。然后,因为这些将是您的尺寸,这是您必须使用的尺寸。此时调用的回调是onLayout,您应根据受影响的维度在过程中布置您的孩子。

  • 完成所有这些操作后,您的View将被绘制,即View.dispatchDraw被调用,从而导致onDraw的简单视图。如果你是ViewGroup,那么自己画画也意味着吸引你的孩子。

  • 绘图时,系统传递Canvas,其尺寸为屏幕的尺寸,并使用平移和剪裁,沿着视图传递画布,以便绘制自己。这避免了抽奖期间的分配。出于这个原因,如果您想知道专属于您的空间,则不应使用Canvas.getWidthCanvas.getHeight作为屏幕尺寸,而应检索剪切的尺寸({{1} })

  • 最后,当您正确检索剪辑边界时,它们通常应与宽度和高度(Canvas.getClipBounds()View.getWidth)相同,但它们可能不同,例如如果画布缩放。

总结一下:

  1. View.getHeight目的是确定子项的大小,以便onMeasure可以计算出 dezired 的大小。

  2. ViewGroup目的是影响每个视图的宽度和高度,传播给儿童。

  3. onLayout目的是渲染您的观点。