android xml一次添加多个<item>元素标签,通过标签直接生成shape,无需再写shape.xml BackgroundLibrary...

BackgroudLibrary

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

9aaaf4cb-5a0e-4df1-a2e9-ed712cdf76ec

依赖方式:

implementation "com.android.support:appcompat-v7:$supportVersion"

implementation 'com.noober.background:core:1.2.2'

版本更新:

1.0.5 解决android 8以下Fragment中view显示问题,解决水波纹不能与press事件共存问题,优化水波纹显示

1.2.0 增加对selector的支持

1.2.2 修复部分属性不生效的bug

示例效果

14dfa4f9-b861-4523-a5e0-4067330c79b7

使用方法

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

BackgroundLibrary.inject(context);

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

支持的自定义属性

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

shape类

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

名称类型

shaperectangle、oval、line、ring(暂时不支持)

solid_colorcolor

corners_radiusdimension

corners_bottomLeftRadiusdimension

corners_bottomRightRadiusdimension

corners_topLeftRadiusdimension

corners_topRightRadiusdimension

gradient_angleinteger

gradient_centerXfloat

gradient_centerYfloat

gradient_centerColorcolor

gradient_endColorcolor

gradient_startColorcolor

gradient_gradientRadiusdimension

gradient_typelinear、radial、sweep

gradient_useLevelboolean

size_widthdimension

size_heightdimension

stroke_widthdimension

stroke_colorcolor

stroke_dashWidthdimension

stroke_dashGapdimension

selector类

支持selector的所有属性:

名称类型

checkable_drawablecolor、reference

checked_drawablecolor、reference

enabled_drawablecolor、reference

selected_drawablecolor、reference

pressed_drawablecolor、reference

focused_drawablecolor、reference

focused_hoveredcolor、reference

focused_activatedcolor、reference

unCheckable_drawablecolor、reference

unChecked_drawablecolor、reference

unEnabled_drawablecolor、reference

unSelected_drawablecolor、reference

unPressed_drawablecolor、reference

unFocused_drawablecolor、reference

unFocused_hoveredcolor、reference

unFocused_activatedcolor、reference

其他属性

名称类型备注

ripple_enableboolean是否开启点击的水波纹效果

ripple_colorcolor水波纹颜色(如果开启,一定要有这个属性能生效)

unpressed_colorcolor没有press的时候的颜色(早版本的属性,可以被pressed_drawable替换)

pressed_colorcolorpress时候的颜色(早版本的属性,可以被unPressed_drawable替换)

使用例子

1.边框+背景+圆角

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" />

等同于

2、渐变

android:startColor="#63B8FF"

android:endColor="#4F94CD"/>

等同于

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" />

点击效果

7218a260-380b-4b86-b332-e9e8b4b3cb3a

第一个点赞效果:

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" />

就等同于:

android:drawable="@drawable/circle_like_pressed" />

android:drawable="@drawable/circle_like_normal" />

第二个按钮效果:

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一样。

简单的性能测试

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

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

33b22905-72ce-49e1-933c-bd09667fbe5a

a246c425-3c92-46f8-a78e-998cc2239cac

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

ea2c8976-df6f-448e-9e19-180bd9240912

fba51cd7-b3cb-41ee-86e8-d6effb3e0029

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

a23234ad-bd92-4e4f-bae0-b81f9a575987

0586e077-e891-4b38-ad03-a00a1f9f7af8

可以看得出来,其实通过自定义标签去创建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表示多个属性,暂时无法实现,如下:

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一样处理即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值