2012-03-06 4 views
15

私は、測地線を描くことができるアプリケーションを開発しようとします。だから、各部屋にはIDまたはという名前のがあります。部屋に触れると、そのIDまたは名前のトーストメッセージが表示されます。問題はどのようにしてどのパスに触れるかをチェックすることです!Android:パスにタッチポイントが含まれているかどうかを確認するにはどうすればよいですか?

私は、この問題について話している多くのトピックの議論を見ました。誰かがgetBoundsメソッドを使い、その後、タッチポイントがRectにあるかどうかをチェックするメソッドを含んでいると言います。しかし、私はgetBoundsメソッドは、右、パスを含む最小Rectを返すと思いますか?

客室にはさまざまなカスタム幾何学的形状があります。そのため、私は約2つのクローズルームの境界を取得すると、メソッドは共有点の集合を返すことができます。悪い!各部屋にはエリアポイントしかありません。どうすればこの問題を解決できますか?

iOSでは、PathContainsPointメソッドを使用できますが、残念ながらAndroid Pathには類似したものはありません。私は誰かが事前に Thxを

答えて

39

[OK]を私に役立つことを願って

私は私の問題を解決しました。私は、サンプルコードをポスト:触れた点の周りの小さな正方形で新しいパスを作成し、path.op()を用いて試験するためにあなたのパスとそのパスを交差している場合を参照してください。

Path p; 
Region r; 

@Override 
public void onDraw(Canvas canvas) { 

    p = new Path(); 

    p.moveTo(50, 50); 
    p.lineTo(100, 50); 
    p.lineTo(100, 100); 
    p.lineTo(80, 100); 
    p.close();  

    canvas.drawPath(p, paint); 

    RectF rectF = new RectF(); 
    p.computeBounds(rectF, true); 
    r = new Region(); 
    r.setPath(p, new Region((int) rectF.left, (int) rectF.top, (int) rectF.right, (int) rectF.bottom)); 

} 

public boolean onTouch(View view, MotionEvent event) { 

    Point point = new Point(); 
    point.x = event.getX(); 
    point.y = event.getY(); 
    points.add(point); 
    invalidate(); 
    Log.d(TAG, "point: " + point); 

    if(r.contains((int)point.x,(int) point.y)) 
     Log.d(TAG, "Touch IN"); 
    else 
     Log.d(TAG, "Touch OUT"); 

    return true; 
} 
+1

これは、ポリラインではなく、パスの周りの特定の境界ポリゴンでタッチイベントを識別します。 –

+0

まさに私が探していたもの – kinghomer

+0

points.add(point)のポイントオブジェクトは何ですか? –

1

ここで考えがあります結果は空です。

+0

はい、ただし、API 19以上に限定されています。他の解決策はありますか? – Bartando

+0

パスが長方形の場合は、上記のkinghomerの答えを使用してください。あなたのパスがポリゴンの場合、sromkuの答え:http://stackoverflow.com/a/15817043/338479を参照してください。私は円弧、円、線分からなるパスを扱うより一般的な解決策を持っていますが、少し毛深いです。十分な興味があれば、来週に投稿することができます。 –

+1

ありがとう、私はPathをサブクラス化し、すべての点を追跡して解決しました。次に、このhttp://stackoverflow.com/a/16391873/3284364数式を使用してJavaに書き直しました。 – Bartando

関連する問題