Android高德地图集成,实现实时定位以及Marker多点展示和点击事件

最近项目需要集成高德地图api实现定位,多点展示以及marker的点击事件,在学习的过程中同时记录下来。

1.首先就是高德地图Api的集成了,先要到高德地图官网获取SHA1值,以及对应的key值,这个官网描述比较详细,不做赘述,在获取SHA1值时建议使用第三种方式TOOL获取简单准确。

2.jar包和.so的导入:个人建议直接通过Dependencies进行添加,省去因为添加.so等引起的不必要麻烦。3d,search,location;

3.这就做好了准备工作,接下来初始化:

protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_gdmap);
    mapView = findViewById(R.id.view_gdmap);
    mapView.onCreate(savedInstanceState);

    initView();
    initMap();
}

private void initMap(){
    if (aMap == null){
        aMap = mapView.getMap();
        aMap.setLocationSource(this);//设置了定位的监听,这里要实现LocationSource接口
        aMap.getUiSettings().setMyLocationButtonEnabled(true); // 是否显示定位按钮
        aMap.setMyLocationEnabled(true);//显示定位层并且可以触发定位,默认是flase
        aMap.moveCamera(CameraUpdateFactory.zoomTo(15));//设置地图缩放级别
        MyLocationStyle myLocationStyle = new MyLocationStyle();//初始化定位蓝点样式类
        myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE);//连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)如果不设置myLocationType,默认也会执行此种模式。
        myLocationStyle.strokeColor(Color.TRANSPARENT);//设置定位蓝点精度圆圈的边框颜色
        myLocationStyle.radiusFillColor(Color.TRANSPARENT);//设置定位蓝点精度圆圈的填充颜色
        aMap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的Style
        aMap.setOnMarkerClickListener(new AMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(Marker marker) {
                marker.showInfoWindow();
                String number = marker.getId().substring(6);
                if (!number.equals("")&&number!=null){
                int posions = Integer.parseInt(number)-2;}



4.在上面代码中末尾添加了marker的点击事件,首先showInfowindow(),是为了避免添加点击事件后点击marker时原有的title不会显示。另外避免在title中显示position,所以采取获得id之后截取字符串并减去2的方式获得marker点数据集合的position,这样就可以在点击事件中去处理数据和相关的事件;
5.下面是处理定位的一些方法,代码,已经有了比较详细的注解;
@Override
    public void activate(OnLocationChangedListener listener) {
        mListener = listener;
        if (aMapLocationClient == null) {
            //初始化定位
            aMapLocationClient = new AMapLocationClient(this);
            //初始化定位参数
            aMapLocationClientOption = new AMapLocationClientOption();
            //设置定位回调监听
            aMapLocationClient.setLocationListener(this);
            //设置为高精度定位模式
            aMapLocationClientOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
            //设置为定位一次
//            mLocationOption.setOnceLocation(true);
            //设置定位参数
            aMapLocationClient.setLocationOption(aMapLocationClientOption);
          
            aMapLocationClient.startLocation();//启动定位
        }


    }

    @Override
    public void deactivate() {
        mListener = null;
        if (aMapLocationClient != null) {
            aMapLocationClient.stopLocation();
            aMapLocationClient.onDestroy();
        }
        aMapLocationClient = null;

    }

    /**
     * 实现定位
     * @param amapLocation
     */
    @Override
    public void onLocationChanged(AMapLocation amapLocation) {
        if (mListener != null && amapLocation != null) {
            if (amapLocation != null
                    &&amapLocation.getErrorCode() == 0) {
                mListener.onLocationChanged(amapLocation);// 显示系统小蓝点
                String location = "当前地点:"+amapLocation.getProvider()+amapLocation.getCity()+amapLocation.getStreet()+amapLocation.getStreetNum();
              
            } else {
                String errText = "定位失败," + amapLocation.getErrorCode()+ ": " + amapLocation.getErrorInfo();
                
            }
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图
        mapView.onDestroy();
    }
    @Override
    protected void onResume() {
        super.onResume();
        //在activity执行onResume时执行mMapView.onResume (),重新绘制加载地图
        mapView.onResume();
    }
    @Override
    protected void onPause() {
        super.onPause();
        //在activity执行onPause时执行mMapView.onPause (),暂停地图的绘制
        mapView.onPause();
    }
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        //在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),保存地图当前的状态
        mapView.onSaveInstanceState(outState);
    }
6.在最后我们就可以把所有的点根据需求来展示在地图上了,代码中0.1.2.3.4可以根据具体需求添加不同的图标,如酒店,餐馆...
//将POI点以不同颜色的标识展现在高德地图上
private void addmarker(int position,int i){
    MarkerOptions markerOptions = new MarkerOptions();
    markerOptions.position(new LatLng(Double.parseDouble(poiLists.get(position).getY()),Double.parseDouble(poiLists.get(position).getX())));
    markerOptions.draggable(false);
    markerOptions.title(poiLists.get(position).getName() );
    if (i == 0){
        markerOptions.icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.site_0)));
    }else if (i == 1){
        markerOptions.icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.site_1)));
    }else if (i == 2){
        markerOptions.icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.site_2)));
    }else if (i == 3){
        markerOptions.icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.site_3)));
    }else if (i == 4){
        markerOptions.icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.site_4)));
    }
    aMap.addMarker(markerOptions);
}
7.具体的点击事件处理可以在3的点击事件内通过position进行处理哦!
局部图就酱紫:





你可能感兴趣的:(Android高德地图集成,实现实时定位以及Marker多点展示和点击事件)