亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android?14新功能HighLights快速實(shí)現(xiàn)文本高亮

 更新時(shí)間:2023年03月28日 15:38:54   作者:TechMerger  
這篇文章主要為大家介紹了Android?14新功能HighLights快速實(shí)現(xiàn)文本高亮示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

正文

日常開發(fā)中可能會(huì)遇到給 TextView 的全部或部分文本增加高亮效果的需求,以前可能是通過 Spannable 或者 Html 標(biāo)簽實(shí)現(xiàn)。

升級(jí) Android 14 后就不用這么迂回了,因其首次引入直接設(shè)置高亮的 API:HighLights。需要留意的是 HighLights API 和 Android 1.0 即加入的 textColorHighlight API 不同:

  • 14 的新 API 就是文本在 normal 狀態(tài)下的高亮,之前這個(gè)是為了設(shè)置選中時(shí)文本高亮,
  • 14 的新 API 只提供了 get/set 方法,沒有提供與之匹配的 attribute。而之前的 API還提供了 android:textColorHighlight attribute 配置

下面我們就來一探這個(gè)新 API 的玩法和 textColorHighlight API 的區(qū)別。

目錄前瞻:

  • 設(shè)置高亮
  • 獲取高亮
  • 動(dòng)態(tài)更新高亮
  • 與選中時(shí)效果是否沖突
  • 結(jié)語

1. 設(shè)置高亮

HighLights 采用的是熟知的建造者模式,即首先需要構(gòu)建不同參數(shù)的 Builder 實(shí)例,針對(duì)參數(shù)也提供了兩種設(shè)置方式:

一次指定單組高亮配置:addRange(Paint paint, int start, int end),如果多組需要設(shè)置同樣高亮顏色的話,那要調(diào)用多次

一次指定多組高亮配置:addRange(Paint paint, int... ranges),如果多組需要設(shè)置同樣高亮顏色的話,只要調(diào)用一次即可

既然是多組范圍那么 int 參數(shù)必須是偶數(shù)數(shù)目的,即成對(duì)出現(xiàn),反之會(huì)發(fā)生如下的 Exception:

java.lang.IllegalArgumentException: Flatten ranges must have even numbered elements

可以說上述兩個(gè) API 的參數(shù)都是成對(duì)出現(xiàn),對(duì)于高亮的響應(yīng)范圍的話:前者是包含 inclusive 在內(nèi)的,后者是不包含 exclusive 在內(nèi)的,需要注意。

我們通過代碼實(shí)例演示通過上述兩個(gè) Builder API 構(gòu)建一樣的高亮效果,然后通過 TextViewsetHighLights() 反映。

 class MainActivity : AppCompatActivity() {
     companion object {
         const val TEXT = "val builder = Highlights.Builder()"
     }
     override fun onCreate(savedInstanceState: Bundle?) {
         ...
         val yellowPaint = Paint().apply {
             color = Color.YELLOW
         }
         val greenPaint = Paint().apply {
             color = Color.GREEN
         }
         with(binding.textview1) {
             text = TEXT
             val builder = Highlights.Builder()
                 .addRange(yellowPaint, 0, 3)
                 .addRange(greenPaint, 14, 24)
                 .addRange(greenPaint, 25, 32)
             highlights = builder.build()
         }
         with(binding.textview2) {
             text = TEXT
             val builder = Highlights.Builder()
                 .addRanges(yellowPaint, 0, 3)
                 .addRanges(greenPaint, 14, 24, 25, 32)
             highlights = builder.build()
         }
     }
 }

可以看到不同的 Builder 參數(shù)設(shè)置方式可以對(duì) val 設(shè)置黃色高亮,Highlights 和 Builder 設(shè)置綠色高亮。

2. 獲取高亮

設(shè)置到 TextView 對(duì)象的 HighLights 實(shí)例還可以通過 getHighlights() 獲取,并通過如下的 API 獲取高亮的細(xì)節(jié):

首先通過 getSize() 獲取設(shè)置高亮的數(shù)量

其次從 0 開始遍歷下標(biāo)

  • 通過 getPaint(int index) 獲取高亮的 Paint 對(duì)象
  • 以及通過 getRanges(int index) 獲取對(duì)應(yīng)的 Paint 范圍 Ranges(也是一個(gè)數(shù)組,需要遍歷打印具體的起始位置)
 class MainActivity : AppCompatActivity() {
     ...
     override fun onCreate(savedInstanceState: Bundle?) {
         ...
         binding.textview1.highlights?.run {
             Log.d("HighLights", "textview1 usedHighLights' size:$size")
             for (i in 0 until size) {
                 Log.d("HighLights", "usedHighLights'" +
                         " paint:${getPaint(i).color.toColorString()}")
                 val range = getRanges(i)
                 for (j in range.indices) {
                     Log.d("HighLights", "ranges:${range[j]}")
                 }
             }
         }
         binding.textview2.highlights?.run {
             Log.d("HighLights", "textview2 usedHighLights' size:$size")
             for (i in 0 until size) {
                 Log.d("HighLights", "usedHighLights'" +
                         " paint:${getPaint(i).color.toColorString()}")
                 val range = getRanges(i)
                 for (j in range.indices) {
                     Log.d("HighLights", "ranges:${range[j]}")
                 }
             }
         }
     }
 }

如下的 log 可以看到打印出來的 Paint 顏色、范圍 Ranges 和設(shè)置的參數(shù)是一一對(duì)應(yīng)的。

 03-23 23:08:27.196  7182  7182 D HighLights: textview1 usedHighLights' size:3
 03-23 23:08:27.196  7182  7182 D HighLights: usedHighLights' paint:YELLOW
 03-23 23:08:27.196  7182  7182 D HighLights: ranges:0
 03-23 23:08:27.196  7182  7182 D HighLights: ranges:3
 03-23 23:08:27.196  7182  7182 D HighLights: usedHighLights' paint:GREEN
 03-23 23:08:27.196  7182  7182 D HighLights: ranges:14
 03-23 23:08:27.196  7182  7182 D HighLights: ranges:24
 03-23 23:08:27.196  7182  7182 D HighLights: usedHighLights' paint:GREEN
 03-23 23:08:27.196  7182  7182 D HighLights: ranges:25
 03-23 23:08:27.196  7182  7182 D HighLights: ranges:32
 
 03-23 23:08:27.196  7182  7182 D HighLights: textview2 usedHighLights' size:2
 03-23 23:08:27.196  7182  7182 D HighLights: usedHighLights' paint:YELLOW
 03-23 23:08:27.196  7182  7182 D HighLights: ranges:0
 03-23 23:08:27.196  7182  7182 D HighLights: ranges:3
 03-23 23:08:27.196  7182  7182 D HighLights: usedHighLights' paint:GREEN
 03-23 23:08:27.196  7182  7182 D HighLights: ranges:14
 03-23 23:08:27.196  7182  7182 D HighLights: ranges:24
 03-23 23:08:27.196  7182  7182 D HighLights: ranges:25
 03-23 23:08:27.196  7182  7182 D HighLights: ranges:32

3. 動(dòng)態(tài)更新高亮

既然我們可以獲取已經(jīng)設(shè)置的 HighLights,那么更新其屬性,能否動(dòng)態(tài)更新高亮效果呢?

首先在 TextView 下添加動(dòng)態(tài)更新 HighLights 的 Button

  • 然后點(diǎn)擊該 Button 之后將 textView1 的 Paint 顏色從 GREEN 改為 BLUE,并將其中 “Highlights” 的文本范圍增大:頭尾各擴(kuò)展一個(gè)或多個(gè)下標(biāo)
 class MainActivity : AppCompatActivity() {
     ...
     override fun onCreate(savedInstanceState: Bundle?) {
         ...
         binding.changeHighlights.setOnClickListener {
             Log.d("HighLights", "changeHighlights tapped & change highlights")
             textView1Highlights?.apply {
                 // Change color
                 getPaint(1).color = Color.BLUE
                 // Change ranges
                 getRanges(1)[0] -= 3
                 getRanges(1)[1] += 1
                 for (i in 0 until size) {
                     Log.d("HighLights", "textView1Highlights'" +
                             " paint:${getPaint(i).color.toColorString()}")
                     val range = getRanges(i)
                     for (j in range.indices) {
                         Log.d("HighLights", "ranges:${range[j]}")
                     }
                 }
             }
             binding.textview1.invalidate()
         }
     }
 }

點(diǎn)擊 Button 之后,顏色確實(shí)變成了藍(lán)色,但是高亮范圍卻沒有變化。

我們打印的更新后 HighLights 的參數(shù) log:可以看到,無論是顏色(GREEN -> BLUE)還是范圍(14 -> 11,24 -> 25)確實(shí)都已經(jīng)更改了。

可為什么唯獨(dú) Ranges 沒有刷新?有可能是 14 預(yù)覽版階段的 Bug。

 03-25 10:47:29.276  5344  5344 D HighLights: changeHighlights tapped & change highlights
 03-25 10:47:29.276  5344  5344 D HighLights: textview1 textView1Highlights' size:3
 03-25 10:47:29.276  5344  5344 D HighLights: textView1Highlights' paint:YELLOW
 03-25 10:47:29.276  5344  5344 D HighLights: ranges:0
 03-25 10:47:29.276  5344  5344 D HighLights: ranges:3
 03-25 10:47:29.277  5344  5344 D HighLights: textView1Highlights' paint:BLUE
 03-25 10:47:29.277  5344  5344 D HighLights: ranges:11
 03-25 10:47:29.277  5344  5344 D HighLights: ranges:25
 03-25 10:47:29.277  5344  5344 D HighLights: textView1Highlights' paint:BLUE
 03-25 10:47:29.277  5344  5344 D HighLights: ranges:25
 03-25 10:47:29.277  5344  5344 D HighLights: ranges:32

4. 與選中時(shí)效果是否沖突

我們給上述其中一個(gè) TextView 添加選中高亮顏色的配置即 textColorHighlight,該顏色與上述 HighLights 顏色不同,以清晰地判斷兩種高亮是否會(huì)發(fā)生沖突。

注意需要將 textIsSelectable 設(shè)置為 true,這樣 TextView 才可以被長按選中。

 <androidx.constraintlayout.widget.ConstraintLayout ... >
     <TextView
         android:id="@+id/textview1"
         ...
         android:textColorHighlight="@color/purple_200"
         android:textIsSelectable="true"
         ... />
     < ... >
 </androidx.constraintlayout.widget.ConstraintLayout>

我們在該 TextView 上長按看一下效果:

可以看到水滴選中的范圍內(nèi)會(huì)變成我們設(shè)置的 textColorHighlight 紫色高亮,未選中的部分會(huì)按照 HighLights 配置的那樣展示黃色和綠色以及沒有設(shè)置 HighLights 的默認(rèn)淺灰色。

5. 結(jié)語

可以看到新功能 HighLights 可以使得高亮的處理變得簡單、易用,大家可以在 14 上采用該 API,當(dāng)高版本普及后,低版本上的自定義高亮邏輯就可以舍棄了。

至于其原理,因?yàn)?Android 14 尚處于預(yù)覽版階段、源碼沒有公開,無法獲悉實(shí)現(xiàn)。但估計(jì)是 TextViewdraw 階段會(huì)獲取設(shè)置的 HighLights 包含的 size 以及對(duì)應(yīng)的 PaintRanges,得以清晰地掌握各高亮的顏色和對(duì)應(yīng)的范圍,然后直接調(diào)用 CanvasdrawText(text, start, end, x, y, paint) 去完成繪制。

可以說 HighLights 這種 API 既方便了開發(fā)者的使用:從設(shè)置高亮到獲取高亮到動(dòng)態(tài)更新高亮,其清晰的邏輯一定程度上也可以簡化 SDK 的實(shí)現(xiàn)。

事實(shí)上 Android 14 還針對(duì) TextView 做了其他新功能的支持,比如設(shè)置文內(nèi)搜索結(jié)果的文本高亮、索引,后續(xù)一并進(jìn)行解讀:

  • setSearchResultHighlightColor(int color):設(shè)置所有匹配到搜索關(guān)鍵字的文本顏色
  • setSearchResultHighlights(int... ranges):設(shè)置所有匹配到搜索關(guān)鍵字的文本高亮 HighLights 的范圍
  • setFocusedSearchResultHighlightColor(int color):設(shè)置當(dāng)前聚焦到的匹配關(guān)鍵字的文本顏色
  • setFocusedSearchResultIndex(int index):設(shè)置當(dāng)前聚焦到的匹配關(guān)鍵字的索引

參考

以上就是Android 14新功能HighLights快速實(shí)現(xiàn)文本高亮的詳細(xì)內(nèi)容,更多關(guān)于Android HighLights文本高亮的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:

相關(guān)文章

最新評(píng)論