1. 程式人生 > >Android 高德地圖的開發

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=相距多少才聚合
                }
            }
        }

裡面還涉及一些關於路線的就不一一在這裡介紹了。如有需要請下載原始碼
由於時間有限更多的功能會在後面意義新增,敬請期待,如果你有更好的還請不吝賜教。