首页 文章

Android onMeasure和draw()

提问于
浏览
0

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

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

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

令我非常惊讶的是,不知何故,除了第一个电话之外,它只是忽略了一切 . 所以在这种情况下我的最终视图大小是480 x 245 .

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

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

1 回答

  • 1

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

    在测量父级时调用

    • View.onMeasure . 你得到的 MeasureSpec 本质上是你最多可以占用多少空间(非常概括) .

    • 根据这些规格,您可以确定自己的大小,从逻辑上测量自己的孩子并调用 setMeasuredDimension

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

    • 完成所有这些之后,将绘制 View ,即 View.dispatchDraw 被调用并导致 onDraw 的简单视图 . 如果你是 ViewGroup ,自己画画也意味着画你的孩子 .

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

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

    总结一下:

    • onMeasure 目的,是确定子项的大小,以便 ViewGroup 可以计算它们的dezired大小 .

    • onLayout 目的是影响每个视图的宽度和高度,传播给子视图 .

    • onDraw 目的是渲染您的视图 .

相关问题