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参考文档

更多相关文章

  1. 告别Dagger2模板代码:DaggerAndroid原理解析
  2. 获取Android的Java源代码并在Eclipse中关联查看
  3. EditText实现输入限制和校验功能实例代码
  4. android关机重启流程代码
  5. 《第一行代码(第二版)》学习(二)
  6. Android源代码编译脚本
  7. Eclipse环境下格式化Android的代码风格

随机推荐

  1. Android(安卓)Wear
  2. android堆栈信息,android死锁致重启问题分
  3. android Activity 变成Dialog的方法
  4. Android线程模型
  5. ch017 Android(安卓)样式与主题
  6. android银行卡匹配、详情展开动画、仿爱
  7. Android(安卓)studio 页面布局无法显示问
  8. android游戏开发项目实战——数独
  9. android启动项目报错Android(安卓)Launch
  10. ListView设置分隔线间距及按下透明