Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


OnTouch en MapView sólo se dispara la primera vez

Estoy tratando de implementar un doble toque de zoom como función en mi MapView. El evento siempre se dispara la primera vez, pero nunca las veces siguientes. A continuación se muestra mi código. Tengo la sensación de que tiene algo que ver con que el controlador del mapa se pierda después de la primera vez que se dispara el evento.

import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import com.google.android.maps.MapActivity; import com.google.android.maps.MapController; import com.google.android.maps.MapView; public class mainmap extends MapActivity implements OnTouchListener{ long lasttime = -1; MapController mapc; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); MapView mapView = (MapView) findViewById(R.id.mapview); mapView.setBuiltInZoomControls(true); mapc = mapView.getController(); mapView.setOnTouchListener(this); } @Override protected boolean isRouteDisplayed() { // TODO Auto-generated method stub return false; } @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN){ if(event.getEventTime()-lasttime<2000){ mapc.zoomInFixing((int)event.getX(),(int)event.getY()); } } lasttime=event.getEventTime(); return true; } } 

También he intentado corregir el método de OnTouch para echar la vista entrante a un MapView, conseguir el regulador mientras que el acontecimiento se tira. Sin embargo, obtengo los mismos resultados donde se dispara el primer evento pero no los posteriores.

 public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN){ if(event.getEventTime()-lasttime<2000){ ((MapView)v).getController().zoomInFixing((int)event.getX(), (int)event.getY()); } } lasttime=event.getEventTime(); return true; } 

Siendo lo más básico posible, corté todo el código en el método OnTouch y lo programé para simplemente mostrar un pequeño mensaje de brindis.

 public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN){ Toast.makeText(this,"Down!",Toast.LENGTH_SHORT).show(); } return true; } 

Esto funciona como se esperaba, mostrando el Toast cada vez que se toca el MapView.

No entiendo por qué el evento se disparará correctamente en este caso, pero no en mi ejecución anterior.

6 Solutions collect form web for “OnTouch en MapView sólo se dispara la primera vez”

Si está utilizando este método "mapView.setBuiltInZoomControls(true);" Entonces su touch está trabajando a la vez.

Quite esa línea y compruebe que estoy seguro de que funcionará.

En algunos casos si usted quiere BuiltInZoomControls entonces usted puede usted método de OnTouch de la superposición como abajo.

 public class MapOverlay extends Overlay { public MapOverlay(Context ctx) {super(ctx);} @Override protected void draw(Canvas c, MapView osmv, boolean shadow) { } @Override public boolean onTouchEvent(MotionEvent e, MapView mapView) { //Write yout touch code here.. return false; } } 

Tenía el mismo problema – no podía arrastrar y desplazar el mapa porque estaba recibiendo sólo ACTION_DOWN eventos. Puede solucionarse agregando android:clickable="true" al MapView o llamando a mapView.setClickable(true) .

Subclase MapView y reemplaza dispatchTouchEvent como a continuación y usa la subclase en su lugar.

 public class MyMap extends MapView{ @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (mOnMovedListener!= null) { mOnMovedListener.onMove(ev); } return super.dispatchTouchEvent(ev); } private OnMovedListener mOnMovedListener; public void setOnMovedListener(OnMovedListener mOnMovedListener) { this.mOnMovedListener= mOnMovedListener; } } 

¡Regístrese para escuchar como cualquier otro!

¿Qué hay de usar un GestureDetector.OnDoubleTapListener lugar de OnTouchListener ?

Deberías por lo menos poner

 lasttime=event.getEventTime(); 

bajo la

 if (event.getAction() == MotionEvent.ACTION_DOWN) brakes 

Mientras que onTouch detecta ACTION_UP evento de su clic. Así que cada vez que haga un clic se llama 2 veces

Implementar el evento Touch en la vista de mapa en su lugar. ¡¡Que funcionará!!

  // The onTouch event of the Map itself does not fire! // We must implement it on the mapView!!! mapView.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { // Your code and remember to return true! return (true); } }); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.