Android高德地圖開發之Overlay應用

作過Android地圖應用開發的人員都知道,如今流行的地圖框架不外乎是Google,百度以及高德地圖。

對於Google和百度的地圖開發,首先須要得到一個API KEY,而後才能被受權開發應用。而高德地圖則不用這麼麻煩。所以,本篇採用高德地圖來開發一個簡單的DEMO。 java

在開始以前,須要在高德官網上下載相應的jar開發包,下載地址爲:http://api.amap.com/Android/download


首先介紹下Overlay:
Overlay是一個基類,它表示能夠覆蓋在地圖上方顯示的overlay。添加一個overlay時,從這個基類派生出一個子類,建立一個實例,而後把它加入到一個列表中。 這個列表經過調用getOverlays()獲得。 爲了容許用戶觸摸去對齊一個點,子類應當實現Overlay.Snappable接口。
構造方法只有一個,Overlay() --->空構造方法
android

下面利用這兩個方法作一個小小的應用。在地圖上某個點繪製一個圖像。處理點擊事件,彈出一個對話框,顯示點擊的經緯度

具體信息在代碼的註釋裏:

首先是在清單裏添加相應的權限:
git

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
而後是往項目裏添加下載的Map開發包(右鍵項目->properties->Java Build Path->Libraries->Add external Jars->定位到你的Map開發包) 


接下來是核心繼承自MapActivity類的實現類:

package zjut.tsw.overlay;
 
import java.util.List;
 
import android.app.AlertDialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.Toast;
 
import com.amap.mapapi.core.GeoPoint;
import com.amap.mapapi.map.MapActivity;
import com.amap.mapapi.map.MapController;
import com.amap.mapapi.map.MapView;
import com.amap.mapapi.map.Overlay;
import com.amap.mapapi.map.Projection;
 
/**
* 高德地圖示例之Overlay
* 
* @author tsw
* 
*/
public class MainActivity extends MapActivity {
 
private MapView mapView;
 
private MapController mController;
 
 
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
 
mapView = (MapView) findViewById(R.id.mapView); // 獲得MapView對象
 
mapView.setBuiltInZoomControls(true); // 開啓縮放控件
 
mController = mapView.getController(); // 獲取地圖控制對象
 
mController.setZoom(10); // 設置初始縮放級別
 
GeoPoint gp = new GeoPoint((int) (30.227123 * 1E6),
(int) (120.040687 * 1E6)); // 定位到浙工大,左參數爲緯度,右參數爲經度,單位爲微度(1度=10^6微度)
 
mController.setCenter(gp); // 設置爲地圖中心
 
List<Overlay> list = mapView.getOverlays(); // 獲取圖層列表
 
DemoOverlay demo = new DemoOverlay(this); // 新建自定義Overlay
 
list.add(demo); // 往列表添加自定義圖層
}
 
public class DemoOverlay extends Overlay {
 
Context mContext; // 上下文
 
public DemoOverlay() {
super();
}
 
public DemoOverlay(Context c) {
this();
mContext = c;
}
 
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
 
Projection proj = mapView.getProjection(); // 獲取投影對象
Point mPoint = new Point();
GeoPoint gp = new GeoPoint((int) (30.227123 * 1E6),
(int) (120.040687 * 1E6));
proj.toPixels(gp, mPoint); // 將經緯度轉換成手機屏幕上的像素,存儲在Point對象中
Paint mPaint = new Paint();
// mPaint.setColor(Color.RED); //設置爲紅色
Bitmap pic = BitmapFactory.decodeResource(getResources(),
R.drawable.da_marker_red); // 獲得Bitmap對象
 
canvas.drawBitmap(pic, mPoint.x, mPoint.y, mPaint); // 繪圖
super.draw(canvas, mapView, shadow);
}
 
@Override
public boolean onTap(GeoPoint gp, MapView mapView) {
new AlertDialog.Builder(mContext)
.setTitle("詳情信息")
.setMessage(
"當前緯度爲:" + gp.getLatitudeE6() * 1.0 / (1E6)
+ "\n經度爲:" + gp.getLongitudeE6() * 1.0
/ (1E6)).setPositiveButton("肯定", null)
.create().show();
return super.onTap(gp, mapView);
}
 
}
}


佈局文件裏需添加Map標籤:

<com.amap.mapapi.map.MapView
android:id="@+id/mapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />

相關文章
相關標籤/搜索