Frage Android: Wie überprüft man, ob ein Pfad einen berührten Punkt enthält?


Ich würde versuchen, eine Anwendung zu entwickeln, in der ich eine Planimetrie zeichnen kann. Also, jedes Zimmer hat sein eigenes ICH WÜRDE oder Name und wenn ich ein Zimmer berühre, möchte ich eine Toast-Nachricht mit dieser ID oder diesem Namen zeigen. Das Problem ist, wie überprüft man, ob und welcher Pfad berührt wird !!

Ich habe viele Themen diskutiert, die über dieses Problem gesprochen haben. Jemand sagt zu benutzen getBounds Methode und, nach, enthält Methode zur Überprüfung, ob der berührte Punkt in Rect ist. Aber ich denke, getBounds-Methode gibt das kleinste Rect zurück, das den Pfad enthält, richtig?

Also, Räume haben verschiedene benutzerdefinierte geometrische Formen und aus diesem Grund, wenn ich Grenzen über 2 nahe Räume bekommen, könnte Methode eine gemeinsame Menge von Punkten zurückgeben. Schlecht! Jedes Zimmer hat nur ihre Flächenpunkte. Wie kann ich dieses Problem lösen?

In iOS könnte ich verwenden PfadContainsPoint Methode, aber, Android Path hat leider nichts ähnliches.

Ich hoffe, dass mir jemand helfen kann Danke im Voraus


16
2018-03-06 16:40


Ursprung


Antworten:


Ok, ich habe mein Problem gelöst. Ich poste den Beispielcode:

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

40
2018-05-14 15:47



Hier ist ein Gedanke: Erstellen Sie einen neuen Pfad, der ein kleines Quadrat um den Punkt ist, der berührt wurde, und schneiden Sie dann diesen Pfad mit Ihrem Pfad, der getestet werden soll path.op () und sehen, ob das Ergebnis leer ist.


1
2017-11-20 05:14