【问题标题】:What's the best way of doing hit test for irregular-shaped controls in Android?在Android中对不规则形状的控件进行命中测试的最佳方法是什么?
【发布时间】:2014-03-05 05:25:02
【问题描述】:

我将为我的 Android 应用程序实现一个自定义形状的控件,例如 D-PAD。

从图片中可以看出,有5个控制按钮。但是大家都知道view的触摸区域是一个矩形。我的目标是当用户在每个控件的可见范围内触摸时触发正确的触摸事件。

我的原始想法是拦截触摸事件并进行一些纯几何计算。但我发现它有点复杂,似乎不是解决这个问题的好方法。

有没有人能给我一些启发?

【问题讨论】:

    标签: android touch hittest


    【解决方案1】:

    没有允许您这样做的功能。您可以将形状切成简单的几何部分并进行测试,或者您可以使用this link 中描述的位图掩码技术。

    编辑:

    1. 将点击点和圆心都平移到 产地
    2. 计算点击点的半径sqrt(x^2 + y^2)
    3. 如果半径大于内圆半径小于外半径...继续
    4. 计算arctan(y/x) 的角度以获得四个按钮中的哪一个被按下。

    【讨论】:

    • 我已经考虑过位图像素颜色窥视,但是当我也想使用彩色 d-pad 时,它似乎很复杂并且 CPU/内存会被杀死
    • 哦,我明白了。我认为几何计算并不难(嗯,当然取决于你的背景)。
    • 是的,我明白了,如果我需要在移动动作期间测试每个触摸事件,这个 sqrt/arctan 是否太重了?
    • 哦不,绝对不是!!!您可以为每个触摸事件执行 500 多次 arctan() 并且您不会注意到。滚动条的平滑滚动和减速对每个触摸事件都有更多的数学运算。
    【解决方案2】:

    您可以保留一个图像并为每个部分着色,如下所示:

    • 向上:RGBA:#FFFFFFFE(alpha 254)
    • 右:RGBA:#FFFFFEFF(蓝色 254)
    • 向下:RGBA:#FFFEFFFF(绿色 254)
    • 左:RGBA:#FEFFFFFF(红色 254)
    • 圆圈:RGBA:#FFFFFEFE(蓝色 254 alpha 254)

    您需要将 dpad 解压缩为原始位图以快速读取像素(不要使用 glReadPixels),但这是一次性操作。

    我强烈建议在顶部覆盖边框、箭头和任何特殊颜色作为第二个纹理。

    为此,将像素从触摸点处的 dpad 图像的纹理中取出。如果它的 alpha 为 0,则为未命中,否则您只需检查 RGBA 值即可确定击中了哪个区域。从视觉上看,这些值在外观上应该没有什么不同。

    这种方法的优点是它非常精确,可以处理您能想到的任何 D-Pad 形状。接受的答案显然有效,但不能处理其他形状。

    【讨论】:

      猜你喜欢
      • 2013-10-02
      • 1970-01-01
      • 2016-10-16
      • 2010-09-13
      • 2020-12-14
      • 2013-05-25
      • 1970-01-01
      • 1970-01-01
      • 2018-11-22
      相关资源
      最近更新 更多