Android Map Api 使用和开发(2) 定位我的位置、地图弹出泡泡、通过经纬度获取地址

(全部源码地址:http://download.csdn.net/detail/totogo2010/4335701  ) 

 上篇把界面画出来了, 接下来就是显示里面的功能了,那这篇内容就比较丰富了。

主要有这么几道菜:

1、在地图上弹出泡泡显示信息,并且能相应泡泡的点击时间

2、自动定位当前位置(也就是我的位置) --添加了 GPS定位和基站定位。

3、获取经纬度对应的接到地址名称

 

那下面就开始代码把,理论知识能讲多少是多少。

一 、 地图弹出泡泡的制作

 

1 、overlay_popup.xml  直接把layout放出来

 

 

还有泡泡的效果图 ,很多同学做项目都是时间很紧张的,别人贴出来代码都觉得不够直观,有截图是王道,

顺应大部分懒人的习惯,我编截图边发:

 

 

  

看到了吧, 泡泡上有title ,有 desc ,还有一个小icon。我把整个layout 设置成:

android:clickable="true" android:focusable="true"

这样这个layout就相当余一个button了,可以点击。

2、那代码怎么实现呢? FzMapActivity里加入下面代码

 

在进入主界面是 初始化一下view。

private View popView;当然这个变量定义也不能少。

3、自定义 itemizedOverlay     MyItemizedOverlay

好把,先把代码放出来,光描述怎么写太费劲了。

 

主要是继承  OnFocusChangeListener  监听地图层的变化, 为了方便监听button事件也继承了OnClickListener。

下面这方法监听这个层改变的时间,把泡泡弹出来。 

public void onFocusChanged(ItemizedOverlay overlay, OverlayItem newFocus) {

Log.d(TAG , "item focus changed!");

if (null != newFocus) {

Log.d(TAG , "centerY : " + itemDrawable.getBounds().centerY() + "; centerX :" + itemDrawable.getBounds().centerX());

Log.d(TAG , " height : " + itemDrawable.getBounds().height());

MapView.LayoutParams params = (MapView.LayoutParams) mPopView.getLayoutParams();

params.x = this.layout_x;//Y轴偏移

params.y = this.layout_y;//Y轴偏移

point = newFocus.getPoint();

params.point = point;

mMapCtrl.animateTo(point);

TextView title_TextView = (TextView) mPopView.findViewById(R.id.map_bubbleTitle);

title_TextView.setText(newFocus.getTitle());

TextView desc_TextView = (TextView) mPopView.findViewById(R.id.map_bubbleText);

if(null == newFocus.getSnippet() || "".equals(newFocus.getSnippet())){

desc_TextView.setVisibility(View.GONE);

}else{

desc = newFocus.getSnippet();

desc_TextView.setText(desc);

desc_TextView.setVisibility(View.VISIBLE);

}

RelativeLayout button = (RelativeLayout) mPopView.findViewById(R.id.map_bubblebtn);

button.setOnClickListener(this);

mMapView.updateViewLayout(mPopView, params);

mPopView.setVisibility(View.VISIBLE);

selectItem = newFocus;

}

 

}

 

二、长按地图获取地图位置并弹出泡泡显示信息


它的继承关系  LongPressOverlay extends Overlay implements OnDoubleTapListener

LongPressOverlay这个层主要是用来接收长按事件 和双击地图界面的

 

 

 @Override

public void onLongPress(MotionEvent e) {

mContext.locPoint = mMapView.getProjection().fromPixels((int) e.getX(),

(int) e.getY());

mHandler.sendEmptyMessage(mContext.MSG_VIEW_LONGPRESS);

}接收到长按事件后给主界面发消息,由主界面处理。


三、FzLocationManager 这个类用来做gps,基站定位

 

 

public interface LocationCallBack{

/**

* 当前位置

* @param location 

*/

void onCurrentLocation(Location location);

}

定义一个接口 ,当监听到位置变化时,回调主界面

 

 

 

//locationListener注册监听器到位置服务管理里

 

networkLocationManager.requestLocationUpdates(

LocationManager.NETWORK_PROVIDER, MINTIME, MININSTANCE,

locationListener);

//位置信息变化回调

private void updateLocation(Location location) {

lastLocation = location;

mCallback.onCurrentLocation(location);

}

  

四、主界面逻辑

主界面有

 

部分注释写在代码里了

 

最后再上一张截图,在室内通过基站定位到我的位置:

 

 

  

五、通过经纬度获取地址

这个单独拷贝出来让大家看看。这个方法获取地址有时候获取不到的,google好像对这个接口有限制。说白了就这这个接口不靠谱。

大家可以尝试用别的方法或手段获取地址

我的代码里加了个死循环去获取位置,这样的方案是不可取的,不过暂时用一下看看效果也好。

/**

* 通过经纬度获取地址

* @param point

* @return

*/

private String getLocationAddress(GeoPoint point){

String add = "";

Geocoder geoCoder = new Geocoder(getBaseContext(),

Locale.getDefault());

try {

List<Address> addresses = geoCoder.getFromLocation(

point.getLatitudeE6() / 1E6, point.getLongitudeE6() / 1E6, 1);

Address address = addresses.get(0);

int maxLine = address.getMaxAddressLineIndex();

if(maxLine >= 2){

add =  address.getAddressLine(1) + address.getAddressLine(2);

}else {

add = address.getAddressLine(1);

}

} catch (IOException e) {

add = "";

e.printStackTrace();

}

return add;

}

好了,以上是所有代码,  AndroidManifest.xml 在  (一)里有。

 

 

最后小结

用google的api获取到的位置放到他的地图上是有偏差的,而且偏差还比不小,大家可以观察一下,这个问题没有很好的免费解决方案。

如果有哪位有什么好建议可以发出来,谢谢。

用基站和gps定位,也没有处理那个是更好的定位的问题。

 

欢迎大家提建议

  

 

 

 

  • 0
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 54
    评论
评论 54
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值