android - Android:在转换后的 ViewGroup 的 childView 上旋转 HitRect
问题描述
我在 ImageView 上有这个功能
override fun onTouchEvent(event: MotionEvent?): Boolean {
if (isPointInsideView(event.getRawX(), event.getRawY(), this)) {
doSomething()
} else {
doNothing
}
return super.onTouchEvent(event)
}
fun isPointInsideView(x: Float, y: Float, view: View): Boolean {
val location = IntArray(2)
view.getLocationOnScreen(location)
val viewX = location[0]
val viewY = location[1]
//point is inside view bounds
val _rect = Rect(viewX, viewY, viewX + view.getWidth(), viewY +
view.getHeight())
///rotate/offset _rect here somehow from it's top left (0,0) corner.
return if (_rect.contains(x.toInt(), y.toInt())){
true
} else {
false
}
}
但有个问题。其中一些 ImageView 位于已旋转的父视图组内。在这些情况下,isPointInsideView 不能准确地获取屏幕上的视图位置,最终会偏移一定量。
我不知道如何纠正这个。是否getLocationOnScreen()
被父 ViewGroup 的旋转变换以某种方式抛出?
更新:因此将函数更改为使用 _rect.contains (现在显示在上面的代码中)。希望我可以通过从父 ViewGroup 向下传递旋转来旋转 _rect 适当的量......我几乎没有意识到,_rect 没有旋转()方法。
我在 Matrix 变换方面很糟糕,但是我能做些什么吗?
解决方案
我打电话给某人寻求帮助并得到了解决方案。
答案是查看文档以找到所有可用的不同 X 和 Y 坐标。
最后,我发现 getGlobalVisibleRect() 很有效,而且不需要矩阵!该方法如下所示:
fun isPointInsideView(x: Float, y: Float): Boolean {
val _rect = Rect()
getGlobalVisibleRect(_rect)
return _rect.contains(x.toInt(), y.toInt())
}