概述
筆者認爲,android應用UI設計應該從容大方,簡潔優雅,應儘量避免繁瑣多餘的形狀線條。因此筆者建議使用shape
自定義View控件的外觀。
建議理由:shape
只能自定義簡單形狀和顏色填充,然而卻有完美的邊緣渲染,不會出現邊緣鋸齒或者模糊的廉價感,這一點對於android UI是十分重要的。並且shape
的操作和使用都十分簡單。
操作過程爲先在drawable
目錄下創建根節點爲shape
的.xml
資源文件,之後在具體View控件中使用android:background=@drawable/targetshape
將繪製的圖形設置爲View控件背景即可。
子元素與屬性
android:shape屬性
此屬性必須全局聲明,用來指定圖形的形狀基礎。屬性值:
rectangle
:屬性默認值,形狀基礎爲矩形。
oval
:形狀基礎爲橢圓。
ring
:形狀基礎爲圓環。
line
:形狀基礎爲直線。
solid
solid子元素用於指定圖形填充色。屬性:
android:color
屬性值可以是RGB888
格式,不指定透明度,例如:android:color="#ff00ff"
;也可以是ARGB
格式,即在RGB888
格式的基礎上添加透明度值(Alpha),十六進制下的高兩位指定透明度,例如:android:color="#50ff00ff"
。
size
size子元素用於指定圖形的寬高。屬性:
android:width
android:height
此子元素不可用於line
和ring
。
用於oval
時,它的兩個屬性中一個指定長軸長,另一個指定短軸長。
corners
corners子元素指定矩形四個角的圓角半徑。屬性:
android:radius
:同時指定四個角度圓角半徑。
android:topLeftRadius
:單獨指定左上角圓角半徑。
android:topRightRadius
:單獨指定右上角圓角半徑。
android:bottomLeftRadius
:單獨指定左下角圓角半徑。
android:bottomRightRadius
:單獨指定右下角圓角半徑。
此子元素只能用於矩形形狀基礎。
stroke
stroke子元素指定形狀的描邊。常用屬性:
android:width
:指定描邊寬度。
android:color
:指定描邊顏色。可用RGB888
和ARGB
。
gradient
gradient子元素指定顏色漸變。屬性:
android:type
:指定漸變類型,屬性值有:linear
(線性漸變)、radial
(徑向漸變)、sweep
(掃描漸變)。
android:startColor
:漸變的開始顏色。
android:centerColor
:漸變的中間顏色。
android:endColor
:漸變的結束顏色。
android:angle
:漸變方向角,屬性值必須是45的整數倍。只對線性漸變有效。
android:gradientRadius
:漸變半徑,只對徑向漸變有效。
android:centerX
:X方向的漸變中心位置,屬性值爲0.0到1.0,0.0表示圖形最左,1.0表示圖形最右。
android:centerY
:Y方向的漸變中心位置,屬性值爲0.0到1.0,0.0表示圖形最下,1.0表示圖形最上。
顏色的漸變經歷:startColor
TocenterColor
ToendColor
。
gradient
的顏色將覆蓋solid
的顏色。
padding
padding子元素用於設置內邊距,即內容(比如文字)與邊緣的距離。
line
line可以繪製直線和虛線。由於種種原因,筆者放棄瞭解。
ring
ring的尺寸屬性必須全局聲明。
常用屬性
android:innerRadius
:圓環內徑。
android:thickness
:圓環厚度。
android:useLevel
:只有此屬性值爲false
形狀纔會顯示。
代碼示例
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="ring"
android:innerRadius="100dp"
android:thickness="20dp"
android:useLevel="false">
<gradient
android:type="sweep"
android:startColor="#0000ff"
android:endColor="#ff0000" />
</shape>
效果如下圖:
動態修改shape顏色
假如Button
使用shape繪製的圖形作爲背景,那麼在Java代碼中動態修改顏色的方法爲:
Button btn_1=(Button)findviewById(R.id.btn_1);
GradientDrawable grd_1=btn_1.getBackground();
grd_1.setColor(0x50ff00ff);
還可以使用setAlpha()
方法動態設置透明度。
歡迎指正