通過(guò)ViewOutlineProvider實(shí)現(xiàn)圓角矩形

在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é)可能要付出很多額外的努力:

  1. 首先需要一個(gè)白色的圓角矩形背景,有2種方式:一是找設(shè)計(jì)師通過(guò)切圖來(lái)提供,二是使用xml shape標(biāo)簽來(lái)創(chuàng)建,顯然后者更好一點(diǎn),可以減小包的大小;
  2. 如果底部有2個(gè)button,左邊的button只有左下角是圓角的,右邊的button只有右下角是圓角的,其他角是直角的;
  3. 如果底部只有1個(gè)button,顯然該button的左下、右下角是圓角的;
  4. 每種圓角的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ì)有額外的性能損耗,感興趣的可以看看源碼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程,因...
    小菜c閱讀 7,295評(píng)論 0 17
  • afinalAfinal是一個(gè)android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,837評(píng)論 2 45
  • centOS7系統(tǒng) 一.jdk1.8安裝 0.查看是否系統(tǒng)是否有默認(rèn)安裝的jdk有的話卸載 rpm -qa|gre...
    蘇林欣閱讀 336評(píng)論 2 1
  • 匆匆,歲月,太匆匆。 奈何,人世間流年芳華,已逝。 -1- 伴隨著哇的一聲啼哭,一個(gè)幼小的嬰兒呱呱墜地,來(lái)到了人世...
    七星火閱讀 642評(píng)論 9 9
  • 文/淡羽墨客 圖/來(lái)自網(wǎng)絡(luò) 有時(shí)我們或許會(huì)產(chǎn)生一個(gè)想法。如果我當(dāng)年選擇了文科,可能現(xiàn)在就是一位作家;如果我當(dāng)年勇敢...
    淡雨墨客閱讀 276評(píng)論 1 6

友情鏈接更多精彩內(nèi)容