Android 高德地圖的開發
地圖對我們來說並不陌生,我相信每個使用者的手機上面都會帶有地圖這個軟體的,地圖也是我們日常生活中的一部分。當我們到一個陌生的地方的時候,地圖的作用就尤其明顯。今天我們要說的也是地圖,最近我在研究地圖的一些功能,由於公司的專案裡面使用的第三方為高德的,本人也就研究了一下高德的,研究了幾天,雖然功能沒有想象中的那麼複雜,但是也走了不少彎路。在這裡就給大家先介紹一些簡單的功能。也是大家比較喜歡離不開的一些功能。自定義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(R.id.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(R.id.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, Gravity.TOP, 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=相距多少才聚合
}
}
}
裡面還涉及一些關於路線的就不一一在這裡介紹了。如有需要請下載原始碼
由於時間有限更多的功能會在後面意義新增,敬請期待,如果你有更好的還請不吝賜教。