Как мне реагировать на нажатие Android MapView, но игнорировать масштабирование?
У меня есть MapView в действии, и он отлично работает, карта показывает, и она реагирует на нажатия, и я могу легко извлечь местоположение. Однако этот обработчик также реагирует на масштабирование, поэтому, если пользователь пытается увеличить масштаб, приложение реагирует так, как будто они нажали (и это очень сбивает с толку).
Как я могу реагировать на нажатия на MapView и выбирать только одно нажатие, особенно игнорируя пинч-зум и двойное нажатие?
Нужно ли использовать OnTouchEvent() вместо OnTap()? Если да, как мне различать разные сенсорные события и как получить доступ к GeoPoint?
Вот код из моей MapActivity:
class MapOverlay extends com.google.android.maps.Overlay
{
@Override
public boolean onTap(GeoPoint p, MapView map)
{
if ( p!=null )
{
// Do stuff with the geopoint
return true; // We handled the tap
}
else
{
return false; // We didn't handle the tap
}
}
}
1 ответ
После того, как сильно почесал голову и попробовал различные подходы, этот до сих пор работает хорошо. Код следует за событиями движения. Когда мы получаем событие ACTION_DOWN, он помечает флаг isPinch как ложный (мы не знаем, является ли это пинчем или нет), но как только мы получаем событие касания (то есть ACTION_MOVE) с участием двух пальцев, isPinch устанавливается в true, и поэтому при возникновении события onTap() он может видеть, был ли пинч или нет.
class MapOverlay extends com.google.android.maps.Overlay
{
private boolean isPinch = false;
@Override
public boolean onTap(GeoPoint p, MapView map){
if ( isPinch ){
return false;
}else{
Log.i(TAG,"TAP!");
if ( p!=null ){
handleGeoPoint(p);
return true; // We handled the tap
}else{
return false; // Null GeoPoint
}
}
}
@Override
public boolean onTouchEvent(MotionEvent e, MapView mapView)
{
int fingers = e.getPointerCount();
if( e.getAction()==MotionEvent.ACTION_DOWN ){
isPinch=false; // Touch DOWN, don't know if it's a pinch yet
}
if( e.getAction()==MotionEvent.ACTION_MOVE && fingers==2 ){
isPinch=true; // Two fingers, def a pinch
}
return super.onTouchEvent(e,mapView);
}
}