本文同時(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以上顯示效果良好同廉,地圖邊緣沒有白邊。
方案二:自定義圓角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)效果:
在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ì)更好