Android高德(百度)地圖mapview圓角實(shí)現(xiàn)

本文同時(shí)適用于高德地圖和百度地圖才漆。

本人總結(jié)下來有三種實(shí)現(xiàn)方案躲庄,但每種方案都有利弊:

  • 方案一:使用CardView包裹MapView甸怕,通過設(shè)置CardView的圓角屬性來實(shí)現(xiàn)地圖圓角效果挠羔。弊端:存在兼容性問題盖奈。
  • 方案二:原理同第一種方案,自定義圓角Layout包裹MapView磁奖。同樣也存在兼容性問題脉顿。
  • 方案三:添加一個(gè)圓角遮罩(中間透明)蓋到MapView上面,從而實(shí)現(xiàn)圓角效果点寥。好處是不存在兼容性問題,弊端是適用性較狹窄来吩。適用于地圖邊框顏色同外部容器顏色一致的情況敢辩,否則存在色差就比較難看。

下面詳述三種方案:

方案一:使用CardView包裹MapView

<android.support.v7.widget.CardView
            android:layout_weight="0.6"
            android:layout_marginLeft="15dp"
            android:layout_marginRight="15dp"
            android:layout_marginTop="50dp"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:cardCornerRadius="6dp">
        <com.amap.api.maps.MapView
                android:id="@+id/road_help_map"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>
    </android.support.v7.widget.CardView>

由于CardView本身兼容性問題弟疆,導(dǎo)致5.0(API 21)以下圓角存在邊距戚长。下圖顯示效果不明顯,但是實(shí)際開發(fā)肉眼是可以看到的怠苔。

5.0以下(真機(jī)API19)

5.0以上顯示效果良好同廉,地圖邊緣沒有白邊。


5.0以上(真機(jī)API27)

方案二:自定義圓角Layout包裹MapView

自定義圓角布局RoundRelativeLayout

public class RoundRelativeLayout extends RelativeLayout {
    private Path path;
    private float radius = 20f;

    public RoundRelativeLayout(@NonNull Context context) {
        this(context, null);
    }

    public RoundRelativeLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public RoundRelativeLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        if (attrs != null) {
            TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.RoundRelativeLayout);
            radius = ta.getDimension(R.styleable.RoundRelativeLayout_radius, 20);
            ta.recycle();
        }
        path = new Path();
    }

    @Override
    protected void dispatchDraw(Canvas canvas) {
        path.reset();
        path.addRoundRect(new RectF(0, 0, getMeasuredWidth(), getMeasuredHeight()), radius, radius, Path.Direction.CW);
        canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG));
        canvas.clipPath(path, Region.Op.REPLACE);
        super.dispatchDraw(canvas);
    }
}

屬性文件attrs.xml:

 <declare-styleable name="RoundRelativeLayout">
        <attr name="radius" format="dimension" />
  </declare-styleable>

看下實(shí)現(xiàn)效果:


模擬器API 17

真機(jī)API 19

在API17上沒有圓角效果柑司,而API19上則有迫肖。原因跟我們使用clipPath來實(shí)現(xiàn)圓角有關(guān),這個(gè)方法在API 18才支持硬件加速(參見我的另一篇文章硬件加速)攒驰,經(jīng)過實(shí)驗(yàn)發(fā)現(xiàn)如果我們?cè)O(shè)置關(guān)閉硬件加速蟆湖,那么是可以看到圓角的,但是地圖MapView會(huì)出現(xiàn)黑屏現(xiàn)象玻粪。大家可以手動(dòng)試下隅津。本人測(cè)試的關(guān)閉硬件加速的方法:

 public RoundRelativeLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    setLayerType(LAYER_TYPE_SOFTWARE, null);
    ....
}

嘗試過網(wǎng)上的其他圓角控件GcsSloop/rclayout诬垂,VibeXie/Android實(shí)現(xiàn)圓角ViewGroup,和MapView結(jié)合使用都會(huì)存在黑屏或顯示不出來的現(xiàn)象伦仍。

綜上结窘,采用本方法,API18以下的設(shè)備將無法實(shí)現(xiàn)圓角充蓝,API18(含)以上設(shè)備有圓角隧枫。

方案三:給MapView添加圓角遮罩

定義一個(gè)圓角遮罩mapview_corner.xml,這里的colorPrimary顏色同地圖容器背景色相近棺克,如果能一樣是最好悠垛。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape >
            <solid android:color="@android:color/transparent"/>
            <stroke android:color="@color/colorPrimary" android:width="2dp"/>
        </shape>
    </item>
    <item>
        <shape >
            <solid android:color="@android:color/transparent"/>
            <stroke android:color="@color/colorPrimary" android:width="2dp"/>
            <corners android:radius="6dp"/>
        </shape>
    </item>
</layer-list>

布局代碼:

<RelativeLayout
            android:layout_weight="0.6"
            android:layout_marginLeft="15dp"
            android:layout_marginRight="15dp"
            android:layout_marginTop="50dp"
            android:layout_width="match_parent"
            android:layout_height="0dp">
        <com.amap.api.maps.MapView
                android:id="@+id/road_help_map"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>
        <View android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/mapview_corner"/>
    </RelativeLayout>

在MapView的上方添加一個(gè)和MapView大小一樣的View,設(shè)置背景為mapview_corner.xml作為圓角遮罩娜谊。

顯示效果:


圓角遮罩

因?yàn)槲业谋尘盀闈u變色确买,和純色的邊框顏色差異較大,所以會(huì)很明顯的看出來纱皆。

這種方案湾趾,如果你的背景為純色,則效果會(huì)很良好派草。

我這里的背景遮罩采用layer-list實(shí)現(xiàn)搀缠,實(shí)際上你也可以考慮用9-patch來做,效果會(huì)不會(huì)更好

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末近迁,一起剝皮案震驚了整個(gè)濱河市艺普,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鉴竭,老刑警劉巖歧譬,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異搏存,居然都是意外死亡瑰步,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門璧眠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缩焦,“玉大人,你說我怎么就攤上這事责静≡模” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵泰演,是天一觀的道長(zhǎng)呻拌。 經(jīng)常有香客問我,道長(zhǎng)睦焕,這世上最難降的妖魔是什么藐握? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任靴拱,我火速辦了婚禮,結(jié)果婚禮上猾普,老公的妹妹穿的比我還像新娘袜炕。我一直安慰自己,他們只是感情好初家,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布偎窘。 她就那樣靜靜地躺著,像睡著了一般溜在。 火紅的嫁衣襯著肌膚如雪陌知。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天掖肋,我揣著相機(jī)與錄音仆葡,去河邊找鬼。 笑死志笼,一個(gè)胖子當(dāng)著我的面吹牛沿盅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纫溃,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼腰涧,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了紊浩?” 一聲冷哼從身側(cè)響起窖铡,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坊谁,沒想到半個(gè)月后万伤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡呜袁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了简珠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阶界。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖聋庵,靈堂內(nèi)的尸體忽然破棺而出膘融,到底是詐尸還是另有隱情,我是刑警寧澤祭玉,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布氧映,位于F島的核電站,受9級(jí)特大地震影響脱货,放射性物質(zhì)發(fā)生泄漏岛都。R本人自食惡果不足惜律姨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望臼疫。 院中可真熱鬧择份,春花似錦、人聲如沸烫堤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鸽斟。三九已至拔创,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間富蓄,已是汗流浹背剩燥。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留格粪,地道東北人躏吊。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像帐萎,于是被迫代替她去往敵國和親比伏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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