Drawable Resource 之旅(二):ShapeDrawable 詳解與應用(仿微信雷達掃描)

一、前言

在我們的日常開發中,需要大量的圖片來美化我們的 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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 2015年伊始,Google發布了關于Android性能優化典范的專題, 一共16個短視頻,每個3-5分鐘,幫助開...
    zizi192閱讀 543評論 0 3
  • 2015新年伊始,Google發布了關于Android性能優化典范的專題,一共16個短視頻,每個3-5分鐘,幫助開...
    huldaZhang閱讀 483評論 0 2
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,285評論 25 708
  • Overdraw(過度繪制)描述的是屏幕上的某個像素在同一幀的時間內被繪制了多次。在多層次的UI結構里面,如果不可...
    gogoingmonkey閱讀 908評論 0 3
  • 馮導可真算得上敢講敢言的真性情,前有微博上同王家公子的唇槍舌戰,引得“萬眾矚目”,而近日,采訪中又出驚人之語,在網...
    山羊君閱讀 432評論 0 1