Android google map自定义图层
????? 在以前的电子商务项目中,需要在google地图中比较符合用户条件的酒店的位置以及添加相关的说明图层,只是调用google的js实现即可,现在在android开发中可以使用google 的android api实现。
?
?

?
?
package com.easyway.android.ui;import java.util.List;import android.graphics.drawable.Drawable;import android.os.Bundle;import com.google.android.maps.GeoPoint;import com.google.android.maps.MapActivity;import com.google.android.maps.MapController;import com.google.android.maps.MapView;import com.google.android.maps.Overlay;import com.google.android.maps.OverlayItem;/** * 实现Google 地图中带自定义的图层的方法 * 1. * @author longgangbai * */public class CustomItemizedOverlayActivity extends MapActivity { private MapView mapView; private MapController mapController ; /** * */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //设置布局 setContentView(R.layout.main); //获取google地图对象 mapView = (MapView) findViewById(R.id.mapView); //设置可以缩放的功能 mapView.setBuiltInZoomControls(true); //获取所有的图层 List<Overlay> mapOverlays = mapView.getOverlays(); //获取图片 Drawable drawable = this.getResources().getDrawable(R.drawable.gps); //获取图表 CustomItemizedOverlay itemizedOverlay = new CustomItemizedOverlay(drawable, this); //北京的中心是北纬39度54分26.37秒,东经116度23分29.22秒。国旗基座的位置是北纬39度54分19.97秒,东经116度23分29.34秒。人民英雄纪念碑的位置是北纬39度54分11.40秒,东经116度23分29.88秒 //设置经纬度 GeoPoint point= new GeoPoint(39971036, 116314659); //创建图层项 OverlayItem overlayitem = new OverlayItem(point, "Hello", "Welcome to beijing's TianAnMen !"); //添加一个图层项 itemizedOverlay.addOverlay(overlayitem); mapOverlays.add(itemizedOverlay); //添加图层项目 mapController = mapView.getController(); //定位到所要的经纬度 mapController.animateTo(point); //以此经纬度为中心 mapController.setCenter(point); mapController.setZoom(6); } @Override protected boolean isRouteDisplayed() { return true; } }?
?
package com.easyway.android.ui;import java.util.ArrayList;import android.app.AlertDialog;import android.content.Context;import android.graphics.drawable.Drawable;import com.google.android.maps.ItemizedOverlay;import com.google.android.maps.OverlayItem;/** * * 自定义地图的图层 * 我们需要为地图多增加一些自定义的功能,比如可以在地图上进行一些标注。 * 为了实现这样的功能,我们可以继承Overlay这个类,这个类是一个基类,提供了 * 可以在地图上添加图层的基本功能。而另外的选择是,我们可以继承itemzedOverlay这个类, * 需要在构造函数中使用Drawable类,这将被用作来绘制一个标记。 * 此外,我们使用ArrayList * 去保存所有的Overlayitems,而createitem和size方法则容易理解了, * 分别是返回每一个 * Overlayitem和返回目前的所有标记的数目。而onTap方法则是在当某个标记在地图上真正标注时 * 所触发的,比如当在触摸屏上点击时,也可以触发该事件。 * * 在这个例子中,我们只是通过弹出对 * 话框的方法展示给用户看。最后,在addOverlay方法中,我们向标记数组mapOverlays中增加 * 一个overlayitem标记,并且调用populate方法将其展示出来。 * * @author longgangbai * */public class CustomItemizedOverlay extends ItemizedOverlay<OverlayItem> { private ArrayList<OverlayItem> mapOverlays = new ArrayList<OverlayItem>(); private Context context; public CustomItemizedOverlay(Drawable defaultMarker) { super(boundCenterBottom(defaultMarker)); } public CustomItemizedOverlay(Drawable defaultMarker, Context context) { this(defaultMarker); this.context = context; } /** * 获取当前图层 */ @Override protected OverlayItem createItem(int i) { return mapOverlays.get(i); } /** * 获取当前图层个数 */ @Override public int size() { return mapOverlays.size(); } /** * 获取当前图层的提示 */ @Override protected boolean onTap(int index) { OverlayItem item = mapOverlays.get(index); AlertDialog.Builder dialog = new AlertDialog.Builder(context); dialog.setTitle(item.getTitle()); dialog.setMessage(item.getSnippet()); dialog.show(); return true; } /** * 添加图层的方法 * @param overlay */ public void addOverlay(OverlayItem overlay) { mapOverlays.add(overlay); this.populate(); }}?
?
?
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.easyway.android.ui" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" /> <!-- 添加访问权限 --> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <!-- 添加google map 的类库 --> <uses-library android:name="com.google.android.maps" /> <activity android:label="@string/app_name" android:name=".CustomItemizedOverlayActivity" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>
?
?
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <com.google.android.maps.MapView android:id="@+id/mapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:enabled="true" android:clickable="true" android:apiKey="0S3Q4ZaVtVDhibBF6eIGl30D9JDmXVdvP4sQvnQ" /> </LinearLayout>
?