自定义实现Android百度地图的缩放图标,需要自定义一个缩放控件,实现效果如下:
这里的缩放效果,实现了点击按钮可以对地图的放大缩小,通过手势放大与缩小也控制缩放图标的可用状态。具体实现如下:<喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ytfPyMrHZHJhd2FibGXEv8K8z8K1xMG9uPZ4bWzF5NbDzsS8/qO6PC9wPgo8cD56b29tX3NlbGVjdG9yX2luLnhtbDwvcD4KPHA+PHByZSBjbGFzcz0="brush:java;">
zoom_selector_out.xml
1
2
3
4
5
6
|
<!--?xml version=
"1.0"
encoding=
"utf-8"
?-->
<item android:state_pressed=
"true"
android:drawable=
"@drawable/zoomout_press"
>
<item android:state_enabled=
"false"
android:drawable=
"@drawable/zoomout_disable"
>
<item android:drawable=
"@drawable/zoomout_normal"
>
</item></item></item></selector>
|
layout中的zoom_controls_in_out.xml布局文件:
1
2
3
4
5
6
7
8
|
<!--?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=
"32dp"
android:layout_height=
"32dp"
android:background=
"@drawable/zoom_selector_in"
>
</button><button android:id=
"@+id/btn_zoom_out"
android:layout_width=
"32dp"
android:layout_height=
"32dp"
android:background=
"@drawable/zoom_selector_out"
>
</button></linearlayout>
|
主配置文件main_activity.xml
1
2
3
4
5
|
<!--?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/mv_map"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:clickable=
"true"
>
<com.example.map.view.zoomcontrolsview android:id=
"@+id/zcv_zoom"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_alignparentright=
"true"
android:layout_alignparentbottom=
"true"
android:layout_marginbottom=
"10dp"
android:layout_marginright=
"10dp"
>
</com.example.map.view.zoomcontrolsview></com.baidu.mapapi.map.mapview></relativelayout>
|
自定义缩放控件类ZoomControlsView.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
package
com.example.map.view;
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.example.map.activity.R;
import
android.content.Context;
import
android.util.AttributeSet;
import
android.widget.Button;
import
android.widget.LinearLayout;
import
android.view.LayoutInflater;
import
android.view.View;
import
android.view.View.OnClickListener;;
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,
0
);
init();
}
public
ZoomControlsView(Context context, AttributeSet attrs,
int
defStyle) {
super
(context, attrs, defStyle);
}
/**
* 初始化
*/
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();
}
};
}
|
MainActivity.java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
package
com.example.map.activity;
import
com.baidu.mapapi.SDKInitializer;
import
com.baidu.mapapi.map.BaiduMap;
import
com.baidu.mapapi.map.MapView;
import
com.example.map.view.ZoomControlsView;
import
android.app.Activity;
import
android.os.Bundle;
public
class
MainActivity
extends
Activity{
private
MapView mvMap;
//百度地图控件
private
BaiduMap baiduMap;
//地图对象控制器
private
ZoomControlsView zcvZomm;
//缩放控件
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
//必须在setContentView前
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.main_activity);
initMap();
//初始化
}
/**
* 初始化地图
*/
private
void
initMap(){
//获取地图控件
mvMap=(MapView) findViewById(R.id.mv_map);
mvMap.showZoomControls(
false
);
//隐藏缩放控件
//获取地图对象控制器
baiduMap=mvMap.getMap();
baiduMap.setBuildingsEnabled(
true
);
//设置显示楼体
baiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(19f));
//设置地图状态
//获取缩放控件
zcvZomm=(ZoomControlsView) findViewById(R.id.zcv_zoom);
zcvZomm.setMapView(mvMap);
//设置百度地图控件
}
@Override
protected
void
onPause() {
super
.onPause();
mvMap.onPause();
}
@Override
protected
void
onResume() {
super
.onResume();
mvMap.onResume();
}
@Override
protected
void
onDestroy() {
super
.onDestroy();
mvMap.onDestroy();
//销毁地图
}
}
|
这样就实现了自定义的缩放图标了