noDrawable

Project Url: whataa/noDrawable
Introduction: 一个旨在减少 99%的 drawable.xml 文件的库,可直接在布局文件中对任意 View 声明 drawable 属性。
More: Author   ReportBugs   
Tags:

中文 | English

Nodrawable 是一个旨在减少 99%的 drawable.xml 文件的库,可直接在布局文件中对任意 View 声明 drawable 属性。

方案原理:一种巧妙的 drawable.xml 替代方案

演示 Demo:一种巧妙的 drawable.xml 替代方案-效果篇

特性

① 成本低

仅需开启 DataBinding,核心仅一个方法;

② 高可读性

直接在布局中的 View 标签声明 drawable 属性,对 View 最终效果一目了然;

③ 适配任意 View

像使用 View 自身的属性一样,作用于任何 View;

集成

你可以按照以下方式集成,也可以直接拷贝库文件到项目中,仅 2 个类。

  1. 在 root's build.gradle 中加入 Jitpack 仓库:
allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
  1. 添加依赖到你的 app's build.gradle 中
    dependencies {
     ...
     implementation 'com.github.whataa:noDrawable:${RELEASE}'
    }
    
  2. 让你的项目支持 DataBinding:
android {
    ...
    dataBinding {
        enabled = true
    }
}

使用

  1. 将你的布局转化为 DataBinding 的形式:
<layout>
    <!-- 你的布局内容 -->
<layout>
  1. 在需要的 View 标签中声明 drawable 属性(注意,没有限定符):

假如一个 Button 的背景是圆角,并且是红色的

<layout>
    ...
    <Button
        drawable_radius="@{10}"
        drawable_solidColor="@{0xffff0000}"
        android:layout_width="150dp"
        android:layout_height="50dp" />
    ...
<layout>
  1. 在 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 效果在布局编辑器中无法实时预览;

开源协议

Apache-2.0

Apps
About Me
GitHub: Trinea
Facebook: Dev Tools