是否可以使用贴图v2的默认ZoomControls来放大/缩小缩放级别的自定义量,例如0.5x



我有一个类似的mapFragment

   <fragment xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="0px"
        android:layout_weight="5"
        tools:context="com....."/> 

我启用默认的ZoomControle("+"one_answers"-"按钮):

public void onMapReady(GoogleMap googleMap){
    googleMap.getUiSettings().setZoomControlsEnabled(true);
    ...
}

使用这些ZoomControls,用户可以放大/缩小1个Zoomlevel。使用ZoomGestures,用户可以"连续"放大/缩小,即缩放级别之间的值。对于不同于"1"(例如0.5)的ZoomLevel,我可以更改地图的ZoomControls的放大/缩小行为吗?

好的。。答案是:是的!以下是我如何将ZoomControls的行为更改为按住+单击事件和在按下时放大/缩小,同时更新UI(地图)。这种方法还让我可以轻松地为mapFragment设置MaxZoom和MinZoom级别,与在OnCameraChangeListener中设置ZoomLevel相比,用户体验要好得多!

我在mapFragment中的"+"one_answers"-"子级上设置了一个OnTouchListener。当手指用"MotionEvent.ACTION_DOWN"触摸按钮时,将启动用于放大/缩小贴图的线程。在"MotionEvent.ACTION_UP"上,线程被中断:

    mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
    // get the default ZoomControls from the mapFragment:
    View zoomControls = mapFragment.getView().findViewById(0x1);
    for(int i=0;i<((ViewGroup)zoomControls).getChildCount();i++){
        View child=((ViewGroup)zoomControls).getChildAt(i);
        if (i==0) {
            // there is your "+" button, zoom in
            child.setOnTouchListener(new View.OnTouchListener(){
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    switch (event.getAction()){
                        case MotionEvent.ACTION_DOWN:
                            updateZoom = new ZoomInMapThread();
                            updateZoom.start();
                            break;
                        case MotionEvent.ACTION_UP:
                            updateZoom.interrupt();
                            break;
                    }
                    return true;
                }
            });
        }
        if (i==1) {
            // there is your "-" button, zoom out
            child.setOnTouchListener(new View.OnTouchListener(){
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    switch (event.getAction()){
                        case MotionEvent.ACTION_DOWN:
                            updateZoom = new ZoomOutMapThread();
                            updateZoom.start();
                            break;
                        case MotionEvent.ACTION_UP:
                            updateZoom.interrupt();
                            break;
                    }
                    return true;
                }
            });
        }
    }

在Activity类的末尾,我创建了ZoomThreads:

private class ZoomOutMapThread extends Thread {
    @Override
    public void run(){
        try {
            while (!Thread.currentThread().isInterrupted()){
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        currentZoomLevel = currentZoomLevel - 0.1f;
                        if (currentZoomLevel < minZoom){
                            currentZoomLevel = minZoom;
                        }
                        mMap.animateCamera(CameraUpdateFactory.zoomTo(currentZoomLevel));
                        Log.d("Zoom", "Level:" + currentZoomLevel);
                    }
                });
                Thread.sleep(100);
            }
        } catch (InterruptedException consumed) {
            consumed.printStackTrace();
        }
    }
}
private class ZoomInMapThread extends Thread {
    @Override
    public void run(){
        try {
            while (!Thread.currentThread().isInterrupted()){
                // make the Thread able to update the UserInterace:
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        // increase the currentZoomLevel by 0.1:
                        currentZoomLevel = currentZoomLevel + 0.1f;
                        // increase only while we have not reached predefined maxZoom:
                        if (currentZoomLevel > maxZoom){
                            currentZoomLevel = maxZoom;
                            // good moment to disable the "+" button somehow
                        }
                        // update the Camera in GoogleMap mMap from onMapReady():  mMap.animateCamera(CameraUpdateFactory.zoomTo(currentZoomLevel));
                        Log.d("Zoom","Level:"+currentZoomLevel);
                    }
                });
                // repeat every 100ms while finger holds the "+"-Button
                Thread.sleep(100);
            }
        } catch (InterruptedException consumed) {
            consumed.printStackTrace();
        }
    }
}

不要忘记声明类变量:

private float maxZoom = 9.99f;
private float minZoom = 8.2f;
private float currentZoomLevel = 9.1f;

对于onMapReady(GoogleMap..):

public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    mMap.getUiSettings().setRotateGesturesEnabled(false);   // prevent rotation UI
    mMap.getUiSettings().setMapToolbarEnabled(false);       // prevent navigate to UI
    mMap.getUiSettings().setZoomGesturesEnabled(false);     // prevent default Zoom Gestures
    mMap.getUiSettings().setZoomControlsEnabled(true);      // show default Zoom Controls (+/-)

最新更新