web-dev-qa-db-ja.com

Android:パスにタッチポイントが含まれているかどうかを確認するにはどうすればよいですか?

面積測定を描画できるアプリケーションを開発しようと思います。したがって、各部屋には独自の[〜#〜] id [〜#〜]またはnameそして、部屋に触れると、そのIDまたは名前のトーストメッセージを表示したいと思います。問題は、どのパスがタッチされているかをどのようにチェックするかです!!

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

したがって、部屋にはさまざまなカスタムジオメトリ形式があり、このため、2つの近い部屋の境界を取得すると、メソッドは共有ポイントのセットを返す可能性があります。悪い!各部屋にはエリアポイントしかありません。どうすればこの問題を解決できますか?

IOSでは、PathContainsPointメソッドを使用できますが、残念ながら、Android Pathには同様のものがありません。

誰かが事前にThxを手伝ってくれることを願っています

18
kinghomer

わかりました、問題を解決しました。サンプルコードを投稿します。

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;
}
42
kinghomer

エドワードフォークが言うように、最良の方法は path.op() を使用することです。なぜならリージョンは正方形だからです。また、1つのポイントは2つまたは3つのリージョンにあります。例: ここに画像の説明を入力してください すべての領域に青い点が含まれますが、実際にはpath4のみがこの点を含みます。

int x, y;
Path tempPath = new Path(); // Create temp Path
tempPath.moveTo(x,y); // Move cursor to point
RectF rectangle = new RectF(x-1, y-1, x+1, y+1); // create rectangle with size 2xp
tempPath.addRect(rectangle, Path.Direction.CW); // add rect to temp path
tempPath.op(pathToDetect, Path.Op.DIFFERENCE); // get difference with our PathToCheck
if (tempPath.isEmpty()) // if out path cover temp path we get empty path in result
{ 
    Log.d(TAG, "Path contains this point");
    return true;
}
else
{
    Log.d(TAG, "Path don't contains this point");
    return false;
}
3
Nikita

ここに考えがあります:触れられたポイントの周りの小さな正方形である新しいパスを作成し、次にそのパスをテストするパスと交差させて path.op() を使用し、結果が空の。

1
Edward Falk