高德地圖SDK Android版開發(fā) 7 覆蓋物示例1

前言

文本介紹Marker的常用屬性、交互和碰撞示例呆瞻。

示例功能如下:

  • 可設置Marker點擊台夺、拖拽、透明痴脾、旋轉(zhuǎn)颤介、可見、平貼屬性狀態(tài)明郭;
  • 在地圖上創(chuàng)建多個滿足上述屬性狀態(tài)的Marker买窟;
  • Marker點擊事件和拖拽事件處理。

界面布局

1布局.png
  • 布局文件
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MapMarkerActivity">

    <com.amap.api.maps.MapView
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@id/bottomView"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.appcompat.widget.LinearLayoutCompat
        android:id="@+id/bottomView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toBottomOf="@id/map">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@android:color/background_dark"
            android:gravity="center_horizontal"
            android:orientation="horizontal"
            android:paddingHorizontal="10dp">

            <CheckBox
                android:id="@+id/clickable"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:checked="true"
                android:onClick="setMarkerFlag"
                android:text="點擊"
                android:textColor="@color/white"
                android:textStyle="bold" />

            <CheckBox
                android:id="@+id/draggable"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:onClick="setMarkerFlag"
                android:text="拖拽"
                android:textColor="@color/white"
                android:textStyle="bold" />

            <CheckBox
                android:id="@+id/alpha"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:onClick="setMarkerFlag"
                android:text="透明"
                android:textColor="@color/white"
                android:textStyle="bold" />

            <CheckBox
                android:id="@+id/rotate"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:onClick="setMarkerFlag"
                android:text="旋轉(zhuǎn)"
                android:textColor="@color/white"
                android:textStyle="bold" />

        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|center"
            android:background="@android:color/background_dark"
            android:orientation="horizontal"
            android:paddingHorizontal="10dp">

            <CheckBox
                android:id="@+id/visible"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:checked="true"
                android:onClick="setMarkerFlag"
                android:text="可見"
                android:textColor="@color/white"
                android:textStyle="bold" />

            <CheckBox
                android:id="@+id/flat"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:onClick="setMarkerFlag"
                android:text="平貼"
                android:textColor="@color/white"
                android:textStyle="bold" />

        </LinearLayout>
    </androidx.appcompat.widget.LinearLayoutCompat>
</androidx.constraintlayout.widget.ConstraintLayout>

MapMarker類

以下是MapMarker部分代碼薯定。

常量

public static final String CLICKABLE = "Clickable";
public static final String DRAGGABLE = "Draggable";
public static final String ALPHA = "Alpha";
public static final String ROTATE = "Rotate";
public static final String VISIBLE = "Visible";
public static final String FLAT = "Flat";

成員變量

// 覆蓋物列表
List<BaseOverlay> overlays = new ArrayList<>();
// 選中的狀態(tài)
List<String> selectedFlags = new ArrayList<>();
// 坐標點集
List<LatLng> points = new ArrayList<>();

初始值

selectedFlags.add(CLICKABLE);
selectedFlags.add(VISIBLE);

points.add(new LatLng(39.97923, 116.357428));
points.add(new LatLng(39.94923, 116.397428));
points.add(new LatLng(39.97923, 116.437428));
points.add(new LatLng(39.92353, 116.490705));

Marker點擊事件

// 設置marker點擊事件監(jiān)聽接口。
map.setOnMarkerClickListener(new AMap.OnMarkerClickListener() {
    @Override
    public boolean onMarkerClick(Marker marker) {
        // 當一個marker對象被點擊時回調(diào)此方法瞳购。
        showToast("clickable marker");
        return true;
    }
});

Marker拖拽事件

// marker拖動事件監(jiān)聽接口
map.setOnMarkerDragListener(new AMap.OnMarkerDragListener() {
    @Override
    public void onMarkerDragStart(Marker marker) {
        // 當marker開始被拖動時回調(diào)此方法话侄。
    }

    @Override
    public void onMarkerDrag(Marker marker) {
        // 在marker拖動過程當中回調(diào)此方法。
    }

    @Override
    public void onMarkerDragEnd(Marker marker) {
        // 在marker拖動過程當中回調(diào)此方法学赛。
        // 拖拽完成后更新位置
        int index = overlays.indexOf(marker);
        if (index != -1) {
            LatLng latLng = marker.getPosition();
            points.set(index, new LatLng(latLng.latitude, latLng.longitude));
        }
    }
});

創(chuàng)建覆蓋物

public void addMarkers() {
    int[] icons = BubbleIcons.Alphabet;
    for (int i = 0; i < points.size(); ++i) {
        // 構(gòu)建Marker圖標
        BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(icons[i]);
        // 構(gòu)建MarkerOption年堆,用于在地圖上添加Marker
        MarkerOptions option = new MarkerOptions()
                .position(points.get(i)) //必傳參數(shù)
                .icon(bitmap); // 必傳參數(shù)
        setOption(option, i, selectedFlags);

        // 在地圖上添加Marker,并顯示
        Marker marker = map.addMarker(option);
        if (selectedFlags.contains(CLICKABLE))
            marker.setClickable(true); // 設置Marker覆蓋物是否可以點擊
        else
            marker.setClickable(false);

        overlays.add(marker);
    }
}

private void setOption(MarkerOptions option, int i, List<String> flags) {
    if (flags.contains(DRAGGABLE))
        option.draggable(true); // 設置Marker覆蓋物是否可拖拽盏浇。

    if (flags.contains(ALPHA))
        option.alpha(0.5f + 0.1f * i); // 設置Marker覆蓋物的透明度

    if (flags.contains(ROTATE))
        option.rotateAngle(30 * i); // 設置Marker覆蓋物的圖片旋轉(zhuǎn)角度变丧,從正北開始,逆時針計算绢掰。

    if (flags.contains(VISIBLE))
        option.visible(true); // 設置Marker覆蓋物是否可見痒蓬。
    else
        option.visible(false);

    if (flags.contains(FLAT))
        option.setFlat(true); // 設置Marker覆蓋物是否平貼地圖。
}

移除覆蓋物

public void removeOverlay() {
    // 從地圖上刪除所有的覆蓋物(marker滴劲,circle攻晒,polyline 等對象),
    // 但myLocationOverlay(內(nèi)置定位覆蓋物)除外班挖。
    boolean isKeepMyLocationOverlay = true;
    map.clear(isKeepMyLocationOverlay);

    overlays.clear();
}

設置屬性

public void addFlag(String flag) {
    if (!selectedFlags.contains(flag))
        selectedFlags.add(flag);

    removeOverlay();
    addMarkers();
}

public void removeFlag(String flag) {
    selectedFlags.remove(flag);

    removeOverlay();
    addMarkers();
}

MapMarkerActivity類

以下是MapMarkerActivity部分代碼鲁捏。

控件響應事件

public void setMarkerFlag(View view) {
    boolean checked = ((CheckBox) view).isChecked();
    int id = view.getId();
    String flag;
    if (id == R.id.clickable)
        flag = MapMarker.CLICKABLE;
    else if (id == R.id.draggable)
        flag = MapMarker.DRAGGABLE;
    else if (id == R.id.alpha)
        flag = MapMarker.ALPHA;
    else if (id == R.id.rotate)
        flag = MapMarker.ROTATE;
    else if (id == R.id.visible)
        flag = MapMarker.VISIBLE;
    else if (id == R.id.flat)
        flag = MapMarker.FLAT;
    else
        return;

    if (checked)
        mapMarker.addFlag(flag);
    else
        mapMarker.removeFlag(flag);
}

運行效果圖

2效果圖.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市萧芙,隨后出現(xiàn)的幾起案子给梅,更是在濱河造成了極大的恐慌,老刑警劉巖双揪,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件动羽,死亡現(xiàn)場離奇詭異,居然都是意外死亡盟榴,警方通過查閱死者的電腦和手機曹质,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人羽德,你說我怎么就攤上這事几莽。” “怎么了宅静?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵章蚣,是天一觀的道長。 經(jīng)常有香客問我姨夹,道長纤垂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任磷账,我火速辦了婚禮峭沦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逃糟。我一直安慰自己吼鱼,他們只是感情好,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布绰咽。 她就那樣靜靜地躺著菇肃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪取募。 梳的紋絲不亂的頭發(fā)上琐谤,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機與錄音玩敏,去河邊找鬼斗忌。 笑死,一個胖子當著我的面吹牛聊品,可吹牛的內(nèi)容都是我干的飞蹂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼翻屈,長吁一口氣:“原來是場噩夢啊……” “哼陈哑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起伸眶,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤惊窖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后厘贼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體界酒,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年嘴秸,在試婚紗的時候發(fā)現(xiàn)自己被綠了毁欣。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庇谆。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖凭疮,靈堂內(nèi)的尸體忽然破棺而出饭耳,到底是詐尸還是另有隱情,我是刑警寧澤执解,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布寞肖,位于F島的核電站,受9級特大地震影響衰腌,放射性物質(zhì)發(fā)生泄漏新蟆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一右蕊、第九天 我趴在偏房一處隱蔽的房頂上張望琼稻。 院中可真熱鬧,春花似錦尤泽、人聲如沸欣簇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至莫鸭,卻和暖如春闹丐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背被因。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工卿拴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人梨与。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓堕花,卻偏偏與公主長得像,于是被迫代替她去往敵國和親粥鞋。 傳聞我的和親對象是個殘疾皇子缘挽,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容