中文 | English
Nodrawable是一个旨在减少99%的drawable.xml文件的库,可直接在布局文件中对任意View声明drawable属性。
演示Demo:一种巧妙的drawable.xml替代方案-效果篇
仅需开启DataBinding,核心仅一个方法;
直接在布局中的View标签声明drawable属性,对View最终效果一目了然;
像使用View自身的属性一样,作用于任何View;
你可以按照以下方式集成,也可以直接拷贝库文件到项目中,仅2个类。
- 在root's build.gradle中加入Jitpack仓库:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
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效果在布局编辑器中无法实时预览;