Android自定义百度地图缩放图标





自定义实现Android百度地图的缩放图标,需要自定义一个缩放控件,实现效果如下:

这里的缩放效果,实现了点击按钮可以对地图的放大缩小,通过手势放大与缩小也控制缩放图标的可用状态。具体实现如下

首先是drawable目录下的两个xml配置文件:

zoom_selector_in.xml

[sourcecode language="xml"]

<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/zoomin_press" android:state_pressed="true"/>    <item android:drawable="@drawable/zoomin_disable" android:state_enabled="false"/>    <item android:drawable="@drawable/zoomin_normal"/>
</selector>

[/sourcecode]

zoom_selector_out.xml

[sourcecode language="xml"]
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/zoomout_press" android:state_pressed="true"/>    <item android:drawable="@drawable/zoomout_disable" android:state_enabled="false"/>    <item android:drawable="@drawable/zoomout_normal"/>
</selector>
[/sourcecode]

layout中的zoom_controls_in_out.xml布局文件:

[sourcecode language="xml"]
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >
<Button        android:id="@+id/btn_zoom_in"        android:layout_width="42dp"        android:layout_height="42dp"        android:background="@drawable/zoom_selector_in" />
<Button        android:id="@+id/btn_zoom_out"        android:layout_width="42dp"        android:layout_height="42dp"        android:background="@drawable/zoom_selector_out" />
</LinearLayout>

[/sourcecode]

主配置文件main_activity.xml

[sourcecode language="xml"]
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >
<com.baidu.mapapi.map.MapView        android:id="@+id/mapview"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:clickable="true" />
<com.example.map.ui.ZoomControlsView        android:id="@+id/zoom_in_out"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentBottom="true"        android:layout_alignParentRight="true"        android:layout_marginBottom="10dp"        android:layout_marginRight="10dp" />
</RelativeLayout>
[/sourcecode]

相关的xml文件都在这里了,下面是具体实现代码:

自定义缩放控件类ZoomControlsView.java

[sourcecode language="xml"]

import android.content.Context;<span style="color: #222222; font-family: ‘Courier 10 Pitch’, Courier, monospace; line-height: 21px;">import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.LinearLayout;</span>
import com.baidu.mapapi.map.BaiduMap;import com.baidu.mapapi.map.MapStatus;import com.baidu.mapapi.map.MapStatusUpdateFactory;import com.baidu.mapapi.map.MapView;import com.cityofcar.gischeck.R;
public class ZoomControlsView extends LinearLayout implements OnClickListener { private Button inBtn;// 放大按钮 private Button outBtn;// 缩小按钮 private BaiduMap baiduMap;// 百度地图对象控制器 private MapStatus mapStatus;// 百度地图状态 private float minZoomLevel;// 地图最小级别 private float maxZoomLevel;// 地图最大级别
public ZoomControlsView(Context context, AttributeSet attrs) { super(context, attrs); init(); }
/** * 初始化 */ private void init() { // 获取布局视图 LinearLayout view = (LinearLayout) LayoutInflater.from(getContext()) .inflate(R.layout.zoom_controls_in_out, null); // 获取放大按钮 inBtn = (Button) view.findViewById(R.id.btn_zoom_in); // 获取缩小按钮 outBtn = (Button) view.findViewById(R.id.btn_zoom_out); // 设置点击事件 inBtn.setOnClickListener(this); outBtn.setOnClickListener(this); // 添加View addView(view); }
@Override public void onClick(View v) { this.mapStatus = this.baiduMap.getMapStatus();// 获取地图状态 switch (v.getId()) { case R.id.btn_zoom_in: // 改变地图状态 this.baiduMap.setMapStatus(MapStatusUpdateFactory .zoomTo(mapStatus.zoom + 1)); controlZoomShow();// 改变缩放按钮 break; case R.id.btn_zoom_out: // 改变地图状态 this.baiduMap.setMapStatus(MapStatusUpdateFactory .zoomTo(mapStatus.zoom – 1)); controlZoomShow();// 改变缩放按钮 break; default: break; } // 重新获取状态 mapStatus = this.baiduMap.getMapStatus(); }
/** * 设置Map视图 *  * @param mapView */ public void setMapView(MapView mapView) { // 获取百度地图控制器 this.baiduMap = mapView.getMap(); // 设置地图手势事件 this.baiduMap.setOnMapStatusChangeListener(onMapStatusChangeListener); // 获取百度地图最大最小级别 maxZoomLevel = baiduMap.getMaxZoomLevel(); minZoomLevel = baiduMap.getMinZoomLevel(); controlZoomShow();// 改变缩放按钮 }
/** * 控制缩放图标显示 */ private void controlZoomShow() { // 获取当前地图状态 float zoom = this.baiduMap.getMapStatus().zoom; // 如果当前状态大于等于地图的最大状态,则放大按钮则失效 if (zoom >= maxZoomLevel) { // inBtn.setBackgroundResource(R.drawable.zoomin_press); inBtn.setEnabled(false); } else { // inBtn.setBackgroundResource(R.drawable.zoom_selector_in); inBtn.setEnabled(true); }
// 如果当前状态小于等于地图的最小状态,则缩小按钮失效 if (zoom <= minZoomLevel) { // outBtn.setBackgroundResource(R.drawable.zoomout_press); outBtn.setEnabled(false); } else { // outBtn.setBackgroundResource(R.drawable.zoom_selector_out); outBtn.setEnabled(true); } }
/** * 地图状态改变相关接口实现 */ BaiduMap.OnMapStatusChangeListener onMapStatusChangeListener = new BaiduMap.OnMapStatusChangeListener() {
/** * 手势操作地图,设置地图状态等操作导致地图状态开始改变。 *  * @param status *            地图状态改变开始时的地图状态 */ @Override public void onMapStatusChangeStart(MapStatus arg0) {
}
/** * 地图状态变化结束 *  * @param status *            地图状态改变结束时的地图状态 */ @Override public void onMapStatusChangeFinish(MapStatus arg0) {
}
/** * 地图状态变化中 *  * @param status *            当前地图状态 */ @Override public void onMapStatusChange(MapStatus arg0) { controlZoomShow(); } };
}

[/sourcecode]

此条目发表在 android 分类目录。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已被标记为 *

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>