超好用的官方core-ktx庫,瞭解一下~

語言: CN / TW / HK

highlight: arduino-light theme: smartblue


本文是研究官方core-ktx庫的第四篇文章,旨在探究該庫中有哪些工具類或方法能夠提高我們的開發效率。

已更新的系列文章:

你需要了解的官方core-ktx庫能對開發帶來哪些便利1

官方core-ktx庫能對富文本Span開發帶來哪些便利?

官方core-ktx庫能對SparseArray系列、Pair開發帶來哪些便利?

本篇文章主要是研究core-ktx庫中graphics包下提供的關於View繪製、BitmapRectColor等操作的一系列擴展API,看看能為我們開發帶來哪些便利。

DrawableBitmap相互間轉換

Bitmap.toDrawable(Resource)實現BitmapDrawable

image.png

Bitmap定義了一個快速轉換成BitmapDrawable的擴展方法,還是少寫了一些模板代碼的。

Drawable.toBitmap()實現Drawable轉換成Bitmap對象

image.png

Drawable轉換成Bitmap應該是我們日常開發中常見的場景,這裏官方庫直接給我們提供了一個toBitmap()的API,非常的方便,下面我們來簡單介紹下其中的原理:

  1. 首先判斷當前Drawable的類型是否為BitmapDrawable,如果是直接調用其getBitmap()就能直接拿到Bitmap對象,然後根據傳入的寬高進行一定比例的壓縮轉換後進行返回;

  2. 如果不是BitmapDrawable,就首先需要創建一個Bitmap對象,可以理解為一個"畫布",然後接着創建一個Canvas對象並傳入之前創建的Bitmap對象,這樣我們就可以利用Canvas提供的繪製API在Bitmap這個"畫布"上作畫了,接下來直接調用Drawable的draw()方法並傳入Canvas,就可以將Drawable中的顯示內容繪製到我們一開始創建的Bitmap上了,這樣就完成了DrawableBitmap的轉換

Bitmap系列

簡化對Bitmap的繪製操作

我們先看下日常開發中,我們怎麼在Bitmap中繪製一點東西: kotlin private fun test4(bitmap: Bitmap) { val canvas = Canvas(bitmap) canvas.apply { //進行一些繪製操作 drawLine(0f, 0f, 100f, 100f, Paint()) } } 有些繁瑣,看下官方庫給我們提供了什麼便利的擴展實現:

image.png

幫助我們創建好Canvas對象,並且方法參數是一個接收者為Canvas的函數類型,這意味我們可以直接在外部傳入的lambda中進行繪製操作:

kotlin private fun test4(bitmap: Bitmap) { bitmap.applyCanvas { //進行一些繪製操作 drawLine(0f, 0f, 100f, 100f, Paint()) } }

簡化Bitmap創建

1.createBitmap()創建指定大小和像素格式的Bitmap

image.png

還是簡化了創建Bitmap的操作,雖然很小。

2.scale()縮放(壓縮)Bitmap

image.png

這個也是我們常用的通過降低分辨率壓縮Bitmap大小的一種方式。

操作Bitmap中的像素點

1.Bitmap.get(x: Int, y: Int)獲取指定位置的像素點RGB值

image.png

經典的運算符重載函數,代碼中可以直接val pointRGB = bitmap[100, 100]使用。

2.Bitmap.set()設置某個點的RGB像素值

image.png

同樣也是個運算符重載方法,代碼中直接bitmap[100, 100] = Color.RED使用。

3.Bitmap.contains()判斷指定位置點是否落在Bitmap

image.png

運算符重載方法,直接Point(100, 100) in bitmap使用

color系列

普通擴展屬性獲取顏色的A、R、G、B

image.png

使用如下:

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

image.png

帶有operator修飾componenX就是解構方法,X和參數聲明的位置一一對應:

kotlin private fun test10(@ColorInt value: Int) { val (a, r, g, b) = value }

向我們常見的data classHashMap都實現了類似的解擴展。

轉換顏色Color對象

1.Int.toColor()整形顏色轉換Color對象

image.png

2.String.toColorInt()實現字符串轉Color對象

image.png

這個應該比較常用,直接"#ffffff".toColorInt()即可

Rect系列

解構獲取左、上、右、下的值

image.png

熟悉的解構,使用和上面一樣(RectF也同樣提供了相同的解構方法),如下:

kotlin private fun test10(rect: Rect) { val (left, top, right, bottom) = rect }

縮放Rect範圍

下面是擴充Rect範圍的API:

image.png image.png

image.png

使用如下:

kotlin private fun test10(rect: Rect) { val rect1 = rect + rect val rect2 = rect + 10 val rect3 = rect + Point(100, 200) }

同樣也提供了minus()縮減Rect範圍

Rect間取交集、並集等

image.png

image.png

判斷某個點是否落在Rect

image.png

使用:Point(11, 11) in rect

Point、PointX系列

下面的擴展方法無非就是解構、通過運算符重載控制Point位置,上面已經講了一大堆這樣的使用,大家走馬觀花的看下就行,有個印象即可。

經典的解構取值方法

image.png

操作Point的位置

image.png

image.png

總結

上面的內容已經把graphics包下提供的擴展工具講的七七八八了,大家主要是有個印象就行,使用的時候能想起來用更好,如果需要詳細瞭解的請直接參考該包下的源碼即可。

關於探索官方core-ktx庫的還剩下大概最後一篇文章講解了,希望可以在這個系列中帶給大家一些幫助,提供大家的開發效率。並且通過學習官方庫中的封裝思路,也同樣會給大家日常開發中小優化帶來啟發。

我正在參與掘金技術社區創作者簽約計劃招募活動,點擊鏈接報名投稿