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

<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();

    }

到这里,定位的功能是实现了。过了很久才来写,忘得差不多了。。。。。。。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值