Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pinch to zoom with Osmdroid

I've written a mapping application which has two activities, one activity displays a Google Maps view, the other displays the equivalent view using osmdroid 3.0.5 jar.

Until now I've been testing on emulators only and the functionality is completely identical in terms of area shown and overlay data. Now I have run the app on a real Gingerbread device, I notice that the Google Maps activity seems to support pinch to zoom, whilst the Osmdroid one doesn't.

I haven't written any code specific to pinch to zoom for the Google side or for Osmdroid. Both activities implement OnTouchListener. Both activities just have a stub for OnTouch like:

@Override
public boolean onTouch(View v, MotionEvent e) {
    // chain it for now
    return false;
}

My mapview in the Osmdroid activity is of the class: org.osmdroid.views.MapView

Does anybody know how to make pinch to zoom work with osmdroid or know of a sample application using osmdroid that I could study and adapt into my app?

like image 492
NickT Avatar asked Sep 28 '11 12:09

NickT


4 Answers

Osmdroid has the functionality to zoom. You will need to setup a gesturelistener to check for the pinch action, at which point you should call the zoom function in osmdroid. I believe in osmdroid 3.0.5 it is something like

mOsm.getController.setZoomLevel(someNumber) (mOsm is an instance of the map view).

I have the zoom function working for the opposite pinch (you fingers start close together and then expand). I suggest using a MotionEvent (like you are currently doing) and doing something like this:

boolean finished = false;

@Override
public boolean onTouch(View v, MotionEvent e) {

    switch (e.getAction()) {

        case MotionEvent.ACTION_DOWN:
            finished = false;
            break;

        case MotionEvent.ACTION_MOVE:
            finished = false;
            break;

        case MotionEvent.ACTION_UP:
            //action is finishing at this point, so now I can do my refreshActionOnMap();
            if (!finished) 
                refreshActionOnMap();
            break;
    }
    return true;
}

The code I have added deals with the pinch - the finished boolean is something I implemented in my program to figure out when to refresh the map. That should help you out more.

Here is a further explanation of this.

If you are looking for something different, then try reading here. Android has been supporting the pinch action since June 2010 apparently.

like image 120
digerati32 Avatar answered Nov 16 '22 04:11

digerati32


As shameus.burp said, the codeline-

mapView.setMultiTouchControls(true); 

Is working for me in order to pinch for zoom (check at 2021).

Notice that the function that shows zoom-controller (basically it is buttons of (-) and (+)) -

MapView.setBuiltInZoomControls(true);

is deprecated by osmdroid.

So instead, you can use the code line -

mapView.getZoomController().setVisibility(CustomZoomButtonsController.Visibility.ALWAYS);

By default (without adding the last code line) osmdroid is set the zoom-controller to show and fade. Equivalent to

CustomZoomButtonsController.Visibility.SHOW_AND_FADEOUT 

option.

like image 39
dana wisher Avatar answered Nov 16 '22 03:11

dana wisher


MapView.setBuiltInZoomControls(true);
MapView.setMultiTouchControls(true);
like image 39
shameus.burp Avatar answered Nov 16 '22 03:11

shameus.burp


Is it possible not to zoom to the map center but to the middle of users two finger.

like image 2
Ismail Sahin Avatar answered Nov 16 '22 03:11

Ismail Sahin