Android 高德地图的开发

地图对我们来说并不陌生,我相信每个用户的手机上面都会带有地图这个软件的,地图也是我们日常生活中的一部分。当我们到一个陌生的地方的时候,地图的作用就尤其明显。今天我们要说的也是地图,最近我在研究地图的一些功能,由于公司的项目里面使用的第三方为高德的,本人也就研究了一下高德的,研究了几天,虽然功能没有想象中的那么复杂,但是也走了不少弯路。在这里就给大家先介绍一些简单的功能。也是大家比较喜欢离不开的一些功能。自定义Marker很简单,但是有时候为了能够更好地展示一些效果,可能需要加载一些网络上图片,也就是后台返回给我们的图片。刚开始我以为很简单,不就是加载一个图片吗。于是就尝试了一下,没想到的是图片居然没有显示出来。经过一些查询发现,可能是图片加载需要一些时间,这就会造成图片来不及加载出来显示在地图上面。然而当我使用图片加载的监听事件,当图片加载完成再添加到地图上面,一切就解决了。
具体实现的部分代码如下
这里写图片描述这里写图片描述这里写图片描述

ImageLoader.getInstance().loadImage(urlList.get(i),
                        new SimpleImageLoadingListener() {
                            @Override
                            public void onLoadingComplete(String imageUri,
                                    View view2, Bitmap loadedImage) {
                                super.onLoadingComplete(imageUri, view2,
                                        loadedImage);

                                LatLng latLng = new LatLng(l.latitude,
                                        l.longitude);
                                View view = LayoutInflater.from(
                                        ImageMarkerAty.this).inflate(
                                        R.layout.marker, null);
                                RoundImageView imageView = (RoundImageView) view
                                        .findViewById(R.id.iv);
                                imageView.setImageBitmap(loadedImage);
                                mark.position(latLng);
                                mark.icon(BitmapDescriptorFactory
                                        .fromView(view));
                                aMap.addMarker(mark);

                            }
                        });

下面再说一下关于Marker固定移动地图来实现地位功能,这里面我给他添加了一个popwindow,用来显示当前地位的位置信息。popwindow其实很简单,就是自定义一些布局而已,显示的位置就是根据地图的中心然后测量一下中心Marker的在地图上面的位置(不是我们所说的地理位置而是在布局中的位置)下面就先把popwindow的设置代码展现给大家

View popupWindow_view = getLayoutInflater().inflate(
                R.layout.pop_scroll, null, false);
        TextView tv_pop_title = (TextView) popupWindow_view
                .findViewById(R.id.tv_pop_title);
        int screenWidth = ScreenUtils.getScreenWidth(this);
        popupWindow = new PopupWindow(popupWindow_view,
                (int) (screenWidth * 0.6), LayoutParams.WRAP_CONTENT, true);
        popupWindow.setTouchable(true);
        popupWindow.setFocusable(true);
        popupWindow.setBackgroundDrawable(new BitmapDrawable());
        // 设置动画效果
        // popupWindow.setAnimationStyle(R.style.PopupWindowAnimStyle);
        popupWindow.showAtLocation(tv_center, Gravity.TOP, 0,
                tv_center.getTop()-165);
        tv_pop_title.setText("我的位置:" + content);

由于关于marker的固定其实就是把Marker固定在地图的中间,当用手指滑动地图的时候你会发现地图在移动,而Marker确实固定在那里。实现起来很简单,就是获取到地图的中心点设置给marker的位置代码为centerMarker.setPositionByPixels(mapView.getWidth() / 2,mapView.getHeight() / 2);当地图移动的时候会有监听地图移动的,然后当地图移动发生时,Marker的位置也会发生变化,怎么办?很简单就是再次把Marker的位置设置为地图的中心位置,实现代码如下:

@Override
    public void onLocationChanged(AMapLocation aMapLocation) {
        if (aMapLocation != null
                && aMapLocation.getAMapException().getErrorCode() == 0) {
            if (listener != null) {
                listener.onLocationChanged(aMapLocation);// 显示系统小蓝点
            }
            myLocation = new LatLng(aMapLocation.getLatitude(),
                    aMapLocation.getLongitude());
            fixedMarker();
        }
    }

    private void fixedMarker() {
        MarkerOptions centerMarkerOption = new MarkerOptions().position(
                myLocation).icon(chooseDescripter);
        centerMarker = aMap.addMarker(centerMarkerOption);
        centerMarker.setPositionByPixels(mapView.getWidth() / 2,
                mapView.getHeight() / 2);
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                CameraUpdate update = CameraUpdateFactory.zoomTo(17f);
                aMap.animateCamera(update, 1000, new AMap.CancelableCallback() {
                    @Override
                    public void onFinish() {
                        aMap.setOnCameraChangeListener(MarkerFixedAty.this);
                    }

                    @Override
                    public void onCancel() {
                    }
                });
            }
        }, 1000);
    }

关于多点聚合就是根据显示地图的缩放来显示Marker在本区域的数量,随着地图的放大Marker的数量增加,当地图缩小的时候Marker是不能重叠的,就需要进行聚合就是把两个Marker何为一个并显示出此位置的Marker数量为2,当然更多的时候显示的数量就不是2了。

// 自定义的聚合类MyMarkerCluster
        ArrayList<MarkerImageView> clustersMarker = new ArrayList<MarkerImageView>();
        for (MarkerOptions mp : markerOptionsListInView) {
            if (clustersMarker.size() == 0) {
                // 添加一个新的自定义marker
                clustersMarker.add(new MarkerImageView(
                        PointAggregationAty.this, mp, projection, 80));// 80=相距多少才聚合
            } else {
                boolean isIn = false;
                for (MarkerImageView cluster : clustersMarker) {
                    // 判断当前的marker是否在前面marker的聚合范围内 并且每个marker只会聚合一次。
                    if (cluster.getBounds().contains(mp.getPosition())) {
                        cluster.addMarker(mp);
                        isIn = true;
                        break;
                    }
                }
                // 如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较
                if (!isIn) {
                    clustersMarker.add(new MarkerImageView(
                            PointAggregationAty.this, mp, projection, 80));// 80=相距多少才聚合
                }
            }
        }

里面还涉及一些关于路线的就不一一在这里介绍了。如有需要请下载源码
由于时间有限更多的功能会在后面意义添加,敬请期待,如果你有更好的还请不吝赐教。

Github 下载地址

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值