百度地图的使用(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(); }
到这里,定位的功能是实现了。过了很久才来写,忘得差不多了。。。。。。。
相关文章推荐
- postgresql downgrade issue
- JavaScript学习小结(7)之JS RegExp
- linux 在/etc/profile配置完jdk每次都要source
- 原码, 反码, 补码 详解
- Qt学习 之 数据库
- 关于预编译
- 《C++ primer》英文第五版阅读笔记(二十四)——try控制块和异常处理
- 斐波那契数列
- 日经春秋 20151129
- NOIP2015-普及组复赛-第一题-金币
- 将数组A中的内容和数组B中的内容进行交换(数组一样大)
- (NO.00004)iOS实现打砖块游戏(七):关卡类的实现
- (NO.00004)iOS实现打砖块游戏(七):关卡类的实现
- (NO.00004)iOS实现打砖块游戏(七):关卡类的实现
- input输入框点击文字消失
- uiautomator支持中文输入详细教程
- c 的输入输出
- printf 函数的原理以及在单片机上重定向至LCD12832的实现
- 基础知识总结
- 线索二叉树的实现