Android KTX简介
Android KTX简介
- Android KTX简介
- 介绍
- 主要功能
- 字符串转为URI
- SharedPreferences
- Path
- View的onPreDraw监听
- 代码接入
- 原理介绍
- Extensions
- Lambdas
- Default Arguments
- 相关链接
介绍
昨天Google爸爸又发布了一个Android工具库,是使用Kotlin实现了。自从17年5月份声明支持Kotlin作为Android官方开发语言以来,Google爸爸对Kotlin的态度还是很积极的。
而且Jake大神后面也加入了Google,从博客的内容来看,也是这个类库也是出自Jake大神之手,所以特来拜读下。
主要功能
从官方简介来看,主要是对Android原始的Api做了一些扩展,方便开发调用,使代码更加自然和简单,下面列举几个例子,详细的API介绍可以参考官方API文档。
字符串转为URI
通常情况下为Uri.parse(uriString)
,但是Android KTX 会为字符串添加一个扩展函数,使字符串更加自然地转换为 URI。
// Kotlinval uri = Uri.parse(uriString)// android KTXval uri = uriString.toUri()
SharedPreferences
SharedPreferences也经常使用,使用 Android KTX后,代码也简介不少。
// kotlinsharedPreferences.edit() .putBoolean("key", value) .apply()// KTXsharedPreferences.edit { putBoolean("key", value)}
Path
两个路径之间的距离改变了100px
// kotlinval pathDifference = Path(myPath1).apply { op(myPath2, Path.Op.DIFFERENCE)}canvas.apply { val checkpoint = save() translate(0F, 100F) drawPath(pathDifference, myPaint) restoreToCount(checkpoint)}// KTXval pathDifference = myPath1 - myPath2canvas.withTranslation(y = 100F) { drawPath(pathDifference, myPaint)}
View的onPreDraw监听
触发了视图中 onPreDraw 的回调
// kotlinview.viewTreeObserver.addOnPreDrawListener( object : ViewTreeObserver.OnPreDrawListener { override fun onPreDraw(): Boolean { viewTreeObserver.removeOnPreDrawListener(this) actionToBeTriggered() return true } })// KTXview.doOnPreDraw { actionToBeTriggered()}
代码接入
代码接入也很简单,首先项目代码必须接入kotlin,这里不做介绍,直接使用Android Studio创建基于Kotlin的项目即可,然后添加相关依赖,现在的版本还是0.1
。
repositories { google()}dependencies { implementation 'androidx.core:core-ktx:0.1'}
原理介绍
透过现象看本质,这样使用起来就不会迷惑,而且遇到问题也能方便排查。
主要使用Kotlin语言的几个特性,了解了这些特性后,我们自己也能很方便的进行封装,这样就形成了我们自己的类库,便于自己技术的沉淀。
Extensions
上面的第一个例子,uri的封装就是利用了这个,Kotlin的官方文档也有介绍。
直接看源码就行了。
inline fun String.toUri(): Uri = Uri.parse(this)
其实就是对String做了一个扩展,如果使用Java的就很容易理解,如下所示,这种方式在日常开发中也很容易见到。
public class StringUtil{ public static Uri parse(String uriString) { return Uri.parse(uriString); }}
Lambdas
第二个例子主要使用了Lambdas这个特性,Kotlin文档在这里。
还是贴代码,首先对SharedPreferences
做了扩展,然后这个扩展函数的参数是一个闭包,当函数最后一个参数是闭包的时候,函数的括号可以直接省略,然后在后面接上闭包就行了。
inline fun SharedPreferences.edit(action: SharedPreferences.Editor.() -> Unit) { val editor = edit() action(editor) editor.apply()}
Default Arguments
这个特性上面的例子没有,可以单独列举,如下所示。官方文档介绍。
也是就说,当一个函数中含有多个参数时候,不需要像Java中那样,依次赋值,可以仅仅赋需要的即可,Java中常见的解决的方法是方法重载,挨个传入默认值。
class ViewTest { private val context = InstrumentationRegistry.getContext() private val view = View(context) @Test fun updatePadding() { view.updatePadding(top = 10, right = 20) assertEquals(0, view.paddingLeft) assertEquals(10, view.paddingTop) assertEquals(20, view.paddingRight) assertEquals(0, view.paddingBottom) }}
看updatePadding
方法定义。
fun View.updatePadding( @Px left: Int = paddingLeft, @Px top: Int = paddingTop, @Px right: Int = paddingRight, @Px bottom: Int = paddingBottom) { setPadding(left, top, right, bottom)}
对于默认参数,还可以这样玩,比如在Java中,常见的有建造在模式,对每个参数进行赋值,然后创建一个对象,如果使用这种特性,不需要改变的值,可以直接用默认值表示,这样在编码的时候,就会显得很简洁。
相关链接
官方博客
Github链接
API参考文档
更多相关文章
- 告别Dagger2模板代码:DaggerAndroid原理解析
- 获取Android的Java源代码并在Eclipse中关联查看
- EditText实现输入限制和校验功能实例代码
- android关机重启流程代码
- 《第一行代码(第二版)》学习(二)
- Android源代码编译脚本
- Eclipse环境下格式化Android的代码风格