【发布时间】:2014-03-05 05:25:02
【问题描述】:
我将为我的 Android 应用程序实现一个自定义形状的控件,例如 D-PAD。
从图片中可以看出,有5个控制按钮。但是大家都知道view的触摸区域是一个矩形。我的目标是当用户在每个控件的可见范围内触摸时触发正确的触摸事件。
我的原始想法是拦截触摸事件并进行一些纯几何计算。但我发现它有点复杂,似乎不是解决这个问题的好方法。
有没有人能给我一些启发?
【问题讨论】:
我将为我的 Android 应用程序实现一个自定义形状的控件,例如 D-PAD。
从图片中可以看出,有5个控制按钮。但是大家都知道view的触摸区域是一个矩形。我的目标是当用户在每个控件的可见范围内触摸时触发正确的触摸事件。
我的原始想法是拦截触摸事件并进行一些纯几何计算。但我发现它有点复杂,似乎不是解决这个问题的好方法。
有没有人能给我一些启发?
【问题讨论】:
没有允许您这样做的功能。您可以将形状切成简单的几何部分并进行测试,或者您可以使用this link 中描述的位图掩码技术。
编辑:
sqrt(x^2 + y^2)
arctan(y/x) 的角度以获得四个按钮中的哪一个被按下。【讨论】:
您可以保留一个图像并为每个部分着色,如下所示:
您需要将 dpad 解压缩为原始位图以快速读取像素(不要使用 glReadPixels),但这是一次性操作。
我强烈建议在顶部覆盖边框、箭头和任何特殊颜色作为第二个纹理。
为此,将像素从触摸点处的 dpad 图像的纹理中取出。如果它的 alpha 为 0,则为未命中,否则您只需检查 RGBA 值即可确定击中了哪个区域。从视觉上看,这些值在外观上应该没有什么不同。
这种方法的优点是它非常精确,可以处理您能想到的任何 D-Pad 形状。接受的答案显然有效,但不能处理其他形状。
【讨论】: