Kotlin应该这样写系列
SharedPreferences用Kotlin应该这样写
Glide用Kotlin应该这样封装(一)
Glidhttpcliente用Kotlin应该这样封装(二kotlin现在不火了)
前语
一般我们在res/drawable
下面git指令自定义shape
和selector
来满足一些UI的规划,可是因为xml
终究转化为drawable
需求经过IO
或反射创立,会有一些功用损耗,其他跟着项目的增大和模块化等,许多通用的款式github永久回家地址并不能快速复用,需求kotlin面试题合理的项目资源处理标准才华实施。那么经过代码直接创立这些drawable
,能够在必http 500定程度上下降这些副作用。本篇介绍用kotlin DSL
简练的语法特性来结束常见的drawable
.
代码对应作用预览
集成和运用
- 在项目级的build.gradle文件种增加仓库Jitpack:
allprojects {kotlin教程
repositories {
..gitlab.
maven { url 'https://jitpack.io' }
}
}
- 增加依靠
dependencies {
implementation 'com.gitgit教程hub.forJrking:DrawableDsl:0.0.3’kotlin言语
}
- 扔掉xmlhttpclient创立方法示例(其他拜见demo)
// infix用法用于去掉括号更加简练,具体后面说明
image src shapeDrawkotlin和javaable {
//指定shakotlin言语pe款式
shape(ShapeBukotlin下载ilder.Shape.RECTANGLE)
//圆角,支持4个角独自设置
corner(20f)
//solid 色彩
solid("gradle下载#ABE2E3")
/Git/stroke 颜github中文官网网页色,边框dp,虚线设置kotlin为什么盛行不起来
stroke(R.color.white, 2f, 5f, 8f)
}
//按钮点击款式
btn.background = selectorDrawable {
//默许款式
normal = shapeDrawabgradlele {
corner(20f)
gradient(90, R.color.F9779http署理4, R.color.C623AA2)
}
//点击作用
pressed = shapeDrawable {
corner(20f)
sohttp 500lid("#84232323gradle翻译")
}
}
结束思路
xml怎样转化成drawablegitlab
xml变成drawable,经过agradle什么意思ndroid.graphics.drawable.DrawableInflate源码码头r
这个类来IO解析标签创立,然后经过解析标签再设置httpclient特色:
//标签创立
private Drawablegradle翻译 inflateFromTag(@NonNull String name) {
switch (name) {
case "selkotlin下载ector":
return new StateListDrawabhttpclientlkotlin为什么盛行不起来e();
case "level-kotlin下载list":
return new LevelListDrawable();kotlin下载
case "layer-list":
return new LayerDrawable();
....
case "color":
return new ColorDrawable();
case "shape":
return new GradientDrawable();
case "vectorkotlin面试题"httpwatch:
return new VectorDrawable();
...
}
}
//反射创立
private Drawable inflateFromhttps和http的区别Class(@NonNull String className) {
try {
Constructor<? extends Drawable> constructor;
synchronized (CONSTkotlin面试题RUCTOR_MAP) {
constructor = CONSTRUCTOR_MAP.getgradle教程(className);
if (constructor == null) {
final Class<?源码网站 extends Drawable> clazz = mClassLoader.loadClass(className).asSubclass(Dragitlabwable.clkotlin言语ass);
congiti轮胎是什么品牌strugradle装置装备ctor = clazz.getConstgiteerKotlinuctor();
CONSTRUCTOgitlabR_MAP.put(className, constructor);
}
}
return constructor.ne源码编辑器wInstance();
} catch (NoSuchMethodException e) {
...
}
代码结束
因为创立shape
等需求设置各种特色来构建,比较契合build
规划方法,那我们首要封装build
方法的shapeBuilder
,这样http://192.168.1.1登录做尽管代码比起直git指令接运用apply{}
要多,可是能够让纯java
项目用起来很舒服,其他结束请查看源码:
class ShapeBuilder : Dhttp 500rawableBuilder {
private var mRadius = 0f
private var mWidth = 0f
private var mHeight = 0f
...
prhttpwatchivate var mShape = GradientDrawable.RECTAN源码网站GLE
private var mSolidColKotlinor = 0
/**别离设置四个源码码头角的圆角*/
fun corner(leftTophttp 404: Float,rightTohttp署理p: Float,leftBottom: Float,right源码B源码共享网ottom: Float): Shakotlin实战peBuilder {
.源码编辑器手机版下载...if(dp)dp2px(leftTop) else leftTop
return this
}
fun solid(@ColorRes colorId: Int): ShapeBuilder {
mSolidColor = ContextCompat.getColor(context, colorId)
return this
}
// 省掉其他参数设置办http 302法 具体代码查看源码
override fun builkotlin发音d(): Drawable {
val gradientDrawable = GradientDrawable()
gradientDrawable = Grad源码码头ientDrawable()
gradientDrawable.setColor(mSolidColor)
gradientDrawable.shape = mShape
....其他参数设置
retgit教程urn gragradledientDrawabhttps和http的区别le
}源码共享网
}
把build方https和http的区别式转化为dsl
理论上悉数的build方法都能够轻松转化kotlin面试题为dsl写法:
in源码共享网line fun shapeDrawable(builder: ShapeBkotlin实战uilder.() -> Unit): Drawable {
retuhttp://www.baidu.comrn ShapeBuilder().also(builder).build()
}
//运用方法
val drawable = shapeDrawable{
...
}
备注:dsl用法拜见/post/695318… 中dsl末节
函数去括号
经过上面封gitlab装源码资本现已结束了dsl的写gradle什么意思法,一般setBackground
能够经过setter
简化,可是我发现因为有些api规划还需求加括号,这样不太kothttp协议lin:
//容易阅读
iv1.background = shapeDrawable {
shape(ShapeB源码编辑器编程猫下载uilder.Shape.RECTANGLE)
solid("#ABgradle装置装备E2E3")
}
//多了括号看起来不舒服
iv2.setImageDrawable(shapeDrawable {
solid("#84232323")
})
怎样去掉括号呢?2种方法infix函数
(中缀表达)和property setter
-
infigradle下载慢解决方法x函数
特色和标准:
- Kotlin允许在不运用
括号
和点号的情况下调用函数 - 有必要只需一个参数
- 有必要是成gitlab员函数或扩展函数
- 不支持可变参数和带默许值参数
/**为悉数ImageView增加扩展infix函数 交游不断掉括号*/
infgradle发音ix fun ImageView.src(drawagiti轮胎是什么品牌ble: Dragitlabwable?) {
this.setImageDrawable(drawgradle教程able)
}
//运用如下
iv2 src shapeDrawablhttp 500e {
shape(ShapeBuilder.Shape.OVAL)
solid("#E3ABC2gitee")
}
当然了代码是用来阅读的。个人认为假定我们很多运用infix函数
,阅读困难会大大增加,所以建议函数命名有必要可kotlin和java以直击
函数kotlin发音功用,源码并且函数功用简略且单一。
-
propertykotlin实战 setter
方法,主要运用kotlin能够简化setter
为变量 =
交游不断括号:
/**扩展变量*/
var ImageView.src: Drawable
get() = drawable
set(value) {
this.setImageDrawable(value)
}
//运用如下
iv2.src = shapeDrawhttp://www.baidu.comable {
shape(ShapeBuilder.http署理Shape.OVA源码之家L源码集市)
solid("#E3ABC2")
}
感谢@叮冰冷 指点,欢迎我们评论一起学习,共同进步。
优缺点
长处:
- 代码直接创立比起xml方法可gradle打包以进步功用
- dgradle装备sl方法比起build方法和调用方法设置更加简练契合kotlin风格
- 经过适合的代码处理可kotlin下载以复用这些代码,比xml处理便利
缺点:
- 没有as的预kotlin现在不火了览功用,源码之家只需经过上机观测
- api还没有掩gradle盖git教程悉数drawable特色(例如shape = ring等)
后语
上面把的DrawableDsl根底用法介绍完了,欢迎我们运用,欢迎提Issues,记住给个star哦。Github链接:github.com/forJrking/D…