2012-03-06 27 views
15

trataría de desarrollar una aplicación en la que pueda dibujar una planimetría. Por lo tanto, cada habitación tiene su propio ID o nombre y, si toco una habitación, quiero mostrar un mensaje de Toast con esa ID o nombre. El problema es cómo comprobar si y qué camino se toca.Android: ¿Cómo comprobar si una ruta contiene un punto tocado?

Vi un montón de discusiones sobre temas que hablaban sobre este problema. Alguien dice que use el método getBounds y, después, contiene un método para verificar si el punto tocado está en Rect. Pero, supongo que el método getBounds devuelve el Rect más pequeño que contiene la ruta, ¿verdad?

Por lo tanto, las salas tienen diferentes formas geométricas personalizadas y, por esta razón, si obtengo límites de 2 salas cercanas, el método podría devolver un conjunto compartido de puntos. ¡Malo! Cada habitación tiene solo sus puntos de área. Como puedó resolver esté problema ?

En iOS podría usar el método PathContainsPoint, pero desafortunadamente, Android Path no tiene algo similar.

espero que alguien me puede ayudar Thx de antemano

Respuesta

39

autorización I resuelto mi problema. He puesto el código de ejemplo:

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

Esto identifica un evento táctil en un polígono delimitador dado alrededor de la ruta en lugar de en la polilínea. –

+0

Exactamente lo que estaba buscando – kinghomer

+0

¿Cuál es el objeto de puntos en points.add (point)? –

1

Aquí es una idea: crear un nuevo camino, que es un pequeño cuadrado en torno al punto de que fue tocado, y luego se cruzan ese camino con su camino a ensayar usando path.op() y ver si el el resultado está vacío

+0

Sí, pero está limitado a API 19 y superior. Hay alguna otra solucion ? – Bartando

+0

Si su ruta es un rectángulo, use la respuesta de kinghomer anterior. Si su ruta es un polígono, consulte la respuesta de sromku aquí: http://stackoverflow.com/a/15817043/338479. Tengo una solución más general que maneja una ruta compuesta de arcos, círculos y segmentos de línea, pero es un poco peluda. Puedo publicarlo la próxima semana si hay suficiente interés. –

+1

Gracias, lo he solucionado subclasificando Path y haciendo un seguimiento de todos los puntos, luego he usado esta fórmula http://stackoverflow.com/a/16391873/3284364 y ​​la reescribí en Java. – Bartando

Cuestiones relacionadas