超好用的官方core-ktx庫,瞭解一下~
highlight: arduino-light theme: smartblue
本文是研究官方
core-ktx庫的第四篇文章
,旨在探究該庫中有哪些工具類或方法能夠提高我們的開發效率。
已更新的系列文章:
官方core-ktx庫能對SparseArray系列、Pair開發帶來哪些便利?
本篇文章主要是研究
core-ktx
庫中graphics
包下提供的關於View
繪製、Bitmap
、Rect
、Color
等操作的一系列擴展API,看看能為我們開發帶來哪些便利。
Drawable
與Bitmap
相互間轉換
Bitmap.toDrawable(Resource)
實現Bitmap
轉Drawable
給Bitmap
定義了一個快速轉換成BitmapDrawable
的擴展方法,還是少寫了一些模板代碼的。
Drawable.toBitmap()
實現Drawable
轉換成Bitmap
對象
Drawable
轉換成Bitmap
應該是我們日常開發中常見的場景,這裏官方庫直接給我們提供了一個toBitmap()
的API,非常的方便,下面我們來簡單介紹下其中的原理:
-
首先判斷當前
Drawable
的類型是否為BitmapDrawable
,如果是直接調用其getBitmap()
就能直接拿到Bitmap
對象,然後根據傳入的寬高進行一定比例的壓縮轉換後進行返回; -
如果不是
BitmapDrawable
,就首先需要創建一個Bitmap
對象,可以理解為一個"畫布"
,然後接着創建一個Canvas
對象並傳入之前創建的Bitmap
對象,這樣我們就可以利用Canvas
提供的繪製API在Bitmap這個"畫布"
上作畫了,接下來直接調用Drawable的draw()
方法並傳入Canvas
,就可以將Drawable
中的顯示內容繪製到我們一開始創建的Bitmap
上了,這樣就完成了Drawable
到Bitmap
的轉換
Bitmap
系列
簡化對Bitmap的繪製操作
我們先看下日常開發中,我們怎麼在Bitmap
中繪製一點東西:
kotlin
private fun test4(bitmap: Bitmap) {
val canvas = Canvas(bitmap)
canvas.apply {
//進行一些繪製操作
drawLine(0f, 0f, 100f, 100f, Paint())
}
}
有些繁瑣,看下官方庫給我們提供了什麼便利的擴展實現:
幫助我們創建好Canvas
對象,並且方法參數是一個接收者為Canvas
的函數類型,這意味我們可以直接在外部傳入的lambda
中進行繪製操作:
kotlin
private fun test4(bitmap: Bitmap) {
bitmap.applyCanvas {
//進行一些繪製操作
drawLine(0f, 0f, 100f, 100f, Paint())
}
}
簡化Bitmap
創建
1.createBitmap()
創建指定大小和像素格式的Bitmap
還是簡化了創建Bitmap
的操作,雖然很小。
2.scale()
縮放(壓縮)Bitmap
這個也是我們常用的通過降低分辨率壓縮Bitmap
大小的一種方式。
操作Bitmap中的像素點
1.Bitmap.get(x: Int, y: Int)
獲取指定位置的像素點RGB值
經典的運算符重載函數,代碼中可以直接val pointRGB = bitmap[100, 100]
使用。
2.Bitmap.set()
設置某個點的RGB像素值
同樣也是個運算符重載方法,代碼中直接bitmap[100, 100] = Color.RED
使用。
3.Bitmap.contains()
判斷指定位置點是否落在Bitmap
中
運算符重載方法,直接Point(100, 100) in bitmap
使用
color
系列
普通擴展屬性獲取顏色的A、R、G、B
值
使用如下:
kotlin
private fun test10(@ColorInt value: Int) {
val a = value.alpha
val r = value.red
val g = value.green
val b = value.blue
}
解構獲取顏色的A、R、G、B
值
帶有operator
修飾componenX
就是解構方法,X和參數聲明的位置一一對應:
kotlin
private fun test10(@ColorInt value: Int) {
val (a, r, g, b) = value
}
向我們常見的data class
、HashMap
都實現了類似的解擴展。
轉換顏色Color對象
1.Int.toColor()
整形顏色轉換Color
對象
2.String.toColorInt()
實現字符串轉Color
對象
這個應該比較常用,直接"#ffffff".toColorInt()
即可
Rect
系列
解構獲取左、上、右、下的值
熟悉的解構,使用和上面一樣(RectF
也同樣提供了相同的解構方法),如下:
kotlin
private fun test10(rect: Rect) {
val (left, top, right, bottom) = rect
}
縮放Rect
範圍
下面是擴充Rect
範圍的API:
使用如下:
kotlin
private fun test10(rect: Rect) {
val rect1 = rect + rect
val rect2 = rect + 10
val rect3 = rect + Point(100, 200)
}
同樣也提供了minus()
縮減Rect
範圍
Rect間取交集、並集等
判斷某個點是否落在Rect
中
使用:Point(11, 11) in rect
Point、PointX
系列
下面的擴展方法無非就是解構、通過運算符重載控制
Point
位置,上面已經講了一大堆這樣的使用,大家走馬觀花的看下就行,有個印象即可。
經典的解構取值方法
操作Point
的位置
總結
上面的內容已經把
graphics
包下提供的擴展工具講的七七八八了,大家主要是有個印象就行,使用的時候能想起來用更好,如果需要詳細瞭解的請直接參考該包下的源碼即可。關於探索官方
core-ktx
庫的還剩下大概最後一篇文章講解了,希望可以在這個系列中帶給大家一些幫助,提供大家的開發效率。並且通過學習官方庫中的封裝思路,也同樣會給大家日常開發中小優化帶來啟發。
我正在參與掘金技術社區創作者簽約計劃招募活動,點擊鏈接報名投稿。
- kotlin密封sealed class/interface的迭代之旅
- 2022年12月12日—2022年12月25日Android精品文章一覽
- Sqlite簡易性能優化方案,給你的應用插上“翅膀”
- 築基篇:設置界面的開發利器Preference Library,瞭解一下~
- Android消息機制完整的執行流程,瞭解一下
- 你可能需要了解下的Android開發技巧(二)
- 超有用的Android開發技巧:攔截界面View創建
- Handler創建的幾個必備知識點,瞭解一下
- Android消息機制中Message常用的幾種監控方式
- 數見不鮮的RecyclerView使用技巧,你瞭解嗎(一)?
- 常用到的幾個Kotlin開發技巧,減少對業務層代碼的入侵
- 超好用的官方core-ktx庫,瞭解一下(終)~
- Take a look,從delay()方法看協程的掛起與恢復
- 超好用的官方core-ktx庫,瞭解一下~
- 官方core-ktx庫能對SparseArray系列、Pair開發帶來哪些便利?
- 官方core-ktx庫能對富文本Span開發帶來哪些便利2
- 你需要了解的官方core-ktx庫能對開發帶來哪些便利1
- LeakCanary如何監聽Fragment、Fragment View、ViewModel銷燬時機?
- 非反射動態設置TabLayout指示器的寬度
- 探究EventBus粘性事件實現機制