Как мне реагировать на нажатие Android MapView, но игнорировать масштабирование? - PullRequest
11 голосов
/ 26 января 2011

У меня есть 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 Ответ

27 голосов
/ 29 января 2011

После долгих царапин и попыток различных подходов, этот пока работает хорошо.Код следует за событиями движения.Когда мы получаем событие 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);
}

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...