开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情
之前有说到DataBinding中对集合和文字拼接的使用,这篇文章我们乘胜追击来讲讲BindingAdapter。不得不说,有了BindingAdapter的辅助,使用DataBinding更加得心应手,下面就来简单介绍下使用方法和其中遇到的坑。
个人理解,这个注解就是生成一个全局的控件属性。这个注解面向一个public static方法,方法名自己定义。注解方法的第一个形参就是我们想要对其创建属性的自定义命名,可以是一个字符串,也可是一个value命名的数组。第二个形参是个布尔值,意思是是否必填所有自定义参数。
@Target(ElementType.METHOD)
public @interface BindingAdapter {
String[] value();
boolean requireAll() default true;
}
被注解的属性是面向项目全局的。这个注解对应的方法中,传入对应属性值,我们通过自己的需要实现数据和控件的之间转化操作。
使用场景:
- ImageView网络图片加载
- shape的操作
- 点击事件的防抖
其实只要觉得方便,任何相关的操作都可在此进行,管理起来也比较方便,相当于全局管理。
网络图片加载
@BindingAdapter(value = ["remoteUrl", "placeholder", "errorId"], requireAll = false)
fun ImageView.remoteUrl(
url: String?,
placeholder: Int = 0,
errorId: Int = R.drawable.ic_load_fail
) {
loadImage(url, placeholder, errorId)
}
Kotlin扩展方法
//加载图片
fun ImageView.loadImage(
url: String,
placeholder: Int = 0,
errorPic: Int = R.drawable.ic_load_fail
) {
GlideApp.with(this.context)
.load(url)
.error(errorPic)
.placeholder(placeholder)
.into(this)
}
上面说到requireAll为ture时,则value内的三个属性都需要填写才不会报错,为false时则可任意选填其中的属性。
xml中
<ImageView
remoteUrl="@{bean.url}"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
shape操作
相信大家在开发中一定避免不了一些圆、秒变、渐变、虚线等ui效果。初期都是手动创建xml,每一个效果可能都要单独一个shape。即便后期有了一些第三方轮子,但视图避免不了需要多嵌套一层,这时候使用BindingAdapter,简直不要太爽。
@BindingAdapter(
value = [
"background_res",//背景色
"shape_solidColor",//填充颜色
"shape_radius",//圆角
"shape_strokeColor",//描边颜色
"shape_strokeWitdh",//描边宽度
"shape_dashWith",//描边虚线单个宽度
"shape_dashGap",//描边间隔宽度
"shape_isGradual",//是否渐变
"shape_startColor",//渐变开始颜色
"shape_centerColor",//渐变中间颜色
"shape_endColor",//渐变结束颜色
"shape_gradualOrientation",//渐变角度
"shape_tl_radius",//上左圆角
"shape_tr_radius",//上右圆角
"shape_bl_radius",//下左圆角
"shape_br_radius"//下右圆角
],
requireAll = false
)
fun View.setViewBackground(
//注意 这里的参数只能按照上面value值顺序排列 否则值对应不匹配
background_res: Int = 0,
solidColor: Int = Color.TRANSPARENT,
radius: Int = 0,
strokeColor: Int = Color.TRANSPARENT,
strokeWidth: Int = 0,
shape_dashWith: Int = 0,
shape_dashGap: Int = 0,
shape_isGradual: Boolean = false,
shape_startColor: Int = Color.TRANSPARENT,
shape_centerColor: Int = Color.TRANSPARENT,
shape_endColor: Int = Color.TRANSPARENT,
shape_gradualOrientation: Int = 1,//TOP_BOTTOM = 1 ,TR_BL = 2,RIGHT_LEFT = 3,BR_TL = 4,BOTTOM_TOP = 5,BL_TR = 6,LEFT_RIGHT = 7,TL_BR = 8
shape_tl_radius: Int = 0,
shape_tr_radius: Int = 0,
shape_bl_radius: Int = 0,
shape_br_radius: Int = 0,
) {
......
}
以上几乎包含了所有shape操作,都是非必填,可以任意搭配,实现自己想要的结果。需要注意的是,value中的属性名必须和自定义方法内入参下标对应,否则会出现意想不到的错误。
都说有优点就有缺点,开发过程中发现一个比较致命的缺点,视图无法预览,需要运行在手机上才能看到效果。但优点也是显而易见的,这么一个方法就能解决所有shape效果,你说香不香。
相信大家应该都知道怎么使用BindingAdapter了,其实还是得看个人习惯。如何使用起来觉得舒服,根据自己的编码习惯封装对应的方法,使得开发效率大大增幅。不仅解放了双手,出现问题的概率也会减少。希望这篇文章对大家有所帮助。
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情