一、前言
在我們的日常開發中,需要大量的圖片來美化我們的 APP,圖片的大量使用在增強 UI 的美觀性外,也帶來諸多的問題,比如:導致程序出現
OOM(內存溢出)、APK 體積變的十分臃腫,內存泄露等 。事實上,在大部分情況下,我們都可以通過 ShapeDrawable
來繪制我們需要的圖形,從而有效避免使用圖片而帶來的諸多問題 。ShapeDrawable
可以理解為通過顏色來繪制的圖形,它既可以是純色的圖片,也可以具有漸變效果的圖形 。ShapeDrawable和其他層次化的 Drawable
一起使用,可以繪制各非常絢麗的圖形與動畫效果。
二、ShapeDrawable 詳解
ShapeDrawable 對應 < shape > 標簽,其語法如下:
? ? ? ? ? ? ? ? ? ? ? ?
各標簽、屬性詳解:
< shape >
android:shape表示:圖形的形狀,可以定義下面四種類型的形狀
rectangle : 矩形。默認的形狀,可以畫出直角矩形、圓角矩形、弧形等。
oval: 橢圓形。長寬一樣時表示正圓。
line: 線形,可以畫實線和虛線。
ring: 環形,可以畫環形進度條。
當 android:shape="ring" 時,又具有如下特殊的屬性:
android:thickness 厚度, 圓環的厚度 = 外半徑 - 內半徑 ,當和thicknessRatio一起存在時,以thickness為準。
android:innerRadius 圓內的內半徑,當和innerRadiusRatio同時存在時,以innerRadius為準
Android:innerRadiusRatio 內半徑在占整個Drawable寬度的比例,默認值是9。如果為n,那么 內半徑 = 寬度 / n。
android:thicknessRatio 厚度占整個Drawable的寬度的比例,默認值是3。如果為n,那么 厚度 = 寬度 / n 。
android:useLevel 一般都應該使用false,否則可能無法達到預期的效果,除非他被用來作為 LevelListDrawable 來使用。
< corners >表示:角度 ( 只適用于 android:shape="rectangle" ), 表示 shape 圖形四個角的圓角程度,每個圓角半徑值都必須大于1,否側就沒有圓角 。
android:radius 為四個角同時設定相同的角度,優先級低,會被下面幾個覆蓋。
android:topLeftRadius 左上角的角度
android:topRightRadius 右上角的角度
android:bottomLeftRadius 左下角的角度
android:bottomRightRadius 右下角的角度
< gradient >表示:漸變效果
android:angle 漸變的角度,默認是0,其值必須是45的整數倍。0表示從左邊到右,90表示從上到下。具體效果隨著角度的調整而產生變化,角度影響漸變方向。
android:centerX? 漸變中心的橫坐標點
android:centerY 漸變中心的縱坐標點
android:centerColor 漸變色的中間色
android:endColor 漸變色的結束色
android:gradientRadius 漸變的半徑(僅當 android:type 為radio時有效)
android:startColor 漸變色的起始色
android:type 漸變的類型
linear 線性漸變 (默認值)
radial 徑向漸變
sweep 掃描線漸變
android:useLevel 一般為false,當Drawable作為StateListDrawable時有效。
< padding >表示:內邊距
android:top \ bottom \ left \ right 分別設置上下左右的內邊距。
< size >表示:shape 大小
android:height 指定shape高
android:width 指定shape寬
說明:嚴格來說 shape 沒有寬高,但是我們指定size就有了所謂的寬高。當shape作為View 的背景時,shape 還是會被拉伸的,所以這個寬高并不是指定多少就固定了shape大小(對于Drawable都是沒有絕對的寬、高的)。
< solid >表示:純色填充 (與gradient互斥,純色或者漸變只能取一個)
android:color 指定shape的顏色
< stroke >表示:描邊
android:width 描邊的寬度,越大則shape的邊緣線越粗
android:color 描邊的顏色
android:dashGap 虛線的空隙的間隔
android:dashWidth 虛線的寬度
注意:如果 android:dashWidth 和 android:dashGap 兩者有任意一個為0,那么虛線效果就無法顯示。
三、ShapeDrawable 應用案例(仿微信雷達掃描)
先看看運行效果截圖:
運行效果截圖
說明:本案例使用到了 LayerDrawable ,后期會重點講解。這里先簡單介紹一下:LayerDrawable 對應 < layer-list> 標簽, LayerDrawable 是一個可以管理一組 drawable 對象的 drawable 。在 LayerDrawable 的 drawable 資源按照列表的順序繪制,后邊的 drawable 繪制在前邊的上邊,列表的最后一個 drawable 繪制在最上層。
1,繪制雷達波紋 :? /res/drawable/wave.xml
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
預覽效果:
雷達波紋
繪制掃描光束:/res/drawable/light_beam.xml
? ? ? ?
預覽效果:
掃描光束
Activity 布局文件:/res/layout/activity_shape_drawable.xml
? ? ? ?
Activity 代碼:
---
運行效果截圖:
運行效果
最后運行效果:
說明:錄制的GIF丟幀比較嚴重,所以掃描看起來不連貫了,在手機上運行效果不會是這樣的。
雷達掃描
Demo 源碼下載地址:http://download.csdn.net/detail/easyer2012/9837222