圖文詳解Andorid中用Shape定義GradientDrawable

來源:互聯網
上載者:User

圖文詳解Andorid中用Shape定義GradientDrawable

Android中提供了各種類型的Drawable,也可以用XML定義各種Drawable。本文重點講述如何用XML中的shape節點定義GradientDrawable。

用XML定義的drawable檔案放在res/drawable目錄下。

用XML檔案定義GradientDrawable的文法如下所示:

                         

該檔案以為根結點,其shape屬性可取四種值:rectangle、oval、line或ring。以上文法格式中雖然列出了很多屬性,但是並不是對於所有類型的shape都支援這些屬性。下面分別對這四種shape進行講解。

rectangle

在res/drawable下面用XML檔案定義了一個名為rectangle的GradientDrawable,其對應的shape值為rectangle,表明我們定義的drawable的形狀是矩形。在layout檔案中定義了一個TextView,其使用了上述drawable,如下所示:

solid

rectangle.xml定義如下所示:

     

在上面的XML檔案中,我們將shape屬性設定為rectangle,我們將節點的color屬性設定為綠色,屬性是用來設定面的填充色的,效果如下所示:

corners
vcm5lcnM+PC9jb2RlPr3atePTw9PayejWw2RyYXdhYmxly8S49rnVvce1xLDrvrajrLbU06a1xFhNTM7EvP7I58/Cy/nKvqO6PC9wPg0KPHByZSBjbGFzcz0="brush:java;">

效果如下所示:

只有當shape屬性值為rectangle時,節點才會有用。節點的radius屬性同時定義了四個角的半徑,如果想讓這四個角的半徑不一樣,可以分別設定topLeftRadius、topRightRadius、bottomLeftRadius和bottomRightRadius屬性,不過在設定這四個屬性之前應先設定radius屬性作為預設值,且預設值要大於1,無法正常使用其他四個屬性。

padding
節點用於設定drawable的padding,可以分別設定left、right、top、bottom四個屬性,其作用與直接對TextView設定的四個paddingLeft、paddingRight、paddingTop、paddingBottom屬性等價。

XML檔案如下所示:

   

效果如下所示:

size
可以用節點的width和height屬性設定drawable的尺寸。預設情況下,用定義的drawable會自動縮放到包含drawable的View尺寸範圍。比如我們有如下的ImageView的src設定了定義的drawable,當我們設定了其scaleType值為center時,中定義的size尺寸就會限制drawable縮放。

定義的ImageView如下所示:

對應的drawable定義如下所示:

   

效果如下所示:

stroke
可以用節點設定drawable的輪廓線,通過width屬性設定輪廓線的寬度,通過color屬性設定輪廓線的顏色。預設情況下,定義的是實線,除此之外,還可以設定dashWidthdashGap屬性,如果設定了這兩個屬性,那麼就是虛線。其中,dashWidth定義了每個虛線段的長度,dashGap定義了兩個虛線段之間的距離。

對應的XML檔案如下所示:

    

效果如下所示:

gradient
上面我們說到,通過可以設定drawable的顏色,但是只是一種純色,如果想讓drawable產生漸層效果,可以使用節點建立漸層色效果。節點具有以下屬性:type、startColor、centerColor、endColor、angle、centerX、centerY、gradientRadius。其中type有三種取值:linear、radial和sweep,預設值是linear。當type取不同的值時,並不是支援全部屬性,下面詳細說明。

linear
的type值為linear時,表示顏色是線性漸層的,此時支援startColor、centerColor、endColor、angle這四個屬性,其他屬性不支援。我們可以通過設定startColor和endColor指定漸層的起始顏色以及終止顏色,XML如下所示:

   

我們將startColor設定為紅色,endColor設定為藍色,效果如下所示:

我們還可以設定centerColor屬性,指定中間色,XML如下所示:

   

我們將中間色設定為綠色,效果如下所示:

預設情況下,漸層是從左向右進行的,如果想調整漸層的方向可以設定angle屬性,angle的預設值為0,對應著自左向右漸層,angle的單位是角度,angle的值必須是45的倍數,否則不會有漸層效果。我們可以更改angle值,XML如下所示:

   

我們將angle設定為90度,那麼漸層方向就變成了從下上,效果如下所示:

radial
的type值為radial時,表示顏色從某點向周圍輻射漸層,此時支援除angle之外的其他所有屬性。我們必須通過設定gradientRadius屬性以指定漸層的輻射半徑,通過startColor指定起始顏色,XML如下所示:

   

我們將startColor設定為紅色,效果如下所示:

由我們可以發現,startColor(紅色)從中心沿著圓的半徑逐漸層淡。

在設定了startColor的基礎上,我們還可以設定centerColor,XML如下所示:

   

效果如所示:

由可以看出,startColor(紅色)從中心沿著圓的半徑逐漸漸層到centerColor(綠色)。

除了設定startColor、centerColor,還可以設定endColor,XML如下所示:

   

我們將centerColor設定為綠色,效果如下所示:

由可以看出,startColor(紅色)從中心沿著圓的半徑逐漸漸層到centerColor(綠色),在指定的半徑之外顏色用endColor(藍色)填充。

其實,startColor、centerColor、endColor這三個屬性可以任意組合,大家可以自己嘗試一下各種組合的效果。

預設圓心的位置處於drawable的中心,我們可以通過centerX和centerY屬性改變漸層圓心的位置,centerX和centerY的取值範圍都是0到1,這兩個屬性的預設值都是0.5,drawable的左上方的centerX和centerY的值都是0,右下角的centerX和centerY的值都是1。我們改變centerX和centerY的值,XML如下所示:

   

效果如下所示:

sweep
的type值為sweep時,表示顏色是圍繞中心點360度順時針旋轉的,起點就是3點鐘位置。
我們可以只設定startColor,XML檔案如下所示:

   

我們將startColor設定為紅色,效果如下所示:

我們也可以只設定endColor,XML檔案如下所示:

   

將endColor設定為藍色,效果如下所示:

我們也可以只設定centerColor的值,XML檔案如下所示:

   

將centerColor設定為綠色,效果如下所示:

我們也可以同時設定startColor、centerColor、endColor的值,XML檔案如下所示:

   

將startColor、centerColor、endColor分別設定為紅、綠、藍,效果如下所示:

centerX和centerY的預設值都是0.5,表示中心點的預設位置就是drawable的中心,我們也可以更改centerX和centerY的值,從而更新中心點的位置,XML檔案如下所示:

   

我們將centerX的值設定為0.25,效果如下所示:

oval

在res/drawable下面用XML檔案定義了一個名為oval的GradientDrawable,其對應的shape值為oval,表示drawable的形狀是橢圓,並將該drawable作為TextView的background。oval和rectangle的主要區別就是drawable的形狀不同,大部分的節點屬性的作用是相同的。

solid
如同rectangle,我們可以通過solid指定drawable的顏色,XML如下所示:

    

效果如下所示:

corners
當shape為oval時,不支援節點。

padding
oval同樣支援節點,將四個padding值設定為20dp,效果如下所示:

size
oval不支援節點。

stroke
同rectangle一樣,我們也可以為oval設定,效果如下所示:

gradient
oval同樣支援節點實現漸層效果,type屬性也是支援linear、radial、sweep三個屬性。節點實現的漸層效果桶rectangle的漸層效果基本一樣。

linear
當type為linear時,實現線性漸層效果,我們將startColor、centerColor、endColor分別設定為紅、綠、藍,並設定angle為45度,效果如下所示:

radial
當type為radial時,實現放射漸層效果,我們將startColor、centerColor、endColor分別設定為紅、綠、藍,效果如下所示:

sweep
當type為sweep時,表示顏色是圍繞中心點360度順時針旋轉的,起點就是3點鐘位置。我們將startColor、centerColor、endColor分別設定為紅、綠、藍,效果如下所示:

節點中的多個參數組合的效果可以參見上述rectangle中的說明。

line

在res/drawable下面用XML檔案定義了一個名為line的GradientDrawable,其對應的shape值為line,並將該drawable作為TextView的background。當shape為line時,表示drawable的形狀是線,該線會分割drawable。line只支援兩個節點,不支援其他的節點。

XML檔案如下所示:

        

效果如下所示:

ring

在res/drawable下面用XML檔案定義了一個名為ring的GradientDrawable,其對應的shape值為ring,表示drawable的形狀是圓環,並將該drawable作為TextView的background。所謂圓環就是大圓套小圓。當shape為ring時,shape有額外的四個屬性可用:innerRadius、thickness、innerRadiusRatio、thicknessRatio。

需要特別注意的是,在API<=19的真機上使用shape為ring的drawable時,Android有個bug,會不顯示drawable,解決辦法是將shape設定useLevel屬性為true。

我們通過innerRadius指定小圓的半徑,通過thickness指定大圓和小圓之間的寬度。XML如下所示:

        

效果如下所示:

我們還可以通過innerRadiusRatio指定小圓的半徑,innerRadiusRatio的值是float類型,如果其值是9,表示小圓的半徑等於TextView寬度的1/9。同樣,也可以通過thicknessRatio指定大圓和小圓之間的寬度,其實值型別也是float,如果值為8,則表示大小圓之間的寬度等於TextView的1/8。XML檔案如下所示:

        

效果如下所示:

如果給ring設定了,那麼大小圓都會使用該設定的輪廓線,效果如下所示:

ring同樣支援實現漸層效果,預設type為linear,只將startColor設定為紅色,效果如下所示:

type為linear時,只將centerColor設定為綠色,效果如下所示:

type為linear時,只將endColor設定為藍色,效果如下所示:

type為linear時,也支援angle參數。大家可以自己嘗試多種顏色的組合效果。

的type值設定為gradial時,需要指定gradientRadius屬性,否則會報錯。gradial並不能像上面那樣實現輻射漸層效果,gradial的ring只是用startColor填充圓環的顏色,實現的效果與指定節點中的color屬性相同,此處就不貼圖了。

當type為sweep時,表示顏色是圍繞中心點360度順時針旋轉的,起點就是3點鐘位置。我們將startColor、centerColor、endColor分別設定為紅、綠、藍,效果如下所示:

希望本文對大家用Shape定義GradientDrawable有所協助!


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.