在Android中默認(rèn)所有的View都是直角的,但是大部分的設(shè)計(jì)師都喜歡按照蘋果的風(fēng)格來(lái)設(shè)計(jì),也就是會(huì)出現(xiàn)很多圓角矩形的設(shè)計(jì),對(duì)Android工程師來(lái)說(shuō)會(huì)造成很多額外的麻煩。
1.實(shí)現(xiàn)圓角矩形對(duì)話框

如圖所示,這是一個(gè)很常見(jiàn)的對(duì)話框設(shè)計(jì),整個(gè)對(duì)話框背景是一個(gè)白色的圓角矩形框,但為了實(shí)現(xiàn)這種效果,Android開(kāi)發(fā)的同學(xué)可能要付出很多額外的努力:
- 首先需要一個(gè)白色的圓角矩形背景,有2種方式:一是找設(shè)計(jì)師通過(guò)切圖來(lái)提供,二是使用xml shape標(biāo)簽來(lái)創(chuàng)建,顯然后者更好一點(diǎn),可以減小包的大小;
- 如果底部有2個(gè)button,左邊的button只有左下角是圓角的,右邊的button只有右下角是圓角的,其他角是直角的;
- 如果底部只有1個(gè)button,顯然該button的左下、右下角是圓角的;
- 每種圓角的button都可能有不同的顏色樣式;
總的算來(lái),1個(gè)圓角對(duì)話框背景圖,3種圓角button背景圖,每種圓角button背景有2種顏色的樣式,這樣需要定義 7(1 + 3 * 2 = 7) 種不同的 xml shape 資源文件,也是很繁瑣的一件事。
2.ViewOutlineProvider實(shí)現(xiàn)圓角
幸運(yùn)的是,在5.0以后Android提供了ViewOutlineProvider,可以為View動(dòng)態(tài)設(shè)置圓角,再也不需要通過(guò)背景圖來(lái)實(shí)現(xiàn)圓角了。
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void setBgRadius(View layoutContent, int bgRadius) {
layoutContent.setOutlineProvider(new ViewOutlineProvider() {
@Override
public void getOutline(View view, Outline outline) {
outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), bgRadius);
}
});
layoutContent.setClipToOutline(true);
}
注意該API在5.0以后才有,如果你的應(yīng)用支持5.0以下,需要做好兼容,不過(guò)現(xiàn)在5.0以下的系統(tǒng)一般暫也不考慮了吧。
現(xiàn)在我們?cè)賮?lái)實(shí)現(xiàn)之前的那個(gè)圓角對(duì)話框:首先對(duì)話框的背景色只需設(shè)置成白色即可,再也不需要定義圓角的xml shape背景圖了;其次button的背景圖只需要定義一個(gè)白色和一個(gè)黃色的了,再也不用關(guān)心哪個(gè)角要定義成圓角了;最后,利用ViewOutlineProvider將對(duì)話框的根布局View設(shè)置成圓角。可見(jiàn),通過(guò)這種方式實(shí)現(xiàn)圓角效果簡(jiǎn)單方便多了。
3.其他思考
ViewOutlineProvider實(shí)現(xiàn)圓角好用,但是也不要濫用,它實(shí)質(zhì)上是對(duì)View進(jìn)行裁切顯示,可能會(huì)有額外的性能損耗,感興趣的可以看看源碼。