Подтвердить что ты не робот

Как реагировать на нажатие на 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
        }
    }
}
4b9b3361

Ответ 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 a pinch yet
    }
    if( e.getAction()==MotionEvent.ACTION_MOVE && fingers==2 ){
        isPinch=true;   // Two fingers, def a pinch
    }
    return super.onTouchEvent(e,mapView);
}

}