您的位置:首页 > 其它

百度地图的使用(2)_实现定位功能

2015-11-29 09:43 507 查看
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">这一次讲的是实现定位功能,实现的功能是一打开地图自动定位到当前位置,点击当前位置会弹出popupwindow显示当前位置的信息。</span>

这是大概的框架:

public abstract class BaseActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
// 在使用 SDK 各组间之前初始化 context 信息,传入 ApplicationContext
SDKInitializer.initialize(getApplicationContext());

initView();

initData();

initEvent();

}

public void initEvent() {

}

public void initData() {

}

public abstract void initView() ;

@Override
protected void onPause() {
pauseView();

super.onPause();
}

public void pauseView() {

}

@Override
protected void onResume() {

resumeView();

super.onResume();
}

public void resumeView() {

}

@Override
protected void onDestroy() {

destroyView();

super.onDestroy();
}

public void destroyView() {

}

@Override
protected void onStop() {
super.onStop();
stopView();
}

public void stopView(){

}

}
之后,创建一个MapActivity继承它:

public void initView() {

setContentView(R.layout.activity_location);

//地图控件
mMapView = (MapView) findViewById(R.id.bmapView);

//初始化定位详细信息窗口
infoView = findViewById(R.id.rl_locationview);

//显示位置的文本框
tv_locationInfo = (TextView) infoView.findViewById(R.id.tv_myLocationInfo);}
@Override
public void initData() {
super.initData();

//让显示位置的视图一开始隐藏
infoView.setVisibility(View.GONE);

// 地图初始化
mBaiduMap = mMapView.getMap();

//设置当前放大的级别为最大
MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.zoomTo(19);
mBaiduMap.setMapStatus(mapStatusUpdate);

//初始化定位
initLocation();
}


真正的定位功能:

/**
*  初始化定位模块
*
*/
private void initLocation() {

// 开启定位图层
mBaiduMap.setMyLocationEnabled(true);

mLocClient = new LocationClient(this);
//设置定位监听
mLocClient.registerLocationListener(myListener);
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); // 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(1000);//设置发起请求的事件为1s
mLocClient.setLocOption(option);
mLocClient.start();

}


设置定位点击监听:

@Override
public void initEvent() {
super.initEvent();

//设置定位监听
setMyLocationListener();
}


/**
*  设置定位监听
*       当点击当前位置的标记时,弹出popupwindow
*/
private void setMyLocationListener() {
//设置定位图标被点击的监听
mBaiduMap.setOnMyLocationClickListener(new BaiduMap.OnMyLocationClickListener() {
@Override
public boolean onMyLocationClick() {

showPopupWindow();

return true;
}
});
}
private void showPopupWindow() {
//通过修改getPopupwindowiView自己去定义想要的视图
View contentView = getPopupWindowView(getDetailAddr());

final PopupWindow popupWindow = new PopupWindow(contentView,
LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT, true);

popupWindow.setTouchable(true);
popupWindow.setOutsideTouchable(true); // 设置是否允许在外点击使其消失

popupWindow.setTouchInterceptor(new View.OnTouchListener() {

@Override
public boolean onTouch(View v, MotionEvent event) {

return false;
// 这里如果返回true的话,touch事件将被拦截
// 拦截后 PopupWindow的onTouchEvent不被调用,这样点击外部区域无法dismiss
}
});

// 如果不设置PopupWindow的背景,无论是点击外部区域还是Back键都无法dismiss poupwindow
popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

// 设置好参数之后再show
popupWindow.showAtLocation(BaseMapActivity.this.findViewById(R.id.main), Gravity.BOTTOM, 0, 0);
//       popupWindow.update();
}
下面是popupwindow的视图,简单用一个textview显示位置:

private View getPopupWindowView(String address) {
// 一个自定义的布局,作为显示的内容
View contentView = LayoutInflater.from(BaseMapActivity.this).inflate(
R.layout.infowindow, null);
textview = ((TextView) contentView.findViewById(R.id.tv_myLocationInfo));
textview.setText("当前的位置正在加载中" );
return contentView;
}


之后是定位监听函数:

/**
* 定位SDK监听函数
*/
public class MyLocationListenner implements BDLocationListener {

@Override
public void onReceiveLocation(BDLocation location) {

// map view 销毁后不在处理新接收的位置
if (location == null || mMapView == null) {
return;
}

MyLocationData mLocData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(100).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();

mBaiduMap.setMyLocationData(mLocData);
if (isFirstLoc) {
isFirstLoc = false;
//获取到精度和纬度
final LatLng ll = new LatLng(location.getLatitude(),
location.getLongitude());
ThreadPoolExecutorProxyFactory.getNormalPoolExecutorProxy().execute(new Runnable() {
@Override
public void run() {
// 进行反Geo搜索
mSearch.reverseGeoCode(new ReverseGeoCodeOption()
.location(ll));
}
});

MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
//更新地图的状态,定位到当前的位置
mBaiduMap.animateMapStatus(u);

}
}

}


这里用到reverseGeoCode,也就是通过经纬度坐标进行查询详细地址,它的查询结果在回调函数中:

所以要在InITData中加上:

GeoCoder mSearch = null;//搜索模块


// 初始化搜索模块
mSearch = GeoCoder.newInstance();

在initEvent中加上:记住要让这个activity实现OnGetGeoCoderResultListener

//设置位置搜索监听
mSearch.setOnGetGeoCodeResultListener(this);
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult)  {
//在这里进行设置当前的位置
//  要显示当前位置的textView,然后
textview.setText("当前的位置是:"+reverseGeoCodeResult.getAddress());

}


最后完成它的生命周期方法:

@Override
public void destroyView() {
super.destroyView();

// 退出时销毁定位
mLocClient.stop();
// 关闭定位图层
mBaiduMap.setMyLocationEnabled(false);

mMapView.onDestroy();
mMapView = null;
}

@Override
public void pauseView() {
super.pauseView();
mMapView.onPause();
}

@Override
public void resumeView() {
super.resumeView();
mMapView.onResume();
}

@Override
public void stopView() {
super.stopView();

}


到这里,定位的功能是实现了。过了很久才来写,忘得差不多了。。。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: