noDrawable
Introduction: 一个旨在减少 99%的 drawable.xml 文件的库,可直接在布局文件中对任意 View 声明 drawable 属性。
Tags:
中文 | English
Nodrawable 是一个旨在减少 99%的 drawable.xml 文件的库,可直接在布局文件中对任意 View 声明 drawable 属性。
演示 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 效果在布局编辑器中无法实时预览;