可视区域操作
高德地图的 Android SDK 允许您通过修改地图可视区域,改变用户的观看视角。
可视区域的位置(CameraPosition)
可视区域的位置由以下属性组成:
- 目的地(target)
- 缩放级别(zoom)
- 方向(bearing)
- 倾斜角度(tilt)
屏幕当前可视区域的位置可以通过 AMap.getCameraPosition() 方法获取。
目的地(target)
地图的中心位置。位置使用经度和纬度说明。
1
2
|
// 获取当前地图中心点的坐标
LatLng mTarget = aMap.getCameraPosition().target;
|
缩放级别(zoom)
可视区域的缩放级别决定了地图的比例。地图缩放级别为4-20级,缩放级别不必是一个整数。
缩放级别较低时,您可以看到更多地区的地图;缩放级别高时,您可以查看地区更加详细的地图。
下面的图像显示出不同的缩放级别:
1
2
|
// 获取当前地图的缩放级别
float
mZoom = aMap.getCameraPosition().zoom;
|
方向(bearing)
默认情况下,地图的方向为0度,屏幕正上方指向北方。当您逆时针旋转地图时,地图正北方向与屏幕正上方的夹角度数为地图方向,范围是从0度到360度。例如,一个90度的查询结果,在地图上的向上的方向指向正东。
1
2
|
// 获取当前地图的旋转角度
float
mBearing = aMap.getCameraPosition().bearing;
|
倾斜角度(tilt)
可视区域的位置在地图的中心位置和地球的表面之间的圆弧上,从最低点以度测量(方向直接指向下方的可视区域)。当您改变视角,地图显示的角度来看,远方的建筑变小,附近的建筑则变大,产生立体效果。
地图倾角范围为0-45度。
1
2
|
// 获取当前地图的倾斜角度
float
mTilt = aMap.getCameraPosition().tilt;
|
移动可视区域
高德地图 Android SDK 允许您在屏幕上切换显示的地图区域。这是通过改变可视区域的位置实现的。改变可视区域的位置,需要您明确想要把可视区域移动到哪里。您可使用 CameraUpdateFactory 创建不同类型的 CameraUpdate。以下的选项可供使用。
仅更改缩放级别
CameraUpdateFactory.zoomIn() 和 CameraUpdateFactory.zoomOut() 可以改变缩放级别放大或缩小1,同时保持其他相同的属性。
CameraUpdateFactory.zoomTo(float) 改变缩放级别为一个定值,同时保持其他相同的属性。
CameraUpdateFactory.zoomBy(float x) 和 CameraUpdateFactory.zoomBy(float, Point) 通过定值,增加或降低x(如果值为负数)缩放级别。后者根据地图上指定坐标点,放大或缩小地图,为了实现这一点,所以它可能会改变可视区域的中心位置。
这些方法返回一个 CameraUpdate 对象,使用 AMap.moveCamera(CameraUpdate update) 方法更新可视区域显示在地图上。
仅更改视图中心点
有三个简便的方法可以改变位置:
- CameraUpdateFactory.changeLatLng(LatLng),仅改变可视区域中心点的坐标,其他属性不变。
- CameraUpdateFactory.newLatLng(LatLng),可以改变可视区域的经纬度,缩放级别默认为固定值4,保留其他属性。
- CameraUpdateFactory.newLatLngZoom(LatLng, float),可以改变可视区域的经纬度、缩放级别,并且保留其他属性。
返回一个 CameraUpdate 对象,使用 AMap.moveCamera(CameraUpdate update) 方法更新可视区域显示在地图上。
仅更改旋转角度
使用 CameraUpdateFactory.changeBearing(float bearing) 方法可以改变可视区域的方向并且保留其他属性。返回一个 CameraUpdate 对象,使用 AMap.moveCamera(CameraUpdate update) 方法更新可视区域显示在地图上。
仅更改倾斜角度
使用 CameraUpdateFactory.changeTilt(float tilt) 方法可以改变可视区域的倾斜角度并且保留其他属性。返回一个 CameraUpdate 对象,使用 AMap.moveCamera(CameraUpdate update) 方法更新可视区域显示在地图上。
更改可视区域
为了改变可视区域的位置更加灵活,可以使用 CameraUpdateFactory.newCameraPosition(CameraPosition) 移动可视区域到指定位置。CameraPosition 可以用以下方法直接获取:使用 new CameraPosition() 或使用 new CameraPosition.Builder()。
返回一个 CameraUpdate 对象,使用 AMap.moveCamera(CameraUpdate update) 方法更新可视区域显示在地图上。
示例代码如下(详细信息,请参考示例工程“Camera 功能”案例 / com.amapv2.apis.basic.CameraActivity.java):
示例代码
详细信息,请参考示例工程“Camera 功能”案例 / com.amapv2.apis.basic.CameraActivity.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
|
public
class
CameraActivity
extends
Activity
implements
OnClickListener,
CancelableCallback {
/**
* 根据动画按钮状态,调用函数animateCamera或moveCamera来改变可视区域
*/
private
void
changeCamera(CameraUpdate update, CancelableCallback callback) {
boolean
animated = ((CompoundButton) findViewById(R.id.animate))
.isChecked();
if
(animated) {
aMap.animateCamera(update,
1000
, callback);
}
else
{
aMap.moveCamera(update);
}
}
@Override
public
void
onClick(View v) {
switch
(v.getId()) {
/**
* 点击停止动画按钮响应事件
*/
case
R.id.stop_animation:
aMap.stopAnimation();
break
;
/**
* 点击“去中关村”按钮响应事件
*/
case
R.id.Zhongguancun:
changeCamera(
CameraUpdateFactory.newCameraPosition(
new
CameraPosition(
Constants.ZHONGGUANCUN,
18
,
0
,
30
)),
null
);
break
;
/**
* 点击“去陆家嘴”按钮响应事件
*/
case
R.id.Lujiazui:
changeCamera(
CameraUpdateFactory.newCameraPosition(
new
CameraPosition(
Constants.SHANGHAI,
18
,
30
,
0
)),
this
);
break
;
/**
* 点击向左移动按钮响应事件,camera将向左边移动
*/
case
R.id.scroll_left:
changeCamera(CameraUpdateFactory.scrollBy(-SCROLL_BY_PX,
0
),
null
);
break
;
/**
* 点击向右移动按钮响应事件,camera将向右边移动
*/
case
R.id.scroll_right:
changeCamera(CameraUpdateFactory.scrollBy(SCROLL_BY_PX,
0
),
null
);
break
;
/**
* 点击向上移动按钮响应事件,camera将向上边移动
*/
case
R.id.scroll_up:
changeCamera(CameraUpdateFactory.scrollBy(
0
, -SCROLL_BY_PX),
null
);
break
;
/**
* 点击向下移动按钮响应事件,camera将向下边移动
*/
case
R.id.scroll_down:
changeCamera(CameraUpdateFactory.scrollBy(
0
, SCROLL_BY_PX),
null
);
break
;
/**
* 点击地图缩小按钮响应事件
*/
case
R.id.zoom_in:
changeCamera(CameraUpdateFactory.zoomIn(),
null
);
break
;
/**
* 点击地图放大按钮响应事件
*/
case
R.id.zoom_out:
changeCamera(CameraUpdateFactory.zoomOut(),
null
);
break
;
default
:
break
;
}
}
@Override
public
void
onCancel() {
ToastUtil.show(CameraActivity.
this
,
"Animation to 陆家嘴 canceled"
);
}
@Override
public
void
onFinish() {
ToastUtil.show(CameraActivity.
this
,
"Animation to 陆家嘴 complete"
);
}
}
|
设置可视区域边界
在最大可能缩放级别下,移动可视区域保证所有兴趣点都是可见的,这种情况下,就需要设置可视区域边界。例如:显示用户当前位置5公里范围内的所有加油站,您想要移动可视区域保证所有的加油站都可以在屏幕上显示。
使用 CameraUpdateFactory.newLatLngBounds(LatLngBounds bounds, int padding) 获取一个 CameraUpdate 对象,改变可视区域(使用 Projection.getVisibleRegion() 方法可以计算屏幕区域 LatLngBounds 的大小)。注意:地图的方向和倾斜角都应该为0度。
重载方法 CameraUpdateFactory.newLatLngBounds(LatLngBounds bounds, int width, int height, int padding) 允许您指定矩形区域的长和宽(像素为单位)。
说明
1.newLatLngBounds(LatLngBounds bounds, int padding) 方法需要在地图初始化完成之后使用。
2.在 onCreate 时设置可视区域边界,需要使用接口 AMap.OnMapLoadedListener。当地图载入成功后回调 onMapLoaded() 方法。
示例代码如下(详细信息,请参考示例工程“Markers 功能”案例 / com.amapv2.apis.overlay.MarkerActivity.java):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public
class
MarkerActivity
extends
FragmentActivity
implements
OnMapLoadedListener {
/**
* 监听amap地图加载成功事件回调
*/
@Override
public
void
onMapLoaded() {
// 设置所有maker显示在View中
LatLngBounds bounds =
new
LatLngBounds.Builder()
.include(Constants.XIAN).include(Constants.CHENGDU)
.include(marker1).include(marker2).include(marker3)
.include(marker4).include(marker5).include(marker6)
.include(marker7).include(marker8).include(marker9)
.include(marker10).build();
// 移动地图,所有marker自适应显示。LatLngBounds与地图边缘10像素的填充区域
aMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds,
10
));
}
}
|