高德地图sdk android android怎么把所有marker显示在屏幕上

android 高德地图开发 如何多个Marker同时显示多个infowindow
[问题点数:40分]
android 高德地图开发 如何多个Marker同时显示多个infowindow
[问题点数:40分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关推荐:
2013年11月 扩充话题大版内专家分月排行榜第二
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。页面导航:
→ 正文内容 百度地图自定义弹出窗口
android实现百度地图自定义弹出窗口功能
这篇文章主要介绍了android实现百度地图自定义弹出窗口的功能,大家参考使用吧
我们使用百度地图的时候,点击地图上的Marker,会弹出一个该地点详细信息的窗口,如下左图所示,有时候,我们希望自己定义这个弹出窗口的内容,或者,干脆用自己的数据来构造这样的弹出窗口,但是,在百度地图最新的Android SDK中,没有方便操作这种弹出窗口的类,虽然有一个PopupOverlay,但是它只支持将弹出内容转化为不多于三个Bitmap,如果这个弹出窗口里想有按钮来响应点击事件,用这个就不能满足要求了,于是,看了一遍百度地图覆盖物的API,我决定用自定义View的方法来实现类似的效果,先贴一下大体效果图,如下右图:
基本原理就是用ItemizedOverlay来添加附加物,在OnTap方法中向MapView上添加一个自定义的View(如果已存在就直接设为可见),下面具体来介绍我的实现方法:
一、自定义覆盖物类:MyPopupOverlay,这个类是最关键的一个类ItemizedOverlay,用于设置Marker,并定义Marker的点击事件,弹出窗口,至于弹出窗口的内容,则通过定义Listener,放到Activity中去构造。如果没有特殊需求,这个类不需要做什么改动。代码如下,popupLinear这个对象,就是加到地图上的自定义View:
代码如下:public class MyPopupOverlay extends ItemizedOverlay&OverlayItem& {
&&& private Context context =&&& // 这是弹出窗口, 包括内容部分还有下面那个小三角&&& private LinearLayout popupLinear =&&& // 这是弹出窗口的内容部分&&& private View popupView =&&& private MapView mapView =&&& private Projection projection =
&&& // 这是弹出窗口内容部分使用的layoutId,在Activity中设置&&& private int layoutId = 0;&&& // 是否使用百度带有A-J字样的Marker&&& private boolean useDefaultMarker =&&& private int[] defaultMarkerIds = { R.drawable.icon_marka,&&&&&&&&&&& R.drawable.icon_markb, R.drawable.icon_markc,&&&&&&&&&&& R.drawable.icon_markd, R.drawable.icon_marke,&&&&&&&&&&& R.drawable.icon_markf, R.drawable.icon_markg,&&&&&&&&&&& R.drawable.icon_markh, R.drawable.icon_marki,&&&&&&&&&&& R.drawable.icon_markj, };
&&& // 这个Listener用于在Marker被点击时让Activity填充PopupView的内容&&& private OnTapListener onTapListener =
&&& public MyPopupOverlay(Context context, Drawable marker, MapView mMapView) {&&&&&&& super(marker, mMapView);&&&&&&& this.context =&&&&&&& this.popupLinear = new LinearLayout(context);&&&&&&& this.mapView = mMapV&&&&&&& popupLinear.setOrientation(LinearLayout.VERTICAL);&&&&&&& popupLinear.setVisibility(View.GONE);&&&&&&& projection = mapView.getProjection();&&& }
&&& @Override&&& public boolean onTap(GeoPoint pt, MapView mMapView) {&&&&&&& // 点击窗口以外的区域时,当前窗口关闭&&&&&&& if (popupLinear != null && popupLinear.getVisibility() == View.VISIBLE) {&&&&&&&&&&& LayoutParams lp = (LayoutParams) popupLinear.getLayoutParams();&&&&&&&&&&& Point tapP = new Point();&&&&&&&&&&& projection.toPixels(pt, tapP);&&&&&&&&&&& Point popP = new Point();&&&&&&&&&&& projection.toPixels(lp.point, popP);&&&&&&&&&&& int xMin = popP.x - lp.width / 2 + lp.x;&&&&&&&&&&& int yMin = popP.y - lp.height + lp.y;&&&&&&&&&&& int xMax = popP.x + lp.width / 2 + lp.x;&&&&&&&&&&& int yMax = popP.y + lp.y;&&&&&&&&&&& if (tapP.x & xMin || tapP.y & yMin || tapP.x & xMax&&&&&&&&&&&&&&&&&&& || tapP.y & yMax)&&&&&&&&&&&&&&& popupLinear.setVisibility(View.GONE);&&&&&&& }&&&&&&&&&& }
&&& @Override&&& protected boolean onTap(int i) {&&&&&&& // 点击Marker时,该Marker滑动到地图中央偏下的位置,并显示Popup窗口&&&&&&& OverlayItem item = getItem(i);&&&&&&& if (popupView == null) {&&&&&&&&&&& // 如果popupView还没有创建,则构造popupLinear&&&&&&&&&&& if (!createPopupView()){&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&& }&&&&&&& if (onTapListener == null)&&&&&&&&&&&&&&&&&& popupLinear.setVisibility(View.VISIBLE);&&&&&&& onTapListener.onTap(i, popupView);
&&&&&&& popupLinear.measure(0, 0);&&&&&&& int viewWidth = popupLinear.getMeasuredWidth();&&&&&&& int viewHeight = popupLinear.getMeasuredHeight();
&&&&&&& LayoutParams layoutParams = new LayoutParams(viewWidth, viewHeight,&&&&&&&&&&&&&&& item.getPoint(), 0, -60, LayoutParams.BOTTOM_CENTER);&&&&&&& layoutParams.mode = LayoutParams.MODE_MAP;
&&&&&&& popupLinear.setLayoutParams(layoutParams);&&&&&&& Point p = new Point();&&&&&&& projection.toPixels(item.getPoint(), p);&&&&&&& p.y = p.y - viewHeight / 2;&&&&&&& GeoPoint point = projection.fromPixels(p.x, p.y);
&&&&&&& mapView.getController().animateTo(point);&&&&&&&&&& }
&&& private boolean createPopupView() {&&&&&&& // TODO Auto-generated method stub&&&&&&& if (layoutId == 0)&&&&&&&&&&&&&&&&&& popupView = LayoutInflater.from(context).inflate(layoutId, null);&&&&&&& popupView.setBackgroundResource(R.drawable.popupborder);&&&&&&& ImageView dialogStyle = new ImageView(context);&&&&&&& dialogStyle.setImageDrawable(context.getResources().getDrawable(&&&&&&&&&&&&&&& R.drawable.iw_tail));&&&&&&& popupLinear.addView(popupView);&&&&&&& android.widget.LinearLayout.LayoutParams lp = new android.widget.LinearLayout.LayoutParams(&&&&&&&&&&&&&&& LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);&&&&&&& lp.topMargin = -2;&&&&&&& lp.leftMargin = 60;&&&&&&& popupLinear.addView(dialogStyle, lp);&&&&&&& mapView.addView(popupLinear);&&&&&&&&&& }
&&& @Override&&& public void addItem(List&OverlayItem& items) {&&&&&&& // TODO Auto-generated method stub&&&&&&& int startIndex = getAllItem().size();&&&&&&& for (OverlayItem item : items){&&&&&&&&&&& if (startIndex &= defaultMarkerIds.length)&&&&&&&&&&&&&&& startIndex = defaultMarkerIds.length - 1;&&&&&&&&&&& if (useDefaultMarker && item.getMarker() == null){&&&&&&&&&&&&&&& item.setMarker(context.getResources().getDrawable(&&&&&&&&&&&&&&&&&&&&&&& defaultMarkerIds[startIndex++]));&&&&&&&&&&& }&&&&&&& }&&&&&&& super.addItem(items);&&& }
&&& @Override&&& public void addItem(OverlayItem item) {&&&&&&& // TODO Auto-generated method stub&&&&&&& // 重载这两个addItem方法,主要用于设置自己默认的Marker&&&&&&& int index = getAllItem().size();&&&&&&& if (index &= defaultMarkerIds.length)&&&&&&&&&&& index = defaultMarkerIds.length - 1;&&&&&&& if (useDefaultMarker && item.getMarker() == null){&&&&&&&&&&& item.setMarker(context.getResources().getDrawable(&&&&&&&&&&&&&&&&&&& defaultMarkerIds[getAllItem().size()]));&&&&&&& }&&&&&&& super.addItem(item);&&& }
&&& public void setLayoutId(int layoutId) {&&&&&&& this.layoutId = layoutId;&&& }
&&& public void setUseDefaultMarker(boolean useDefaultMarker) {&&&&&&& this.useDefaultMarker = useDefaultM&&& }
&&& public void setOnTapListener(OnTapListener onTapListener) {&&&&&&& this.onTapListener = onTapL&&& }
&&& public interface OnTapListener {&&&&&&& public void onTap(int index, View popupView);&&& }}
二、MainActivity,这是主界面,用来显示地图,创建MyPopupOverlay对象,在使用我写的MyPopupOverlay这个类时,需要遵循以下步骤:
创建MyPopupOverlay对象,构造函数为public MyPopupOverlay(Context context, Drawable marker, MapView mMapView),四个参数分别为当前的上下文、通用的Marker(这是ItemizedOverlay需要的,当不设置Marker时的默认Marker)以及百度地图对象。设置自定义的弹出窗口内容的布局文件ID,使用的方法为public void setLayoutId(int layoutId)。设置是使用自定义的Marker,还是预先写好的带有A-J字样的百度地图原装Marker,使用的方法为public void setUseDefaultMarker(boolean useDefaultMarker),只有当这个值为true且没有调用OverlayItem的setMarker方法为特定点设置Marker时,才使用原装Marker。创建Marker所在的点,即分别创建一个个OverlayItem,然后调用public void addItem(OverlayItem item)或public void addItem(List&OverlayItem& items)方法来把这些OverlayItem添加到自定义的附加层上去。为MyPopupOverlay对象添加onTap事件,当Marker被点击时,填充弹出窗口中的内容(也就是第2条中layoutId布局中的内容),设置方法为public void setOnTapListener(OnTapListener onTapListener),OnTapListener是定义在MyPopupOverlay中的接口,实现这个接口需要覆写public void onTap(int index, View popupView)方法,其中,index表示被点击的Marker(确切地说是OverlayItem)的索引,popupView是使用layoutId这个布局的View,也就是弹出窗口除了下面的小三角之外的部分。把这个MyPopupOverlay对象添加到地图上去:mMapView.getOverlays().add(myOverlay);mMapView.refresh();下面是我的代码(MainActivity):
代码如下:public class MainActivity extends Activity {
&&& private BMapManager mBMapMan =&&& private MapView mMapView =&&& private String keyString = "这里填入申请的KEY";
&&& @Override&&& protected void onCreate(Bundle savedInstanceState) {&&&&&&& // TODO Auto-generated method stub&&&&&&& super.onCreate(savedInstanceState);
&&&&&&& mBMapMan = new BMapManager(getApplication());&&&&&&& mBMapMan.init(keyString, new MKGeneralHandler(MainActivity.this));//MKGeralHandler是一个实现MKGeneralListener接口的类,详见百度的文档
&&&&&&& setContentView(R.layout.activity_main);// activity_main.xml中就是百度地图官方文档提供的LinearLayout下面放一个MapView的布局&&&&&&& mMapView = (MapView) findViewById(R.id.bmapsView);// 获取地图MapView对象&&&&&&& mMapView.setBuiltInZoomControls(true);&&&&&&& final MapController mMapController = mMapView.getController();&&&&&&& mMapController.setZoom(16);&&&&&&& GeoPoint p1 = new GeoPoint(7183652);// 天大正门的坐标&&&&&&& GeoPoint p2 = new GeoPoint(7178252);// 天大大活的坐标&&&&&&& mMapController.animateTo(p1);
&&&&&&& //声明MyPopupOverlay对象&&&&&&& MyPopupOverlay myOverlay = new MyPopupOverlay(&&&&&&&&&&&&&&& MainActivity.this,&&&&&&&&&&&&&&& getResources().getDrawable(R.drawable.icon_gcoding),&&&&&&&&&&&&&&& mMapView);// 这是第1步,创建MyPopupOverlay对象&&&&&&& myOverlay.setLayoutId(R.layout.popup_content);// 这是第2步,设置弹出窗口的布局文件&&&&&&& myOverlay.setUseDefaultMarker(true);// 这是第3步,设置是否使用A-J的Marker&&&&&&& OverlayItem item1 = new OverlayItem(p1, "", "");&&&&&&& OverlayItem item2 = new OverlayItem(p2, "", "");&&&&&&& List&OverlayItem& items = new ArrayList&OverlayItem&();&&&&&&& items.add(item1);&&&&&&& items.add(item2);&&&&&&& myOverlay.addItem(items);// 这是第4步,向MyPopupOverlay中依次添加OverlayItem对象,或存到链表中一次性添加//&&&&&&& myOverlay.addItem(item2);&&&&&&& final List&MapPopupItem& mItems = new ArrayList&MapPopupItem&();// 这是暂时自己造的model对象,存储显示的数据&&&&&&& MapPopupItem mItem = new MapPopupItem();&&&&&&& mItem.setTitle("天津大学");&&&&&&& // ...... 这里依次添加了地址、电话、标签、图片等信息&&&&&&& mItems.add(mItem);&&&&&&& mItem = new MapPopupItem();&&&&&&& mItem.setTitle("天津大学大学生活动中心");&&&&&&& // ...... 同样添加第二个点的地址、电话、标签、图片信息&&&&&&& mItems.add(mItem);&&&&&&& myOverlay.setOnTapListener(new OnTapListener() {&&&&&&&&&&& @Override&&&&&&&&&&& public void onTap(int index, View popupView) {// 这是第5步,设置监听器,为popupView填充数据&&&&&&&&&&&&&&& // TODO Auto-generated method stub&&&&&&&&&&&&&&& MapPopupItem mItem = mItems.get(index);// 这是存储model数据的数组,根据被点击的点的index获取具体对象&&&&&&&&&&&&&&& TextView shopName = (TextView) popupView.findViewById(R.id.name);&&&&&&&&&&&&&&& // ...... 依次获得视图中的各个控件(地址、电话、标签、图片等)&&&&&&&&&&&&&&& shopName.setText(mItem.getTitle());&&&&&&&&&&&&&&& // ...... 依次为这些控件赋上值(地址、电话、标签、图片等信息)&&&&&&&&&&& }&&&&&&& });&&&&&&& mMapView.getOverlays().add(myOverlay); // 最后一步,添加覆盖物层&&&&&&& mMapView.refresh();&&& }
&&& @Override&&& protected void onDestroy() {&&&&&&& mMapView.destroy();&&&&&&& if (mBMapMan != null) {&&&&&&&&&&& mBMapMan.destroy();&&&&&&&&&&& mBMapMan =&&&&&&& }&&&&&&& super.onDestroy();&&& }
&&& @Override&&& protected void onPause() {&&&&&&& mMapView.onPause();&&&&&&& if (mBMapMan != null) {&&&&&&&&&&& mBMapMan.stop();&&&&&&& }&&&&&&& super.onPause();&&& }
&&& @Override&&& protected void onResume() {&&&&&&& mMapView.onResume();&&&&&&& if (mBMapMan != null) {&&&&&&&&&&& mBMapMan.start();&&&&&&& }
&&&&&&& super.onResume();&&& }}
这就是主要的思路和代码了,因为代码文件、资源文件弄得比较多,不大容易贴出来全部能直接运行的代码,而且布局文件里控件太多也不容易理解,就这么写了,如果大家有什么更好的方法,或者有什么好的建议,欢迎讨论和指正。
注:为了说明问题,主类中我简化了很多东西,而且有些图片找起来也挺麻烦,把源代码附在这里供大家参考,运行前需要在MainActivity中修改百度地图的Key。
您可能感兴趣的文章:
上一篇:下一篇:
最 近 更 新
热 点 排 行
12345678910您目前的活力值不够下载该资源哦~~
怎么样快速获得活力值?
下载此资源将扣除活力值-20
(只在首次下载扣除活力值,之后可以免费下载)
DevStore用户登录
还没有DevStore帐号?
快捷登录:
为了尽快解决大伙儿的问题,请务必要找相对应的客服哦~
DevStore贯穿项目生命周期,解决你的所有问题
Android Map 开发之高德地图
DevStore编辑 夏萌
本文总结的是Android Map 开发之,以下是详细代码及讲解:
如何把 API 添加到我的Android 工程中?
创建工程,将从网站下载的AMap_Android_Api_Lib 文件中的MapApi.jar 包拷贝到Libs 文件夹下,Libs 下的文件目录如下所示:
MapApi.jar
当MapApi.jar在Libs 文件夹中后,就表示将高德地图Android API库文件引入工程中了,您就可以在您的程序中使用高德地图API 了。
在manifest 中设置相应的权限
下面介绍在程序开发中需注意的问题:必须在AndroidManifest.xml 中设置相应的权限,添加代码如下:
&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&
注意此添加权限代码与&application&同级。
栅格地图显示
MapActivity是一个抽象类,任何想要显示MapView 的activity 都需要派生自MapActivity。并且在其派生类的onCreate() 中,都要创建一个MapView 实例。
public&class&GridMapView&extends&MapActivity{&&
private&MapView&mMapV&&
private&MapController&mMapC&&
private&GeoPoint&&&
@Override&&
*显示栅格地图,启用内置缩放控件,并用MapController&控制地图的中心点及Zoom&级别&&&
protected&void&onCreate(Bundle&&savedInstanceState)&{&&
//&TODO&Auto-generated&method&stub&&
super.onCreate(savedInstanceState);&&
setContentView(R.layout.mapview);&//布局文件夹&res/layout/mapview.xml&文件。&&
mMapView&=&(MapView)&&findViewById(R.id.mapView);&&
mMapView.setBuiltInZoomControls(true);&&//设置启用内置的缩放控件&&&
mMapController&=&&mMapView.getController();&&//&得到mMapView&的控制权,可以用它控制和驱动平移和缩放&&&
point&=&new&GeoPoint((int)&(39.982378&*&&1E6),&&
(int)&(116.304923&*&1E6));&&//用给定的经纬度构造一个GeoPoint,单位是微度(度*&1E6)&&
mMapController.setCenter(point);&&//设置地图中心点&&&
mMapController.setZoom(12);&&&&//设置地图zoom&级别&&&
在布局文件夹 res/layout/mapview.xml 文件中添加地图控件代码如下:
&?xml&version="1.0"&encoding="utf-8"?&&&
&LinearLayout&xmlns:android="/apk/res/android"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
xmlns:autonavi="/apk/res/com.AMap"&&
android:orientation="vertical"&android:layout_width="fill_parent"&&
android:layout_height="fill_parent"&&&
&com.amap.mapapi.map.MapView&android:id="@+id/mapView"&&
android:layout_width="fill_parent"&android:layout_height="fill_parent"&&&
android:clickable="true"&&&&&
&/LinearLayout&
结果见图3-1 栅格地图显示效果图:
图3-1 栅格地图显示效果图
具体示例请查看参考示例 MapView 中的 GridMapView。
矢量地图显示
将libminimapv320.so 复制到工程目录下的libs\armeabi,目录结构见图3-2&
图3-2 工程目录结构图
代码如下:
protected&void&onCreate(Bundle&savedInstanceState)&{&&
super.onCreate(savedInstanceState);&&
&&&&&&&&setContentView(R.layout.vmapview);&&
&&&&&&&&mMapView&=&(MapView)&findViewById(R.id.vmapView);&&
&&&&&&&&mMapView.setVectorMap(true);//设置地图为矢量模式&&
&&&&&&&&mMapView.setBuiltInZoomControls(true);&&//设置启用内置的缩放控件&&
&&&&&&&&mMapController&=&mMapView.getController();&&//&得到mMapView的控制权,可以用它控制和驱动平移和缩放&&
&&&&&&&&point&=&new&GeoPoint((int)&(39.90923&*&1E6),&&
&&&&&&&&&&&&&&&&(int)&(116.397428&*&1E6));&&//用给定的经纬度构造一个GeoPoint,单位是微度&(度&*&1E6)&&
&&&&&&&&mMapController.setCenter(point);&&//设置地图中心点&&
&&&&&&&&mMapController.setZoom(12);&&&&//设置地图zoom级别&&&&&&&
结果见图3-3
图3-3 矢量地图显示效果图
具体示例请查看参考示例MapView 中的VectorMapView。
地图覆盖物
所有叠加或覆盖到地图的内容,统称为地图覆盖物。如标注、矢量图形元素((包括:折线和多边形和圆))、定位图标等。覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会相应的移动。
Android API 提供了如下几种覆盖物:
Overlay:覆盖物的抽象基类,所有的覆盖物均继承此类的方法,实现用户自定义图层显示。
MyLocationOverlay:一个负责显示用户当前位置的Overlay。
ItemizedOverlay:Overlay 的一个基类,包含了一个OverlayItem 列表,相当于一组分条的Overlay,通过继承此类,将一组兴趣点显示在地图上。
PoiOverlay:本地搜索图层,提供某一特定地区的位置搜索服务,比如在北京市搜索“天安门”,通过此图层将包含“天安门”关键字的标注显示在地图上。
RouteOverlay:公交,驾车导航线路图层,将公交、驾车出行方案的路线及关键点显示在地图上。
覆盖物的抽象基类(Overlay)
一般来说,在MapView 中添加一个Overlay 需要经过以下步骤:
自定义类继承Overlay,并Override 其draw()方法可以实现点,线,面等的显示,如果需要点击、按键、触摸等交互操作,还需OverrideonTap()等方法。
添加到MapView 的覆盖物中:
publicclass&MyOverlay&extends&Overlay{&&
@Override&&
public&void&draw(Canvas&canvas,&MapView&mapView,&boolean&shadow)&{&&
&//&TODO&Auto-generated&method&stub&&
&super.draw(canvas,&mapView,&shadow);&&
Point&screenPts&=&new&Point();&&
mapView.getProjection().toPixels(point,&screenPts);&&
//---add&the&marker---&&
Bitmap&bmp&=&BitmapFactory.decodeResource(&&
getResources(),&R.drawable.da_marker_red);&&&&&&&&&&&&&&
canvas.drawBitmap(bmp,&screenPts.x,&screenPts.y-50,&null);&&&&
Paint&paintText&=&new&Paint();&&
paintText.setTextSize(18);&&
paintText.setColor(Color.BLACK);&&
canvas.drawText("★AMap",&screenPts.x,&screenPts.y,&paintText);&//&绘制文本&&
Paint&mCirclePaint&=&new&Paint();&&
mCirclePaint.setAntiAlias(true);&&
mCirclePaint.setColor(Color.BLUE);&&
mCirclePaint.setAlpha(50);&&
mCirclePaint.setStyle(Style.FILL);&&
canvas.drawCircle(screenPts.x+150,&screenPts.y,&50,&mCirclePaint);&&
Paint&paintLine&=&new&Paint();&&
paintLine.setColor(Color.RED);&&
paintLine.setStrokeWidth(3.0f);&&
paintLine.setStyle(Paint.Style.STROKE);&&
canvas.drawLine(screenPts.x-100,&screenPts.y,&screenPts.x,&screenPts.y-200,&paintLine);&&
@Override&&
public&boolean&onTap(GeoPoint&arg0,&MapView&arg1)&{&&
//&TODO&Auto-generated&method&stub&&
return&super.onTap(arg0,&arg1);&&
添加到MapView 的覆盖物中:
mMapView.getOverlays().add(new&MyOverlay());
运行结果见图 6-1 覆盖物效果图:
当前位置(MyLocationOverlay)
将MyLocationOverlay添加到覆盖物中,能够实现在地图上显示当前位置的图标以及指南针:
MyLocationOverlay&mylocTest&=&new&MyLocationOverlay(MylocationDemo.this,&map);&&
mylocTest.enableMyLocation();&&
mylocTest.enableCompass();&//&打开指南针&&
map.getOverlays().add(mylocTest);
运行结果 见图 6-2 当前位置效果图:
图6-2 当前位置效果图
分条目覆盖物(ItemizedOverlay)
某个类型的覆盖物,包含多个类型相同、显示方式相同、处理方式相同的项时,使用此类:自定义类继承ItemizedOverlay,并Override其draw() 方法,如果需要点击、按键、触摸等交互操作,还需OverrideonTap() 等方法。
class&OverItemT&extends&ItemizedOverlay&overlayitem&&{&&
private&List&overlayitem&&GeoList&=&new&ArrayList&overlayitem&();&&
private&Drawable&&&
private&Context&mC&&
private&double&mLat1&=&39.9022;&//&point1&纬度&&
private&double&mLon1&=&116.3922;&//&point1&经度&&
private&double&mLat2&=&39.607723;&&
private&double&mLon2&=&116.397741;&&
private&double&mLat3&=&39.917723;&&
private&double&mLon3&=&116.6552;&&
public&OverItemT(Drawable&marker,&Context&context)&{&&
super(boundCenterBottom(marker));&&
this.marker&=&&&
this.mContext&=&&&
//&用给定的经纬度构造GeoPoint,单位是微度(度*&1E6)&&
GeoPoint&p1&=&new&GeoPoint((int)&(mLat1&*&1E6),&(int)&(mLon1&*&1E6));&&
GeoPoint&p2&=&new&GeoPoint((int)&(mLat2&*&1E6),&(int)&(mLon2&*&1E6));&&
GeoPoint&p3&=&new&GeoPoint((int)&(mLat3&*&1E6),&(int)&(mLon3&*&1E6));&&
//&构造OverlayItem&的三个参数依次为:item&的位置,标题文本,文字片段&&
GeoList.add(new&OverlayItem(p1,&"P1",&"point1"));&&
GeoList.add(new&OverlayItem(p2,&"P2",&"point2"));&&
GeoList.add(new&OverlayItem(p3,&"P3",&"point3"));&&
populate();&&//createItem(int)方法构造item。一旦有了数据,在调用其它方法前,首先调用这个方法&&
@Override&&
public&void&draw(Canvas&canvas,&MapView&mapView,&boolean&shadow)&{&&
//&Projection&接口用于屏幕像素点坐标系统和地球表面经纬度点坐标系统之间的变换&&
Projection&projection&=&mapView.getProjection();&&&
for&(int&index&=&size()&-1;&index&&=&0;&index--)&{&//&遍历GeoList&&
OverlayItem&overLayItem&=&getItem(index);&//&得到给定索引的item&&
String&title=&overLayItem.getTitle();&&
//&把经纬度变换到相对于MapView&左上角的屏幕像素坐标&&
Point&point&=&projection.toPixels(overLayItem.getPoint(),&null);&&&
&//&可在此处添加您的绘制代码&&
Paint&paintText&=&new&Paint();&&
paintText.setColor(Color.BLACK);&&
paintText.setTextSize(15);&&
canvas.drawText(title,&point.x-30,&point.y&-25,&paintText);&//&绘制文本&&
super.draw(canvas,&mapView,&shadow);&&
//调整一个drawable&边界,使得(0,0)是这个drawable&底部最后一行中心的一个像素&&
&boundCenterBottom(marker);&&
&@Override&&
protected&OverlayItem&createItem(int&i)&{&&
&//&TODO&Auto-generated&method&stub&&
return&GeoList.get(i);&&
@Override&&
public&int&size()&{&&
&//&TODO&Auto-generated&method&stub&&
return&GeoList.size();&&
&@Override&&
//&处理当点击事件&&
&protected&boolean&onTap(int&i)&{&&
&setFocus(GeoList.get(i));&&
Toast.makeText(this.mContext,&GeoList.get(i).getSnippet(),&&
Toast.LENGTH_SHORT).show();&&
@Override&&
public&boolean&onTap(GeoPoint&point,&MapView&mapView)&{&&
//&TODO&Auto-generated&method&stub&&
return&super.onTap(point,&mapView);&&
添加到MapView 的覆盖物中:
Drawable&marker&=&getResources().getDrawable(R.drawable.da_marker_red);&&//得到需要标在地图上的资源&&
marker.setBounds(0,&0,&marker.getIntrinsicWidth(),&marker&&
.getIntrinsicHeight());&&&//为maker&定义位置和边界&&
&mMapView.getOverlays().add(new&OverItemT(marker,&this));&//添加ItemizedOverlay&实例到mMapView
点击其中一个图标,运行结果见图6-3 分条目覆盖效果图:
图6-3 分条目覆盖效果图
本地搜索覆盖物(PoiOverlay)
请参见PoiSearch 及PoiOverlay 的类参考。
驾车、公交路线覆盖物(RouteOverlay)
请参见驾车路线搜索及RouteOverlay 和公交路线搜索及RouteOverlay 的类参考。
已收藏 取消
夏萌 DevStore编辑
简介:姑娘有春天,也有夏天
可能喜欢的文章
开发者交流群:
运营交流群:
产品交流群:
深圳尺子科技有限公司
深圳市南山区蛇口网谷万海大厦C栋504
Copyright (C) 2015 DevStore. All Rights Reserved

我要回帖

更多关于 android 高德地图demo 的文章

 

随机推荐