百度地图SDK3.2.0—自定义缩放按钮,与手势同步
来源:互联网 发布:网络教育报哪个专业好 编辑:程序博客网 时间:2024/04/28 02:49
转载注明出处:http://blog.csdn.net/zhshulin/article/details/41378927
百度地图SDK3.0今年6月5号更新之后,全面升级SDK接口设计,不兼容老版本。
本文简介:百度地图自带缩放控件很丑,即使在9月18号发布的3.1.1版本中开放了调整位置的接口依然无法满足我的需要,而且百度地图自己的产品就是位于右侧上下排列的两个缩放按钮,看着舒服,用着方便。故而本文说明的就是模仿这种实现的一个简单方法。
这是一个大神的解决方案,他用的百度地图版本为2.3,接口和当前3.0之后的很多不一样,修改之后发现没有metersToEquatorPixels()方法,故而无法直接实现,但是今天发现百度地图SDK3.1.1已经新增了这种方法,故而有需求的同学可以参考他的解决方案,不过需要自己改一改。
http://blog.csdn.net/xiaanming/article/details/11821523
以下是我的解决方案,非常简单:
首先看一下主Activity中的布局文件,很简单的相对布局:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <!-- 添加地图控件 --> <com.baidu.mapapi.map.MapView android:id="@+id/mapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" /> <RelativeLayout android:id="@+id/ZoomControlView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_marginBottom="20.0dip" android:layout_marginRight="5.0dip" > <Button android:id="@+id/zoomin" android:layout_width="40dip" android:layout_height="40dip" android:background="@drawable/zoomin_seletor" /> <Button android:id="@+id/zoomout" android:layout_width="40dip" android:layout_height="40dip" android:layout_below="@+id/zoomin" android:background="@drawable/zoomout_seletor" /> </RelativeLayout></RelativeLayout>
这样你就可以在自己的地图上看到两个缩放控件:
接下来就是隐藏百度默认的缩放控件,然后为自己的控件添加点击事件:
隐藏缩放控件在3.0版本中zoomControlsEnabled(boolean enabled)设为false没效果,不知道后面更新3.1.1中有没有解决,有兴趣的可以自己试试。我的解决方法是:
/** * 隐藏缩放控件 * * @param mapView */private void hideZoomView(MapView mapView) {baiduMap = mapView.getMap();// 隐藏缩放控件int childCount = mapView.getChildCount();View zoom = null;for (int i = 0; i < childCount; i++) {View child = mapView.getChildAt(i);if (child instanceof ZoomControls) {zoom = child;break;}}zoom.setVisibility(View.GONE);}
调用这个方法即可隐藏百度自己的缩放控件,然后我们为自定义的两个缩放按钮添加事件即可:
hideZoomView(mapView);// 隐藏缩放控件zoomInBtn = (Button) v.findViewById(R.id.zoomin);zoomOutBtn = (Button) v.findViewById(R.id.zoomout);zoomInBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {float zoomLevel = baiduMap.getMapStatus().zoom;L.i(Float.toString(zoomLevel));if(zoomLevel<=18){//MapStatusUpdateFactory.zoomIn();baiduMap.setMapStatus(MapStatusUpdateFactory.zoomIn());zoomOutBtn.setEnabled(true);}else{Toast.makeText(getActivity(), "已经放至最大!", Toast.LENGTH_SHORT).show();zoomInBtn.setEnabled(false);}}});zoomOutBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {float zoomLevel = baiduMap.getMapStatus().zoom;if(zoomLevel>4){baiduMap.setMapStatus(MapStatusUpdateFactory.zoomOut());zoomInBtn.setEnabled(true);}else{zoomOutBtn.setEnabled(false);Toast.makeText(getActivity(), "已经缩至最小!", Toast.LENGTH_SHORT).show();}}});
这样我们就得到了我们想要的效果了。
BUG修复:2014-11-22 17:48
上面说到的部分实现了自定义缩放按钮,但是没有考虑到地图中的手势缩放,下面就是修复这部分的BUG,让用户手势缩放和按钮缩放可以同步。
1、在类中建立 private float currentZoomLevel这个变量,将上面代码中的zoomLevel全部换成这个。
2、类中实例化地图状态改变接口,如下:
BaiduMap.OnMapStatusChangeListener mapStatusChangeListener = new OnMapStatusChangeListener() {@Overridepublic void onMapStatusChange(MapStatus arg0) {//L.i("*******onMapStatusChange**********");currentZoomLevel = arg0.zoom;if(currentZoomLevel>18.5){zoomInBtn.setEnabled(false);}else if(currentZoomLevel<3.5){zoomOutBtn.setEnabled(false);}else{zoomInBtn.setEnabled(true);zoomOutBtn.setEnabled(true);}}@Overridepublic void onMapStatusChangeFinish(MapStatus arg0) {//L.i("*********onMapStatusChangeFinish********");}@Overridepublic void onMapStatusChangeStart(MapStatus arg0) {//L.i("*****************"+Float.toString(currentZoomLevel));}};
3、在onCreate()方法中使用BaiduMap对象调用setOnMapStatusChangeListener()方法设置监听即可完成;
BUG修复 2014-11-27 11:24
解决有时候地图放的过大而无法手势缩小的问题。
上述用数字表示的最大最小缩放等级,改用BaiduMap的对象来获取最大最小值,如果超过了就将最大最小值赋给当前值。主要代码如下:
@Overridepublic void onMapStatusChange(MapStatus arg0) {maxZoomLevel = baiduMap.getMaxZoomLevel();minZoomLevel = baiduMap.getMinZoomLevel();currentZoomLevel = arg0.zoom;if (currentZoomLevel>=maxZoomLevel) {currentZoomLevel = maxZoomLevel;}else if(currentZoomLevel<=minZoomLevel){currentZoomLevel = minZoomLevel;}if (currentZoomLevel ==maxZoomLevel) {//设置地图缩放等级为上限MapStatusUpdate u = MapStatusUpdateFactory.zoomTo(currentZoomLevel);baiduMap.animateMapStatus(u); zoomInBtn.setEnabled(false);} else if (currentZoomLevel ==minZoomLevel) {//设置地图缩放等级为下限MapStatusUpdate u = MapStatusUpdateFactory.zoomTo(currentZoomLevel);baiduMap.animateMapStatus(u); zoomOutBtn.setEnabled(false);} else {if (!zoomInBtn.isEnabled() || !zoomOutBtn.isEnabled()) {zoomInBtn.setEnabled(true);zoomOutBtn.setEnabled(true);}}}
源码下载
- 百度地图SDK3.2.0—自定义缩放按钮,与手势同步
- 百度地图删除标尺,logo,缩放按钮
- 隐藏百度地图的缩放按钮
- 百度地图SDK3.0 key的配置
- 百度地图SDK3.4的使用
- Android自定义百度地图缩放图标
- Android自定义百度地图缩放图标
- 百度地图API自定义缩放控件
- android 百度地图3.2隐藏缩放按钮和百度logo
- 百度地图点击地图显示所选位置与自定义回到定位按钮
- 百度地图隐藏logo与缩放空间
- 调整百度地图中的logo和缩放按钮位置
- 调整百度地图中的logo和缩放按钮
- 百度地图3.0 隐藏比例尺和缩放按钮的方法
- 百度地图SDK 3.x 隐藏缩放按钮
- Android百度地图隐藏缩放按钮和比例尺的方法
- android百度地图设置logo,缩放按钮,指南针的位置
- Android百度地图sdk3.0隐藏放大缩小控件
- PerparedStatement 的SQL语句
- 集群中 Puppet-dashboard安装 小结
- oracle定时执行计划任务
- 兼容各个浏览器透明背景写法
- 集群中关于mesos安装的步骤 总结
- 百度地图SDK3.2.0—自定义缩放按钮,与手势同步
- 调试技巧
- Dom4j下载及使用Dom4j读写XML简介
- CSS技巧:清除浮动
- 黑马程序员——OC内存管理(一)
- 判断网页是否在微信浏览器中打开
- 如何在WEBLOGIC12中配置JMS服务器
- struts2_demo
- Android实例demo5之FileOutputStream文件写入的多种方法