noDrawable
Here is ofollow,noindex" target="_blank">English Doc
NoDrawable
Nodrawable是一個旨在減少99%的drawable.xml檔案的庫,可直接在佈局檔案中對任意View宣告drawable屬性。
方案原理: 一種巧妙的drawable.xml替代方案
演示Demo: 一種巧妙的drawable.xml替代方案-效果篇
特性
① 成本低
僅需開啟DataBinding,核心僅一個方法;
② 高可讀性
直接在佈局中的View標籤宣告drawable屬性,對View最終效果一目瞭然;
③ 適配任意View
像使用View自身的屬性一樣,作用於任何View;
整合
你可以按照以下方式整合,也可以直接拷貝庫檔案到專案中,僅2個類。
- 在root's build.gradle中加入Jitpack倉庫:
allprojects { repositories { ... maven { url 'https://jitpack.io' } } }
- 新增依賴到你的app's build.gradle中
dependencies { ... implementation 'com.github.whataa:noDrawable:${RELEASE}' }
- 讓你的專案支援DataBinding:
android { ... dataBinding { enabled = true } }
使用
- 將你的佈局轉化為DataBinding的形式:
<layout> <!-- 你的佈局內容 --> <layout>
- 在需要的View標籤中宣告drawable屬性( 注意,沒有限定符 ):
假如一個Button的背景是圓角,並且是紅色的
<layout> ... <Button drawable_radius="@{10}" drawable_solidColor="@{0xffff0000}" android:layout_width="150dp" android:layout_height="50dp" /> ... <layout>
- 在Activity中應用你的佈局:
假設你的佈局檔名為activity_main.xml
DataBindingUtil.setContentView(this, R.layout.activity_main);
現在,執行看看效果吧。
屬性文件
說明:本專案僅提供對日常開發中最常用的屬性支援,並非支援所有drawable屬性。
屬性名 | 說明 | 用例 |
---|---|---|
drawable_shapeMode | shape的型別,參考 @ShapeMode 註解 |
@{0} |
drawable_solidColor | solid標籤的顏色 | @{0xffffffff} |
drawable_strokeColor | stroke標籤的顏色 | @{0xffffffff} |
drawable_strokeWidth | stroke標籤的寬度 | @{1} |
drawable_strokeDash | stroke標籤的虛線中的實線段長度 | @{2} |
drawable_strokeDashGap | stroke標籤的虛線中的虛線段長度 | @{2} |
drawable_radius | corner標籤的圓角 | @{10} |
drawable_radiusLT | corner標籤的圓角-左上 | @{10} |
drawable_radiusLB | corner標籤的圓角-左下 | @{10} |
drawable_radiusRT | corner標籤的圓角-右上 | @{10} |
drawable_radiusRB | corner標籤的圓角-右下 | @{10} |
drawable_startColor | gradient標籤的漸變起始色 | @{0xffffffff} |
drawable_centerColor | gradient標籤的漸變中間色 | @{0xffffffff} |
drawable_endColor | gradient標籤的漸變結束色 | @{0xffffffff} |
drawable_orientation | gradient標籤的漸變方向,參考@Orientation註解 | @{0} |
drawable_gradientType | gradient標籤的漸變型別,參考@GradientType註解 | @{0} |
drawable_radialCenterX | gradient標籤的radial型別的中心X,0~1 | @{0.5} |
drawable_radialCenterY | gradient標籤的radial型別的中心Y,0~1 | @{0.5} |
drawable_radialRadius | gradient標籤的radial型別的半徑 | @{10} |
drawable_width | size標籤的寬 | @{10} |
drawable_height | size標籤的高 | @{10} |
drawable_marginLeft | inset標籤的insetLeft | @{-1} |
drawable_marginTop | inset標籤的insetTop | @{-1} |
drawable_marginRight | inset標籤的insetght | @{-1} |
drawable_marginBottom | inset標籤的insetbottom | @{-1} |
drawable_ringThickness | shape為ring型別時的厚度 | @{10} |
drawable_ringThicknessRatio | shape為ring型別時的厚度比例 | @{1} |
drawable_ringInnerRadius | shape為ring型別時的內徑半徑 | @{10} |
drawable_ringInnerRadiusRatio | shape為ring型別時的內徑半徑比例 | @{1} |
同時還支援selector標籤的常用狀態,包括: checked, checkable, enabled, focused, pressed, selected
,對應以上的屬性名如下舉例:
- drawable_checked_solidColor
- drawable_checkable_solidColor
- drawable_enabled_solidColor
- ...
另外,還提供了直接指定drawable.xml引用的屬性,如下舉例:
屬性名 | 說明 | 用例 |
---|---|---|
drawable | 普通狀態下的drawable引用屬性 | @{@drawable/shape_button} |
drawable_checked | checked狀態下的drawable引用屬性 | @{@drawable/shape_button} |
drawable_checkable | checkable狀態下的drawable引用屬性 | @{@drawable/shape_button} |
drawable_enabled | enabled狀態下的drawable引用屬性 | @{@drawable/shape_button} |
drawable_focused | focused狀態下的drawable引用屬性 | @{@drawable/shape_button} |
drawable_pressed | pressed狀態下的drawable引用屬性 | @{@drawable/shape_button} |
drawable_selected | selected狀態下的drawable引用屬性 | @{@drawable/shape_button} |
注意事項
- 屬性開頭沒有形如
android:
或app:
的限定符; - 引入佈局時,必須按照DataBinding的方案來引入(即不能用setContentView(xxx)),否則沒有效果;
- 資料繫結必須使用
@{}
的形式,這是DataBinding的約束; - 本庫以在內部將
@{}
中的數值處理為了dp單位,具體可檢視Drawables.create
方法; - 本庫在values檔案中預置了幾個可選的integer值用以表示對應的列舉型別,用以提高可讀性;
- 有些屬性新增後可能不是你想要的效果,你可以參考該 連結 檢視用法是否正確(個人覺得該連結的文章寫得非常好);
- 編譯錯誤出現:cannot find symbol class DataBinderMapperImpl 時,請檢視 issues#1
限制
- 最低支援的Android SDK版本為 16 ;
- 僅支援絕大多數常用的drawable屬性,其它屬性可自行擴充套件;
- 由DataBinding的特性決定,drawable效果在佈局編輯器中無法實時預覽;