我有一个类似的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 (+/-)