开发者

Pinch to zoom with Osmdroid

开发者 https://www.devze.com 2023-04-09 14:49 出处:网络
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.开发者_如何学编程

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?


MapView.setBuiltInZoomControls(true);
MapView.setMultiTouchControls(true);


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.


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


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.

0

精彩评论

暂无评论...
验证码 换一张
取 消