【问题标题】:Detecting touch inside a irregular shape in ImageView在 ImageView 中检测不规则形状内的触摸
【发布时间】:2014-03-10 13:02:29
【问题描述】:
我有一个 ImageView,它有一个透明的可绘制对象,中心有一个圆圈,如 (http://wallpaperswide.com/circle_outline-wallpapers.html)。只是圆圈是红色的,并且周围没有着色而是透明的,它是一个.png图像。所以现在我将实现Canvas.ondraw(),当跟踪用户走出圆圈时,绘图应该重新开始。
疑问是:
1.如何在不进行硬编码的情况下检测此图像的边界。
2.我如何检测到用户点击了这个之外,因为这不是一个常规的矩形。
我这样做是为了帮助学生追踪字母,所以我希望答案是基于字母形状的任何图像的通用答案。
可以这样做吗?如果没有,你能建议什么更好的方法?
【问题讨论】:
标签:
android
canvas
bitmap
imageview
【解决方案1】:
我会走简单的路线:只需绘制图像并检查用户触摸点的颜色。如果 alpha 通道透明,则用户移出。
以下代码未经测试(并且非常粗糙)。我不知道 getDrawingCache 技巧是否有效。
public class FooBar extends ImageView {
Bitmap b = null;
public FooBar(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
b = getDrawingCache(true);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_MOVE)
check((int) event.getX(), (int) event.getY());
return super.onTouchEvent(event);
}
private void check(int x, int y) {
if (b != null && Color.alpha(b.getPixel(x, y)) >= 0)
onMovedOutOfShape();
}
private void onMovedOutOfShape() {
Toast.makeText(getContext(), "You're out", Toast.LENGTH_SHORT).show();
}
}
【解决方案2】:
您所追求的几乎与“不规则形状的碰撞检测”相同。谷歌搜索将导致无数次点击。
但如果我有问题要做,我可能会引入其中一种游戏引擎/框架,例如 Box2D、AndEngine、libGDX 或 BatteryTech。我会结合一些简单的矩形和曲线在我的每个字母图像上建立反应位置,然后使用库的预优化碰撞检测算法来完成繁重的工作。我也至少会查看他们的开源代码以了解他们如何进行检测。