大型情感類電視連續劇--Android高德之旅(3)地圖交互

總要說兩句

前兩篇講到了地圖的基礎顯示和地圖類型,今天來記錄下高德地圖交互相關的設置。地圖的繪製分很多層,層級的顯示需要根據不同的場景來設置。地圖的觸摸事件也很豐富,有單擊、雙擊、單指拖拽、雙指拖拽、雙指旋轉、雙指縮放等,高德提供了api來設置這些用戶交互。

除了這些設置外,還包含地圖截圖,這也算是用戶交互。好了,廢話不多說,開始今天的Android高德之旅,筒子們,老司機要開車了,上車吧。

(博客中所有的gif都是確定沒問題的,如果在你的瀏覽器中看不了,就把gif下載下來看)

開車

先來看一張圖,這是默認的樣子
這裏寫圖片描述

顯示設置

1、交通圖層

AMap aMap = mapView.getMap();
aMap.setTrafficEnabled(true);

這樣就可以開啓交通圖層,高亮顯示交通線路。
這裏寫圖片描述

2、我的位置圖層

AMap aMap = mapView.getMap();
aMap.setLocationSource(new LocationSource() {
       @Override
        public void activate(OnLocationChangedListener onLocationChangedListener) {
            mListener = onLocationChangedListener;
            if (mlocationClient == null) {
                mlocationClient = new AMapLocationClient(this);
                mLocationOption = new AMapLocationClientOption();

                mlocationClient.setLocationListener(new AMapLocationListener() {
                    @Override
                    public void onLocationChanged(AMapLocation aMapLocation) {
                        if (mListener != null && aMapLocation != null) {
                            if (aMapLocation.getErrorCode() == 0) {
                                mListener.onLocationChanged(aMapLocation);
                            } else {
                                Log.e("TAG", aMapLocation.getErrorCode());
                            }
                        }
                    }
                });
                mLocationOption.setLocationMode(
                AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
                mlocationClient.setLocationOption(mLocationOption);
                mlocationClient.startLocation();
            }
        }

        @Override
        public void deactivate() {
            mListener = null;
            if (mlocationClient != null) {
                mlocationClient.stopLocation();
                mlocationClient.onDestroy();
            }
            mlocationClient = null;
        }
    }); // 設置激活/關閉定位的監聽

aMap.getUiSettings().setMyLocationButtonEnabled(b); //在地圖上標註我的位置
aMap.setMyLocationEnabled(b); //顯示定位層並可觸發定位
aMap.setMyLocationType(AMap.LOCATION_TYPE_MAP_FOLLOW); //總共有三種模式,定位,跟隨和旋轉

這裏寫圖片描述
系統會顯示藍色箭頭,爲您當前所在位置,這個箭頭有三種類型(如上顯示),定位,跟隨和旋轉,下面展示一下旋轉的效果。
這裏寫圖片描述

主要看下activate回調中的最後一行代碼:mlocationClient.startLocation();
此方法爲每隔固定時間會發起一次定位請求,爲了減少電量消耗或網絡流量消耗,
注意設置合適的定位時間的間隔(最小間隔支持爲1000ms),並且在合適時間調用stopLocation()方法來取消定位請求,在定位結束後,在合適的生命週期調用onDestroy()方法。

最小時間間隔設置:

mLocationOption.setInterval(1000);

關於這個,官方文檔寫的是2000,但是看源碼裏寫的是1000。

public AMapLocationClientOption setInterval(long var1) {
   if(var1 < 1000L) {
        var1 = 1000L;
    }
    this.b = var1;
    return this;
}

3、指南針:在左上角顯示

mUiSettings = aMap.getUiSettings();
mUiSettings.setCompassEnabled(true);

這裏寫圖片描述

4、比例尺:在左下角顯示

mUiSettings = aMap.getUiSettings();
mUiSettings.setScaleControlsEnabled(true);

這裏寫圖片描述

5、縮放控件:右下角

mUiSettings = aMap.getUiSettings();
mUiSettings.setZoomControlsEnabled(true);

這裏寫圖片描述

這個位置不是固定的,可以設置

mUiSettings.setZoomPosition(AMapOptions.ZOOM_POSITION_RIGHT_BUTTOM)
mUiSettings.setZoomPosition(AMapOptions.ZOOM_POSITION_RIGHT_CENTER)

6、設置logo位置:默認在左下角

mUiSettings = aMap.getUiSettings();
mUiSetting.setLogoPosition(int);

這裏寫圖片描述

這個logo是不可以去掉的,必須顯示,因爲畢竟你用別人的SDK,總得把別人體現出來。
系統提供了6種logo的位置:

mUiSettings.setLogoPosition(AMapOptions.LOGO_MARGIN_LEFT);
mUiSettings.setLogoPosition(AMapOptions.LOGO_MARGIN_BOTTOM);
mUiSettings.setLogoPosition(AMapOptions.LOGO_MARGIN_RIGHT);
mUiSettings.setLogoPosition(AMapOptions.LOGO_POSITION_BOTTOM_LEFT);
mUiSettings.setLogoPosition(AMapOptions.LOGO_POSITION_BOTTOM_RIGHT);
mUiSettings.setLogoPosition(AMapOptions.LOGO_POSITION_BOTTOM_CENTER);

但是實際運行後發現,6個值只有三個位置。
LOGO_MARGIN_LEFT 和 LOGO_POSITION_BOTTOM_LEFT是一樣的
LOGO_MARGIN_RIGHT 和 LOGO_POSITION_BOTTOM_RIGHT是一樣的
LOGO_MARGIN_BOTTOM 和 LOGO_POSITION_BOTTOM_CENTER是一樣的

這就尷尬了~難道是我打開的方式不對嘛,知道的可以跟我說一下。

7、獲取縮放比例

float scale = aMap.getScalePerPixel();

獲取出來的這個scale單位是米/像素,也就是屏幕上一像素等於實際多少米

觸控設置

1、滑動手勢:是否可以單指滑動

mUiSettings.setScrollGesturesEnabled(false);

2、縮放手勢:是否可以雙指縮放

mUiSettings.setZoomGesturesEnabled(false);

3、傾斜手勢:是否可以雙指傾斜

mUiSettings.setTiltGesturesEnabled(false);

4、旋轉手勢:是否可以雙指旋轉

mUiSettings.setRotateGesturesEnabled(false);

5、所有手勢開關

mUiSettings.setAllGesturesEnabled (false);

6、以上四個手勢設置api,對應下面4個狀態獲取api

UiSettings.isRotateGesturesEnabled()
UiSettings.isZoomGesturesEnabled()
UiSettings.isScrollGesturesEnabled()
UiSettings.isTiltGesturesEnabled()

視角改變

大家還記得嗎,第一篇最後,我們做了一個小效果,單擊地圖,地圖定位到某個地方,然後視角傾斜60度,並且旋轉90度。

代碼時這樣寫的

aMap.animateCamera(
    CameraUpdateFactory.newCameraPosition(new CameraPosition(
                new LatLng(39.92463, 116.389139), //經緯度
                18, //縮放級別 3 -19 3:最大視角,看到全中國,19:最小級別,看到細節
                60, //傾斜
                90) //旋轉
        ),
        1500,
        new AMap.CancelableCallback() {
            @Override
            public void onFinish() {

            }

            @Override
            public void onCancel() {

            }
        }
);

調用aMap.animateCamera,這個過程就是動畫形式的,還有另外一個api是沒有動畫的

aMap.moveCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition(
        new LatLng(39.92463, 116.389139), //經緯度
            18, //縮放級別 3 -19 3:最大視角,看到全中國,19:最小級別,看到細節
            60, //傾斜
            90) //旋轉
    ));

結果和上面一樣,只是這個api不會有動畫,從方法名就能看出來。

兩個api傳入的參數都是CameraUpdate對象,表示更新相機位置(即視角位置)
CameraUpdateFactory.newCameraPosition()方法就是返回一個CameraUpdate子類對象

參數分別表示:新的經緯度、縮放級別、傾斜角度、旋轉角度

我們來看一下最終效果
這裏寫圖片描述

newCameraPosition()方法可以一次性設置多個屬性,如果我只要縮放一下,就沒必要用這個方法

這個方法就可以簡單的實現縮放

aMap.animateCamera(CameraUpdateFactory.zoomTo(16));

邊界限制

這個api是一個比較新的api,你先定義好東北、西南兩個點的座標,然後地圖根據這兩個點限制的範圍,自動顯示地圖。

LatLng northeastLatLng = new LatLng(40.159453, 116.767834);
LatLng southwestLatLng = new LatLng(39.674949, 115.932873);
LatLngBounds latLngBounds = new LatLngBounds(southwestLatLng, northeastLatLng);
aMap.setMapStatusLimits(latLngBounds);

這裏寫圖片描述

地圖截圖

這個就簡單了,就是一個api,調用一下。

aMap.getMapScreenShot(new AMap.OnMapScreenShotListener() {
    @Override
    public void onMapScreenShot(Bitmap bitmap) {
        Log.e("TAG", "回調1");
    }

    @Override
    public void onMapScreenShot(Bitmap bitmap, int i) {
        Log.e("TAG", "回調2");
        ivResult.setImageBitmap(bitmap);
        if(i == 0) {
            Log.e("TAG", "地圖渲染未完成,截屏有網格");
        } else {
            Log.e("TAG", "地圖渲染完成,截屏無網格");
        }
    }
});

它有兩個回調,第二個回調多一個參數,兩個會調都是會走的,但是第二個回調多了一個狀態參數。
0 表示截圖那一刻,地圖還沒渲染好
非0 表示截圖那一刻地圖已經渲染好了

完成

好了,今天要記錄的就是這些,下篇博客會講到地圖繪製相關。

本期節目就到這裏,感謝大家的收看,我們下期再見~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章