Android onTouch形状不规则

时间:2013-07-31 14:01:53

标签: java android

如果触摸this isometric one这样的不规则形状,如何办理onTouchEvent

希望你能帮助我。

4 个答案:

答案 0 :(得分:1)

检查来自MotionEvent的坐标是否在你的形状内:

@Override
public boolean onTouchEvent(MotionEvent event)
{
    final float x = event.getX();
    final float y = event.getY();
    if (isInside(x, y))
    {
         // do something
    }
    return true;
}

boolean isInside(float x, float y)
{
    // TODO: return true, if (x,y) is inside your shape, otherwise return false
}

答案 1 :(得分:1)

检查MotionEvent坐标是否在您的形状内,然后进行多边形点击测试。

如果你的等长形状是一个长度相等的钻石,的角度都是90度(由评论中的Geobits校正),可以使用Manhatten Distance进行快速测试。查看链接,图片可以更清楚地了解其工作原理。

int rectSize = 10;
Rectangle diamondBoundingRect = new Rectangle(0,0,rectSize,rectSize);
Point point = new Point(9,9);
int dx = Math.abs(point.x - diamondBoundingRect.center.x);
int dy = Math.abs(point.y - diamondBoundingRect.center.y);
if(dx+dy < rectSize){
    //point is inside diamond
}else{
    //point is not inside diamond
}

此测试不灵活,但可能只需要它。

如果你需要更好的东西,this blog post解释了多边形点击测试的算法。

我们的想法是将一条线(称为Ray)从MotionEvent点投射到多边形,并计算该线与该多边形中线段之间的交点数。如果计数是偶数,则该点在形状之外。如果它是奇数,则该点在形状内。

Wikipedia has a nice picture以及更多细节可帮助您了解此方法中的逻辑。

专注于在下一部分之前开始工作,因为根据您的需要,这可能是不必要的。

onTouchEvent中发送给您的积分进行抽样。该设备只是以预定的速率给你点和方向。用户移动手指的速度越快,采样率跟不上的细节就越少。

因此,如果您想了解更多细节,则必须interpolate。这是一种先进的方式,说你需要猜测用户用一些花哨的数学手指滑动他的手指。余弦插值在过去对我来说效果很好,因为它在速度和结果之间取得了很好的平衡。

编辑:

这是我个人用于多边形点击测试的一些代码。

public boolean isPointInsidePolygon(double x, double y){
    //pointAry holds the polygon's vertices.
    int polySides = this.pointAry.Length;
    //need at lest 3 vertices to create a polygon.
    if (polySides < 3)
    {
        return false;
    }
    int j = polySides - 1;
    boolean oddNodes = false;
    for (int i = 0; i < polySides; i++)
    {
        Point pi = this.pointAry[i];
        Point pj = this.pointAry[j];
        if (pi.y < y && pj.y >= y || pj.y < y && pi.y >= y)
        {
            if (pi.x + (y - pi.y) / (pj.y - pi.y) * (pj.x - pi.x) < x)
           {
                oddNodes = !oddNodes;
            }
        }
        j = i;
     }
     return oddNodes;
 }

答案 2 :(得分:0)

由您自己编写一些代码来检测给定点(x,y)是否处于不规则形状。

public boolean isInIrregularShape(int x, int y);

您必须以某种方式定义形状。您可能希望在Google上搜索一些库,这些库允许您定义形状并检查给定点是否在形状内。您的x和y点将为event.getX()event.getY()

答案 3 :(得分:0)

如果您在SurfaceView上将形状绘制为位图,则可以测试所触摸像素的透明度。 Bitmap的像素,即不是SurfaceView的。

例如,使用100,150绘制的位图(左/上的surfaceview坐标):

float x = getX() - 100;
float y = getY() - 150;
int alpha = Color.alpha(myBitmap.getPixel(x, y));
if(alpha == 0)
    // not hit!
else
    // hit!

注意:这不会使缩放生效,因此您必须知道比例因子,并相应地相乘,如果您正在缩放它们。