BackgroundLibrary

Introduction: A framework for directly generating shape through Tags, no need to write shape.xml again(通过标签直接生成 shape,无需再写 shape.xml)
More: Author   ReportBugs   
Tags:

A framework for directly generating shape through Tags, no need to write shape.xml again(通过标签直接生成 shape,无需再写 shape.xml)

English.md

依赖方式:

implementation "com.android.support:appcompat-v7:$supportVersion"
implementation 'com.noober.background:core:1.2.5'

版本更新:

1.0.5 解决 android 8 以下 Fragment 中 view 显示问题,解决水波纹不能与 press 事件共存问题,优化水波纹显示
1.2.0 增加对 selector 的支持
1.2.2 修复部分属性不生效的 bug
1.2.3 checkbox radiobutton 使用的 bug
1.2.4 新增了 text 不同状态变色的支持
1.2.5 去除 kotlin 依赖

示例效果

使用方法

1、在 BaseActivity 中的 super.onCreate 之前调用。

BackgroundLibrary.inject(context);

2、在 layout 中直接添加属性即可。

博文使用介绍

支持的自定义属性

下面是所有的自定义属性,使用方法和 shape、selector 完全一样

shape 类

支持 shape 的所有属性,命名规则就是标签名 _ 标签属性名

名称 类型
shape rectangle、oval、line、ring(暂时不支持)
solid_color color
corners_radius dimension
corners_bottomLeftRadius dimension
corners_bottomRightRadius dimension
corners_topLeftRadius dimension
corners_topRightRadius dimension
gradient_angle integer
gradient_centerX float
gradient_centerY float
gradient_centerColor color
gradient_endColor color
gradient_startColor color
gradient_gradientRadius dimension
gradient_type linear、radial、sweep
gradient_useLevel boolean
size_width dimension
size_height dimension
stroke_width dimension
stroke_color color
stroke_dashWidth dimension
stroke_dashGap dimension

selector 类

支持 selector 的所有属性:

名称 类型
checkable_drawable color、reference
checked_drawable color、reference
enabled_drawable color、reference
selected_drawable color、reference
pressed_drawable color、reference
focused_drawable color、reference
focused_hovered color、reference
focused_activated color、reference
unCheckable_drawable color、reference
unChecked_drawable color、reference
unEnabled_drawable color、reference
unSelected_drawable color、reference
unPressed_drawable color、reference
unFocused_drawable color、reference
unFocused_hovered color、reference
unFocused_activated color、reference
关于 text 颜色的设置
checkable_textColor color
checked_textColor color
enabled_textColor color
selected_textColor color
pressed_textColor color
focused_textColor color
unCheckable_textColor color
unChecked_textColor color
unEnabled_textColor color
unSelected_textColor color
unPressed_textColor color
unFocused_textColor color

其他属性

名称 类型 备注
ripple_enable boolean 是否开启点击的水波纹效果
ripple_color color 水波纹颜色(如果开启,一定要有这个属性能生效)

使用例子

1.边框+背景+圆角

<TextView
    android:layout_width="130dp"
    android:layout_height="36dp"
    android:gravity="center"
    android:text="TextView"
    android:textColor="#8c6822"
    android:textSize="20sp"
    app:corners_radius="4dp"
    app:solid_color="#E3B666"
    app:stroke_color="#8c6822"
    app:stroke_width="2dp" />

等同于

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="2dp"/>
    <solid android:color="#E3B666"/>
    <stroke android:color="#E3B666" android:width="2dp"/>
</shape>

2、渐变

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="2dp"/>
    <gradient android:angle="0" 
              android:startColor="#63B8FF"
              android:endColor="#4F94CD"/>
</shape>

等同于

 <Button
    android:id="@+id/btn"
    android:layout_width="130dp"
    android:layout_height="36dp"
    android:layout_marginTop="5dp"
    android:gravity="center"
    android:padding="0dp"
    android:text="跳转到列表"
    android:textColor="#4F94CD"
    android:textSize="20sp"
    app:corners_radius="2dp"
    app:gradient_angle="0"
    app:gradient_endColor="#4F94CD"
    app:gradient_startColor="#63B8FF" />

点击效果

第一个点赞效果:

android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginTop="5dp"
app:pressed_drawable="@drawable/circle_like_pressed"
app:unPressed_drawable="@drawable/circle_like_normal" />

就等同于:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
        android:drawable="@drawable/circle_like_pressed" />
    <item android:state_pressed="false"
        android:drawable="@drawable/circle_like_normal" />
</selector>

第二个按钮效果:

<Button
        android:layout_width="300dp"
        android:layout_height="50dp"
        android:layout_marginTop="5dp"
        android:gravity="center"
        android:padding="0dp"
        android:text="有波纹触摸反馈的按钮"
        android:textColor="@android:color/white"
        android:textSize="20sp"
        app:corners_radius="20dp"
        app:pressed_drawable="#71C671"
        app:ripple_color="#71C671"
        app:ripple_enable="true"
        app:stroke_color="#8c6822"
        app:stroke_width="2dp"
        app:unPressed_drawable="#7CFC00" />

使用其实基本和 selector shape 一样。

3.点击文字变色

<Button
    android:layout_width="300dp"
    android:layout_height="50dp"
    android:layout_marginTop="5dp"
    android:gravity="center"
    android:padding="0dp"
    android:text="点击文字变色"
    app:pressed_textColor="#919DAF"
    app:unPressed_textColor="@android:color/holo_red_dark"/>

简单的性能测试

我用原生的方法写了例子里面的 shape 和 selector,做了一个比较简单的测试:

下面两幅图,是没有 background 时打开 MainActivity 界面的启动时间和打开 ListActivity 的启动时间

下面两幅图,是使用原生 drawable.xml 去设置 background 时打开 MainActivity 界面的启动时间和打开 ListActivity 的启动时间

最后这两幅图,是使用自定义标签去设置 background 时打开 MainActivity 界面的启动时间和打开 ListActivity 的启动时间

可以看得出来,其实通过自定义标签去创建 drawable 并没有真的很损耗性能,其实与本身的 drawable.xml 差不多,但是在 list 中,如果没有使用 viewholer,会比较消耗性能,如果使用的话,应该差不多。
不过这个分析比较简单,只能看个大概,给担心性能的同学心里可以有个底。

使用注意

1、selector 的相关属性,如果传入的 drawable 不是颜色的资源,会覆盖掉 shape 设置的属性
2、在根布局添加

    tools:ignore="MissingPrefix"

可以防止报红
3、因为 layoutInflater 限制了只能有一个 factory,如果有其他库已经使用了 setFactory 方法,比如换肤的库,只需要在其他库调用 layoutInflater.setFactory 之后调用

BackgroundLibrary.inject2(context);

这样其他的库与本库同样可以生效。
4、selector 一个 item 表示多个属性,暂时无法实现,如下:

 <item android:state_pressed="true" android:state_focused="true"
    android:drawable="@drawable/button_pressed" />

因为无法用一个属性去表示两种状态,有思路的同学可以告诉我
5、fragment 使用无需任何处理,其 Activity 调用 inject 即可
6、listView,recyclerView 使用也无需任何处理。 如果不生效,只需要

//在调用 inflate 只需调用一次 context,保证 adapter 创建 View 时传入的是同一个 context 即可
BackgroundLibrary.inject(context);

View item = LayoutInflater.from(context).inflate(xxx)

7、自定义 View 中调用了 inflate,同 listView 一样处理即可
8、关于水波纹,如果光设置下面两个属性是无效的,必须还要有个填充颜色的属性,原因如下:

app:ripple_color="#71C671"
app:ripple_enable="true"

水波纹需要设置一个默认背景颜色,也就是填充颜色。比如 app:solid_color 或者 app:unPressed_drawable 或者 app:unFocussed_drawable 等都行,这些都是默认等背景颜色。而 app:ripple_color 是波纹的颜色。如果没有一个背景色,这个波纹颜色是无法显示的

Support Me
Apps
About Me
Google+: Trinea trinea
GitHub: Trinea