首页 > 解决方案 > 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 变换方面很糟糕,但是我能做些什么吗?

标签: androidtransform

解决方案


我打电话给某人寻求帮助并得到了解决方案。

答案是查看文档以找到所有可用的不同 X 和 Y 坐标。

最后,我发现 getGlobalVisibleRect() 很有效,而且不需要矩阵!该方法如下所示:

fun isPointInsideView(x: Float, y: Float): Boolean {
    val _rect = Rect()
    getGlobalVisibleRect(_rect)
    return _rect.contains(x.toInt(), y.toInt())
}

推荐阅读