首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android onMeasure和draw()

Android onMeasure和draw()
EN

Stack Overflow用户
提问于 2014-08-18 17:56:38
回答 1查看 1.1K关注 0票数 0

我有一些很奇怪的问题。

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

onMeasure可以被多次调用。在每次调用时,我都使用计算出的宽度和高度调用setMeasuredDimension。例如,我的第一次观点应该是480 x 245,在第二次调用时,我会根据父母的情况重新计算,并且应该是90x245。

让我感到惊讶的是,android只是忽略了一切,除了第一次调用。所以在这个例子中,我的最终视图大小是480 x 245。

第二个问题如下:我的视图高度是match_parent,我的父高度是0。那么,当我不知道的时候,怎么才能在onMeasure上设置正确的高度呢?

你知道如何让安卓不忽视我的setMeasureDimensions调用和如何设置match_parent吗?

EN

回答 1

Stack Overflow用户

发布于 2014-08-18 19:41:59

分配给视图的空间并不仅取决于所测量的大小,以下是流程的快照:

  • 在测量父级的过程中调用View.onMeasure。您得到的MeasureSpec实际上是您最多可以占用多少空间(非常概括)。
  • 根据这些规范,您可以确定您自己的大小,逻辑地测量您自己的孩子并调用setMeasuredDimension
  • 过了一段时间,您的父母根据您测量的内容为您分配具体的维度(但这也意味着它可能有所不同)。然后,由于这些将是你的维度,这是你必须使用的。此时调用的回调是onLayout,您应该根据对您受影响的维度在此过程中布局您的子级。
  • 在所有这些之后,您的View将被绘制出来,即View.dispatchDraw正在被调用,并导致对onDraw的简单视图。如果你是ViewGroup,画自己也意味着画你的孩子。
  • 绘图时,系统会传递一个Canvas,该Canvas的尺寸是屏幕上的这些尺寸,并且使用翻译和剪裁,画布沿视图传递,以便它们自己绘制。这避免了抽签时的分配。由于这个原因,如果您想知道什么空间是专用于您的,您不应该使用Canvas.getWidthCanvas.getHeight,这是屏幕的尺寸,而是检索剪裁尺寸(Canvas.getClipBounds())。
  • 最后,当正确检索剪辑边界时,它们通常应该与您的宽度和高度相同(View.getWidthView.getHeight),但是它们可能不同,例如,如果画布被缩放。

因此,总结一下:

  1. onMeasure的目的,是确定孩子的大小,这样ViewGroup就可以计算出他们的头发大小。
  2. onLayout的目的是影响每个视图的宽度和高度,并传播到子视图。
  3. onDraw的目的是呈现您的视图。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25369297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档