10

“在父坐标中点击矩形”。但是,这是什么意思?

为了放大,我真正想知道的是“命中矩形”这个短语的含义。它是干什么用的?框架如何处理它?返回值在生命周期中什么时候有意义?getLeft()它与, getTop(), getRight(),定义的矩形有何不同getBottom()

根据函数的名称,我当然可以猜出一个答案,并尝试几个例子,但这并不令人满意。我在 Android 开发者网站或我看过的其他任何地方都找不到有关此功能的任何有用信息。

4

3 回答 3

4

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

getHitRect() 方法获取父级坐标中子级的命中矩形(可触摸区域)。

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

于 2014-02-28T12:23:24.753 回答
1

They should certainly do a better job of documenting. If you look at the source View#getHitRect(Rect), you'll see that if the view has an "identity matrix", or is not attached to a window, it returns exactly what we're thinking. The alternate branch means the view has a transform, therefore to get the 'hit rect' for the parent, which is the smallest possible rect in its coordinate system that covers view, you have to move the rect to origin, run the transform and then add back its original position.

So you can use it as a shortcut for this purpose if there's no transform. If there's a transform, remember that you'll be getting values in the rect that may be outside or inside the view as currently displayed.

于 2016-09-17T02:08:06.870 回答
0

返回的Rect包含 4 个值:

  • 底部
  • 剩下
  • 最佳

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

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

想象自己晚上站在一片开阔的田野里,仰望月亮。你在地球上的位置可以用多种方式表达。

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

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

你站在地球上,所以地球是你的父坐标系。

同理,一个 View 可以包含在一个 LinearLayout 中。LinearLayout 将是 View 的父级,因此来自 getHitRect() 的值将在 LinearLayout 的坐标系中表示。

编辑

一般而言,命中矩形是用于定义用于碰撞检测的矩形区域的术语。在 Android 中,hit rectangle 只是 Rect 类型的一个实例。

方法getLeft()etc 只是 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 并没有真正直接使用,您可以查看 source。顶部、底部、左侧、右侧在视图中被大量使用,但 getHitRect() 方法确实更方便地将这些参数(顶部/底部/左侧/右侧)传递给需要它们的人。

于 2012-11-08T23:56:56.243 回答