Android KTX簡介
介紹
昨天Google爸爸又發(fā)布了一個Android工具庫十绑,是使用Kotlin實現(xiàn)了咧栗。自從17年5月份聲明支持Kotlin作為Android官方開發(fā)語言以來,Google爸爸對Kotlin的態(tài)度還是很積極的哈恰。
而且Jake大神后面也加入了Google,從博客的內(nèi)容來看万细,也是這個類庫也是出自Jake大神之手样眠,所以特來拜讀下。
主要功能
從官方簡介來看挤土,主要是對Android原始的Api做了一些擴(kuò)展,方便開發(fā)調(diào)用误算,使代碼更加自然和簡單,下面列舉幾個例子仰美,詳細(xì)的API介紹可以參考官方API文檔。
字符串轉(zhuǎn)為URI
通常情況下為Uri.parse(uriString)
儿礼,但是Android KTX 會為字符串添加一個擴(kuò)展函數(shù)筒占,使字符串更加自然地轉(zhuǎn)換為 URI。
// Kotlin
val uri = Uri.parse(uriString)
// android KTX
val uri = uriString.toUri()
SharedPreferences
SharedPreferences也經(jīng)常使用蜘犁,使用 Android KTX后,代碼也簡介不少止邮。
// kotlin
sharedPreferences.edit()
.putBoolean("key", value)
.apply()
// KTX
sharedPreferences.edit {
putBoolean("key", value)
}
Path
兩個路徑之間的距離改變了100px
// kotlin
val pathDifference = Path(myPath1).apply {
op(myPath2, Path.Op.DIFFERENCE)
}
canvas.apply {
val checkpoint = save()
translate(0F, 100F)
drawPath(pathDifference, myPaint)
restoreToCount(checkpoint)
}
// KTX
val pathDifference = myPath1 - myPath2
canvas.withTranslation(y = 100F) {
drawPath(pathDifference, myPaint)
}
View的onPreDraw監(jiān)聽
觸發(fā)了視圖中 onPreDraw 的回調(diào)
// kotlin
view.viewTreeObserver.addOnPreDrawListener(
object : ViewTreeObserver.OnPreDrawListener {
override fun onPreDraw(): Boolean {
viewTreeObserver.removeOnPreDrawListener(this)
actionToBeTriggered()
return true
}
})
// KTX
view.doOnPreDraw {
actionToBeTriggered()
}
代碼接入
代碼接入也很簡單这橙,首先項目代碼必須接入kotlin奏窑,這里不做介紹,直接使用Android Studio創(chuàng)建基于Kotlin的項目即可屈扎,然后添加相關(guān)依賴埃唯,現(xiàn)在的版本還是0.1
。
repositories {
google()
}
dependencies {
implementation 'androidx.core:core-ktx:0.1'
}
原理介紹
透過現(xiàn)象看本質(zhì)鹰晨,這樣使用起來就不會迷惑墨叛,而且遇到問題也能方便排查。
主要使用Kotlin語言的幾個特性模蜡,了解了這些特性后漠趁,我們自己也能很方便的進(jìn)行封裝,這樣就形成了我們自己的類庫忍疾,便于自己技術(shù)的沉淀闯传。
Extensions
上面的第一個例子,uri的封裝就是利用了這個卤妒,Kotlin的官方文檔也有介紹甥绿。
直接看源碼就行了。
inline fun String.toUri(): Uri = Uri.parse(this)
其實就是對String做了一個擴(kuò)展则披,如果使用Java的就很容易理解共缕,如下所示,這種方式在日常開發(fā)中也很容易見到士复。
public class StringUtil{
public static Uri parse(String uriString) {
return Uri.parse(uriString);
}
}
Lambdas
第二個例子主要使用了Lambdas這個特性图谷,Kotlin文檔在這里。
還是貼代碼判没,首先對SharedPreferences
做了擴(kuò)展蜓萄,然后這個擴(kuò)展函數(shù)的參數(shù)是一個閉包,當(dāng)函數(shù)最后一個參數(shù)是閉包的時候澄峰,函數(shù)的括號可以直接省略嫉沽,然后在后面接上閉包就行了。
inline fun SharedPreferences.edit(action: SharedPreferences.Editor.() -> Unit) {
val editor = edit()
action(editor)
editor.apply()
}
Default Arguments
這個特性上面的例子沒有俏竞,可以單獨列舉绸硕,如下所示。官方文檔介紹魂毁。
也是就說玻佩,當(dāng)一個函數(shù)中含有多個參數(shù)時候,不需要像Java中那樣席楚,依次賦值咬崔,可以僅僅賦需要的即可,Java中常見的解決的方法是方法重載,挨個傳入默認(rèn)值垮斯。
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)
}
對于默認(rèn)參數(shù),還可以這樣玩兜蠕,比如在Java中扰肌,常見的有建造在模式,對每個參數(shù)進(jìn)行賦值熊杨,然后創(chuàng)建一個對象曙旭,如果使用這種特性,不需要改變的值晶府,可以直接用默認(rèn)值表示桂躏,這樣在編碼的時候,就會顯得很簡潔郊霎。