Acceder

Ver la Versión Completa : [ SOLUCIONADO ] Ayuda con Mapas


monchyrcg
11/03/12, 21:01:38
Buenas tardes, hace tiempo que leo esto a parte de seguir el foro de LG.

Bueno ahí va mi pregunta. Yo tengo mi mapa en cual carga de lujo y hagas mis cosillas entre ellas pinto sobre el con un objeto Overlay una chincheta sobre la dirección o coordenadas dadas.

El problema es el siguiente yo lo que quiero es que una vez pintada la chincheta pueda pulsar sobre ella. Algo como lo que puedes hacer en la app de mapas original. Alguien me puede ayudar??

Yo hago lo más fácil pintar una capa encima del mapa (overlay) y sobre esta capa un objeto canvas y ahí puesto pinto lo que quiero. Los canvas no tienen listener. Puedo hacer otra cosa??

Muchas gracias, un saludo.

tompad28
12/03/12, 20:34:31
Hola monchyrcg,

No sé si esto te servirá. Existe un evento llamado onTouchEvent() que se ejecuta cada vez que el usuario pulsa sobre la pantalla. A este evento se le pasa un MotionEvent del que se puede extraer la siguiente información:

event.getAction() - Obtiene la acción que el usuario ha realizado sobre la pantalla: MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE, MotionEvent.ACTION_UP.
event.getX() y event.getY() que te devuelven el punto en el que se está ejecutando la acción anterior.

Con estos valores, puedes hacer una función que determine si el punto está dentro del canvas a partir de su ubicación, y en ese caso ejecutar el código que necesites.


public boolean onTouchEvent(MotionEvent event){
int action = event.getAction();
int x = event.getX();
int y = event.getY();

switch(action){
case MotionEvent.ACTION_DOWN:
comprobarCanvas(x, y);
}
break;
}
}

Donde comprobar canvas sería una función que se recorre los marcadores que indicas y comprueba si el punto está contenido en alguno de ellos.

monchyrcg
12/03/12, 20:58:41
Muchas gracias tompad28 ese el método que uso, el problema es que como le digo en que punto he tocado del mapa. Me explico las coordenadas del canvas viene dada en pixeles y podría hacer un if comparando que coincidan con event.getX y event.getY, por ejemplo, pero no funciona porque lo primero tienes que ser muy fino para tocar justo en el punto y lo segundo y más grande problema es el re dimensionado. Cuando hago zoom in/out los pixeles cambian y entonces que hago??

Yo creo que la solución a todo esto seria pintar algo encima que tuviese un listener pero no se el que. Canvas no tiene? Si pudiese pintar un botón por ejemplo ya estaría.

Alguna sugerencia.

Muchas gracias.

tompad28
13/03/12, 00:20:49
Esto ya te lo comento más hablando de programación en general que de android en particular, porque la verdad es que no he llegado a tanto nivel, pero supongo que será un poco similar a los gráficos en 2D del resto de sistemas.

Cuando quieres saber si un punto está dentro de un objeto, no es suficiente sólo con el punto en que se genera el objeto, sino que también necesitas el ancho y el alto. Hay ecuaciones de todo tipo para saber si un punto está dentro de un área, pero por ejemplo la del cuadrado, que es la más fácil y creo que es tu caso, es algo así como:

Suponiendo que tenemos dos puntos, "touch" para donde ha tocado el usuario y "vertice" para el vértice superior izquierdo del cuadro, y dos longitudes "altura" y anchura" tenemos

bool dentro = touch.x >= vertice.x && touch.x <= (vertice.x + anchura) && touch.y >= vertice.y && touch.y <= (vertice.y + altura)

monchyrcg
13/03/12, 00:39:05
Ahora no lo puedo probar porque estoy reventado la verdad y no me voy a poner. Mañana lo probare, pero en principio muchas gracias.

monchyrcg
13/03/12, 09:43:04
Joder no funciona!! Ahora tengo que estar demasiado fino para darle. Alguien sabe si puedo añadir un surface a un map o algo así. Me tiene esto loco.

Solo quiero pintar algo sobre el mapa que luego pueda pulsar!!!!

monchyrcg
13/03/12, 11:18:45
Lo he conseguido!!!!! Buscando encuentras. VIVA LA API DE GOOGLE!!!!!!!!!!!!!!!!

He conseguido poner un marcador que tenga un listener (no es un listener en realidad) y que me habra un dialog TOMA!!! jajajaja

Bueno me explico un poco, para pintar en el mapa me ayudaba de las capas de Overlay fijándome en la ayuda de google (http://code.google.com/intl/es-ES/android/add-ons/google-apis/index.html)
me he dado cuenta que existe la clase OverlayItem que es la base de otra clase llamada ItemizedOverlay. Esta última clase le pone foco a cada uno de los items que pinto en el mapa, fijaros como:



public class MapViewPruebaActivity extends MapActivity {
/** Called when the activity is first created. */
private Drawable drawable = this.getResources().getDrawable(R.drawable.marcado r_google_maps);

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

MapView mapView = (MapView) findViewById(R.id.mapa);
mapView.setBuiltInZoomControls(true);
List<Overlay> capas = mapView.getOverlays();

PonerMarcas poner = new PonerMarca(drawable, this);
GeoPoint point = new GeoPoint(latitud,longitud);
OverlayItem item = new OverlayItem(point, "Titulo", "Info del punto");
poner.addOverlay(item);
capas.add(poner);
}

.........
....
}

Fijaros que el código es facilísimo y muy parecido a la opción Overlay solo que aquí creo un objeto OverlayItem. La clase PonerMarcas deriva de ItemizedOverlay y con el método onTap pongo el dialogo.



public class PonerMarcas extends ItemizedOverlay{

private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
Context mContext;

public PonerMarcas(Drawable defaultMarker) {
super(boundCenterBottom(defaultMarker));

}

public PonerMarcas(Drawable defaultMarker, Context context) {
super(boundCenterBottom(defaultMarker));
mContext = context;
}

public void addOverlay(OverlayItem overlay) {
mOverlays.add(overlay);
populate();
}

@Override
protected OverlayItem createItem(int i) {
return mOverlays.get(i);
}

@Override
public int size() {
return mOverlays.size();
}

@Override
protected boolean onTap(int index) {
OverlayItem item = mOverlays.get(index);
AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet());
dialog.show();
return true;
}
}




Bueno creo que con el código esta todo perfectamente explicado no? La verdad es que no soy muy bueno explicandome por eso pongo el código!!

Muchas gracias a todos!!!