1 圖片

在Android中,給一個控件(或View)設置背景主要是通過background:xxx屬性來完成。background的參數一般來說是一個drawable資源。drawable可以是一張普通的圖片,也可以是9 patch圖片,還可以是一個xml文件。給控件設置邊框最簡單的方式就是把background設置成你預先設計好的帶圓角和邊框的背景圖。比如下面這張圖:
但是,你很快會發現一個缺點:靈活性很差!是的,固定大小的圖片很難根據控件裡的內容而調整大小。它在被做出來的那天就已經被確定了!換句話說,你很難只用這一張圖來應付擁有相同風格卻大小各異的控件。為了給所有控件加上圓角和邊框,你必須小心翼翼地計算他們的大小,然後一個一個得製作背景圖片!天哪,這簡直太愚蠢了。一旦遇到大小不定的控件,這方法就歇菜了。而且,大量的背景圖片會讓你的安裝包迅速膨脹。呃……還有,你怎麼應對擁有各式各樣分辨率的Android設備呢?
所以,你需要……換個方法。
比較為大眾採用一種解決方案是NinePatch。可以毫不誇張得說,9 patch是Android中解決自適應問題的利器。介紹和使用你可以看看這裡還有這裡
使用9 patch圖片有很多好處,如減輕美工壓力,減少UI代碼量,減少內存使用……總結起來就是:省時省力,屌爆了。
所以在給圓角和邊框時,你或許會這麼做。
當然,9 patch能做的是遠遠比這多,如做一個自適應的對話框什麼的。

2 XML定義

我想大多數程序員都喜歡用代碼解決問題。原因如下:
  1. 用代碼更加cool。
  2. 我美工不行,我會說出去嗎?
OK,好東西在這裡。

2.1 基本的圓角、邊框

Android除了支持原始的圖片資源外,比較棒的一點就是可以用XML文件定義一些簡單的圖形。這有點像web的CSS,不過相比CSS3,Android的xml實現還沒那麼強大,例如,邊框要么四周都有,要么四周都沒有(我們將在後面討論這事)。xml drawable的傳送門在這裡
要畫一個帶灰色邊框和圓角的圖形很容易,在drawable資源目錄下添加一個xml:
<?xml version="1.0" encoding="utf-8"?>
<!-- shape如果不声明形状则默认为正方形 -->
<shape xmlns:android="http://schemas.android.com/apk/res/android" >

    <corners android:radius="5.0dp" />
    <!-- 圆角,你也可以对不同的角设置不同的数值 -->

    <solid android:color="#FFFFFF" />
    <!-- 形状的填充色 -->

    <stroke
        android:width="1dp"
        android:color="#CCCCCC" />
    <!-- 边框宽度和颜色 -->

</shape>
在你需要用到這東西的地方如某個View下,設置background就行了。

2.2 “自由的邊框“

當前版本的Android SDK並沒有給stroke提供bottom、left、right之類的屬性,也就是說你無法通過它來讓長方形的邊框少於4條。啊,真是太遺憾了。怎麼辦呢?有人想到了對Layer List hack。在StackOverflow上有不少這樣的把戲
為了實現只有left,right和top邊框,我們可以這麼寫:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <shape android:shape="rectangle" >
            <stroke
                android:width="1dp"
                android:color="@color/card_stroke" />
        </shape>
    </item>

    <item
        android:left="2dp"
        android:right="2dp"
        android:top="2dp">
        <!-- 在实际使用中我发现1dp达不到显示效果,而2dp正好可以显示边框 -->

        <shape android:shape="rectangle" >
            <solid android:color="@color/solid_white" />
        </shape>
    </item>
</layer-list>
原理差不多是這樣:
詭異的是理論上只要偏移量只要1dp就能顯示1dp寬帶邊框了,但我在listview裡實驗了一下發現不行,換成2dp方可。有同學能解釋解釋麼?
如果要給圖形加上圓角,只需要給每個shape加上
<corners
    android:topLeftRadius="5.0dip"
    android:topRightRadius="5.0dip" />
值得注意的是,兩個shape的radius在設置的時候請確保前面的圖層不會把後面的擋住。

3 小結

要在Android中實現圓角和邊框,比較簡單的方法:圖片、XML差不多就是這麼用的啦。此外還有用Java代碼調用draw方法畫出來的,不過我沒有研究過。他們各有各的優點啦。用圖片,能控制的東西更多,用代碼修改起來比較另過。最後要說的是兩個方法的效率。在這個問題上,我留有疑問,沒有做過專門的比較。但直觀的感受是……好吧,沒什麼感受。

每一個用Linerlayout就行,至於圓角框樣式用xml配置一下,裡面的橫線imageView畫一下就行
這有個例子,效果不一樣,你可以試著調一下里面的參數
drawable/ table_shape.xml 

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android=" http://schemas.android.com/apk/res/android " > 
    
 <solid android:color="#fff" /> 

    //設置邊距
    <padding 
        android:bottom="10dp" 
        android:left="10dp" 
        android:right="10dp" 
        android:top="10dp" /> 

    //控制邊界線顏色和筆觸大小
    <stroke 
        android: width="1dp" 
        android:color="#CdCdCd" /> 

    //控制界面顏色漸變(你這個用不到)
    <gradient 
         android:startColor="#E9E9E9" 
         android:endColor="#FFFFFF" 
         android:type= "linear" 
         android:angle="90"/> 
    
    //控制圓角大小
    <corners android:radius="10dp" /> 
    
</shape> 

然後在Linerlayout裡設置android:background="@drawable/table_shape" 
就行啦!

可以調整想要圓角的網址
http://angrytools.com/android/button/