對於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開發包)
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); } } }
<com.amap.mapapi.map.MapView android:id="@+id/mapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" />