Android函数View.getHitRect()提供的值是什么意思?

11
“在父视图坐标系中的点击矩形”。 但是这是什么意思?
更具体地说,我想知道“点击矩形”这个短语的含义。它有什么作用?框架如何处理它?在生命周期中返回值何时具有意义?它可能与由getLeft()getTop()getRight()getBottom()定义的矩形有何不同?
根据函数名称,我当然可以猜测答案并尝试一些示例,但这并不令人满意。我在Android开发者网站或任何其他我查找过的地方都找不到有关此函数的有用信息。
3个回答

4

这里似乎是最完整的解释。

getHitRect()方法获取子视图在父视图坐标系中的可触摸区域。

示例代码片段使用该函数来确定子视图(布局后)的当前可触摸区域,以便通过创建TouchDelegate来有效地扩展它。


1
他们肯定应该做好文档工作。如果您查看源代码 View#getHitRect(Rect),您会发现,如果视图具有“标识矩阵”或未连接到窗口,则它返回正是我们所想的内容。备用分支意味着视图具有变换,因此要获取父级的“命中矩形”,即其坐标系中覆盖视图的最小可能矩形,您必须将矩形移动到原点,运行变换,然后添加回其原始位置。
因此,如果没有变换,您可以将其用作此目的的快捷方式。如果存在变换,请记住,您将获得当前显示的视图内或外的矩形值。

0

返回的Rect包含4个值:

  • bottom
  • left
  • right
  • top

bottom指定矩形底部的y坐标。left指定矩形左侧的x坐标等。

父级坐标意味着命中矩形值是在父级坐标系统中指定的。

想象一下你站在夜晚的开阔地上,仰望月亮。你在地球上的位置可以用许多方式表示。

如果我们使用您本地的坐标系来表示您的位置,则您位于(纬度/经度)(0,0)。当您四处走动时,您的本地坐标系永远不会改变,您始终位于本地坐标系中心的(0,0)。

但是,如果我们使用地球的坐标系来表示您的位置,则您可能位于(纬度,经度)(16,135)。

您站在地球上,因此地球是您的父级坐标系统。

同样地,一个View可以包含在LinearLayout中。LinearLayout将是View的父级,因此从getHitRect()获取的值将以LinearLayout的坐标系表示。
编辑
通用术语中,“命中矩形”是用于定义用于碰撞检测的矩形区域的术语。在Android中,命中矩形只是类型为Rect的实例。
方法getLeft()等只是访问Rect中数据的访问器,因此Rect的成员定义了通过调用这些方法获得的相同矩形。
Rect的常见用法场景是处理轻击事件:
//Imagine you have some Rect named myRect
//And some tap event named event
//Check if the tap event was inside the rectangle
if(myRect.contains(event.getX(), event.getY()){
  //it's a hit!
}

你可能还想查看两个矩形是否相交

if(myRect.contains(myRect2)){
   //collision!
}

对于一个视图(View)来说,命中矩形(hit rectangle)并没有直接使用,你可以查看源代码。在视图(View)中,顶部(top)、底部(bottom)、左侧(left)和右侧(right)被广泛使用,但是getHitRect()方法实际上更多地是为了方便将这些参数(top/bottom/left/right)以整洁的方式传递给需要它们的人。


1
谢谢您的编辑,但我担心它有点含糊不清。您指出的代码表明getHitRect()有时返回由getLeft()、getTop()等定义的矩形,但并非总是如此。那么有什么区别呢?我特别要求的是函数返回的确切矩形,在有意义的语义术语中。您会理解,如果没有精确的答案,该函数就没有多少价值。我得出结论,由于函数的文档未指定任何行为,因此没有保证,因此它实际上无法使用。我将避免使用它。 - JulianSymes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接