2012-03-06 9 views
15

proverei a sviluppare un'applicazione in cui posso disegnare una planimetria. Quindi, ogni camera ha il proprio ID o nome e, se tocco una stanza, voglio mostrare un messaggio Toast con quell'ID o nome. Il problema è come controllare se e quale percorso è stato toccato !!Android: come verificare se un percorso contiene punti toccati?

Ho visto molte discussioni sull'argomento che hanno parlato di questo problema. Qualcuno dice di usare il metodo getBounds e, dopo, contiene il metodo per verificare se il punto toccato è in Rect. Ma, credo che il metodo getBounds restituisca il Rect più piccolo che contiene path, giusto?

Quindi, le stanze hanno diverse forme geometriche personalizzate e, per questo motivo, se ottengo limiti su 2 stanze chiuse, il metodo potrebbe restituire un insieme condiviso di punti. Cattivo! Ogni stanza ha solo i punti dell'area. Come posso risolvere questo problema ?

In iOS è possibile utilizzare il metodo PathContainsPoint, ma sfortunatamente Android Path non ha nulla di simile.

Spero che qualcuno mi può aiutare Thx in anticipo

risposta

39

Ok ho risolto il mio problema. I post il codice di esempio:

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

Identifica un evento tattile in un dato poligono di delimitazione attorno al percorso anziché sulla polilinea. –

+0

Esattamente quello che stavo cercando – kinghomer

+0

qual è l'oggetto punti in points.add (punto)? –

1

Ecco un pensiero: creare un nuovo percorso, che è un piccolo quadrato attorno al punto che è stato toccato, e poi si intersecano quel percorso con il percorso da sottoporre a test utilizzando path.op() e vedere se il il risultato è vuoto

+0

Sì, ma si è limitati all'API 19 e versioni successive. C'è un'altra soluzione ? – Bartando

+0

Se il tuo percorso è un rettangolo, usa la risposta di kinghomer sopra. Se il tuo percorso è un poligono, vedi la risposta di sromku qui: http://stackoverflow.com/a/15817043/338479. Ho una soluzione più generale che gestisce un percorso composto da archi, cerchi e segmenti di linea, ma è un po 'peloso. Posso postarlo la prossima settimana se c'è abbastanza interesse. –

+1

Grazie, l'ho risolto sottoclassando Path e tenendo traccia di tutti i punti, quindi ho utilizzato questa http://stackoverflow.com/a/16391873/3284364 formula e l'ho riscritta in Java. – Bartando