地图对我们来说并不陌生,我相信每个用户的手机上面都会带有地图这个软件的,地图也是我们日常生活中的一部分。当我们到一个陌生的地方的时候,地图的作用就尤其明显。今天我们要说的也是地图,最近我在研究地图的一些功能,由于公司的项目里面使用的第三方为高德的,本人也就研究了一下高德的,研究了几天,虽然功能没有想象中的那么复杂,但是也走了不少弯路。在这里就给大家先介绍一些简单的功能。也是大家比较喜欢离不开的一些功能。自定义Marker很简单,但是有时候为了能够更好地展示一些效果,可能需要加载一些网络上图片,也就是后台返回给我们的图片。刚开始我以为很简单,不就是加载一个图片吗。于是就尝试了一下,没想到的是图片居然没有显示出来。经过一些查询发现,可能是图片加载需要一些时间,这就会造成图片来不及加载出来显示在地图上面。然而当我使用图片加载的监听事件,当图片加载完成再添加到地图上面,一切就解决了。
具体实现的部分代码如下
ImageLoader.getInstance().loadImage(urlList.get(i),
new SimpleImageLoadingListener() {
@Override
public void onLoadingComplete(String imageUri,
View view2, Bitmap loadedImage) {
super.onLoadingComplete(imageUri, view2,
loadedImage);
LatLng latLng = new LatLng(l.latitude,
l.longitude);
View view = LayoutInflater.from(
ImageMarkerAty.this).inflate(
R.layout.marker, null);
RoundImageView imageView = (RoundImageView) view
.findViewById(.iv);
imageView.setImageBitmap(loadedImage);
mark.position(latLng);
mark.icon(BitmapDescriptorFactory
.fromView(view));
aMap.addMarker(mark);
}
});
下面再说一下关于Marker固定移动地图来实现地位功能,这里面我给他添加了一个popwindow,用来显示当前地位的位置信息。popwindow其实很简单,就是自定义一些布局而已,显示的位置就是根据地图的中心然后测量一下中心Marker的在地图上面的位置(不是我们所说的地理位置而是在布局中的位置)下面就先把popwindow的设置代码展现给大家
View popupWindow_view = getLayoutInflater().inflate(
R.layout.pop_scroll, null, false);
TextView tv_pop_title = (TextView) popupWindow_view
.findViewById(.tv_pop_title);
int screenWidth = ScreenUtils.getScreenWidth(this);
popupWindow = new PopupWindow(popupWindow_view,
(int) (screenWidth * 0.6), LayoutParams.WRAP_CONTENT, true);
popupWindow.setTouchable(true);
popupWindow.setFocusable(true);
popupWindow.setBackgroundDrawable(new BitmapDrawable());
// 设置动画效果
// popupWindow.setAnimationStyle(R.style.PopupWindowAnimStyle);
popupWindow.showAtLocation(tv_center, , 0,
tv_center.getTop()-165);
tv_pop_title.setText("我的位置:" + content);
由于关于marker的固定其实就是把Marker固定在地图的中间,当用手指滑动地图的时候你会发现地图在移动,而Marker确实固定在那里。实现起来很简单,就是获取到地图的中心点设置给marker的位置代码为centerMarker.setPositionByPixels(mapView.getWidth() / 2,mapView.getHeight() / 2);当地图移动的时候会有监听地图移动的,然后当地图移动发生时,Marker的位置也会发生变化,怎么办?很简单就是再次把Marker的位置设置为地图的中心位置,实现代码如下:
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if (aMapLocation != null
&& aMapLocation.getAMapException().getErrorCode() == 0) {
if (listener != null) {
listener.onLocationChanged(aMapLocation);// 显示系统小蓝点
}
myLocation = new LatLng(aMapLocation.getLatitude(),
aMapLocation.getLongitude());
fixedMarker();
}
}
private void fixedMarker() {
MarkerOptions centerMarkerOption = new MarkerOptions().position(
myLocation).icon(chooseDescripter);
centerMarker = aMap.addMarker(centerMarkerOption);
centerMarker.setPositionByPixels(mapView.getWidth() / 2,
mapView.getHeight() / 2);
handler.postDelayed(new Runnable() {
@Override
public void run() {
CameraUpdate update = CameraUpdateFactory.zoomTo(17f);
aMap.animateCamera(update, 1000, new AMap.CancelableCallback() {
@Override
public void onFinish() {
aMap.setOnCameraChangeListener(MarkerFixedAty.this);
}
@Override
public void onCancel() {
}
});
}
}, 1000);
}
关于多点聚合就是根据显示地图的缩放来显示Marker在本区域的数量,随着地图的放大Marker的数量增加,当地图缩小的时候Marker是不能重叠的,就需要进行聚合就是把两个Marker何为一个并显示出此位置的Marker数量为2,当然更多的时候显示的数量就不是2了。
// 自定义的聚合类MyMarkerCluster
ArrayList<MarkerImageView> clustersMarker = new ArrayList<MarkerImageView>();
for (MarkerOptions mp : markerOptionsListInView) {
if (clustersMarker.size() == 0) {
// 添加一个新的自定义marker
clustersMarker.add(new MarkerImageView(
PointAggregationAty.this, mp, projection, 80));// 80=相距多少才聚合
} else {
boolean isIn = false;
for (MarkerImageView cluster : clustersMarker) {
// 判断当前的marker是否在前面marker的聚合范围内 并且每个marker只会聚合一次。
if (cluster.getBounds().contains(mp.getPosition())) {
cluster.addMarker(mp);
isIn = true;
break;
}
}
// 如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较
if (!isIn) {
clustersMarker.add(new MarkerImageView(
PointAggregationAty.this, mp, projection, 80));// 80=相距多少才聚合
}
}
}
里面还涉及一些关于路线的就不一一在这里介绍了。如有需要请下载源码
由于时间有限更多的功能会在后面意义添加,敬请期待,如果你有更好的还请不吝赐教。
Github 下载地址