通常我们在res/drawable下面自定义shape和selector来满足一些UI的设计,但是由于xml最终转换为drawable需求经过IO或反射创立,会有一些功用损耗,另外随着项目的增大和模块化等,很多通用的样式并不能快速复用,需求合理的项目资源管理标准才能实施。那么经过代码直接创立这些drawable,可以在一定水平上降低这些反作用。本篇引见用kotlin DSL繁复的语法特性来完成常见的drawable。
代码对应效果预览
集成和运用在项目级的build.gradle文件种添加仓库Jitpack:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
添加依赖
dependencies {
implementation 'com.github.forJrking:DrawableDsl:0.0.3’
}
丢弃xml创立方式示例(其他参见demo)
// infix用法用于去掉括号愈加繁复,详细前面阐明
image src shapeDrawable {
//指定shape样式
shape(ShapeBuilder.Shape.RECTANGLE)
//圆角,支持4个角独自设置
corner(20f)
//solid 颜色
solid("#ABE2E3")
//stroke 颜色,边框dp,虚线设置
stroke(R.color.white, 2f, 5f, 8f)
}
//按钮点击样式
btn.background = selectorDrawable {
//默许样式
normal = shapeDrawable {
corner(20f)
gradient(90, R.color.F97794, R.color.C623AA2)
}
//点击效果
pressed = shapeDrawable {
corner(20f)
solid("#84232323")
}
}
完成思绪 xml如何转换成drawablexml变成drawable,经过android.graphics.drawable.DrawableInflater这个类来IO解析标签创立,然后经过解析标签再设置属性:
//标签创立
private Drawable inflateFromTag(@NonNull String name) {
switch (name) {
case "selector":
return new StateListDrawable();
case "level-list":
return new LevelListDrawable();
case "layer-list":
return new LayerDrawable();
....
case "color":
return new ColorDrawable();
case "shape":
return new GradientDrawable();
case "vector":
return new VectorDrawable();
...
}
}
//反射创立
private Drawable inflateFromClass(@NonNull String className) {
try {
Constructor<? extends Drawable> constructor;
synchronized (CONSTRUCTOR_MAP) {
constructor = CONSTRUCTOR_MAP.get(className);
if (constructor == null) {
(责任编辑:admin)