做过Android地图应用开发的人员都知道,现在流行的地图框架不外乎是Google,百度以及高德地图。
对于Google和百度的地图开发,首先需要获得一个API KEY,然后才能被授权开发应用。而高德地图则不用这么麻烦。因此,本篇采用高德地图来开发一个简单的DEMO。
在开始之前,需要在高德官网上下载相应的jar开发包,下载地址为:http://api.amap.com/Android/download
首先介绍下Overlay:
Overlay是一个基类,它表示可以覆盖在地图上方显示的overlay。添加一个overlay时,从这个基类派生出一个子类,创建一个实例,然后把它加入到一个列表中。 这个列表通过调用getOverlays()
得到。 为了允许用户触摸去对齐一个点,子类应当实现Overlay.Snappable接口。
构造方法只有一个,Overlay() --->空构造方法
关键方法:
draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow)
,负责在地图上绘画
onTap(GeoPoint p, MapView mapView)
处理一个“点击”事件。
下面利用这两个方法做一个小小的应用。在地图上某个点绘制一个图像。处理点击事件,弹出一个对话框,显示点击的经纬度。
具体信息在代码的注释里:
首先是在清单里添加相应的权限:
<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>
接下来是核心继承自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" />
图片资源放在drawable文件夹里.
具体项目源文件在:http://download.csdn.net/detail/czjuttsw/4710762