首页 > 快讯 >

Android 14新功能HighLights快速实现文本高亮|当前短讯

2023-03-29 05:49:09 来源:脚本之家
目录
正文1. 设置高亮2. 获取高亮3. 动态更新高亮4. 与选中时效果是否冲突5. 结语

正文

日常开发中可能会遇到给 TextView 的全部或部分文本增加高亮效果的需求,以前可能是通过 Spannable或者 Html标签实现。

升级 Android 14后就不用这么迂回了,因其首次引入直接设置高亮的 API:HighLights。需要留意的是 HighLights API 和 Android 1.0 即加入的 textColorHighlightAPI 不同:


(资料图)

14 的新 API 就是文本在 normal 状态下的高亮,之前这个是为了设置选中时文本高亮,14 的新 API 只提供了 get/set 方法,没有提供与之匹配的 attribute。而之前的 API还提供了 android:textColorHighlightattribute 配置

下面我们就来一探这个新 API 的玩法和 textColorHighlight API 的区别。

目录前瞻:

设置高亮获取高亮动态更新高亮与选中时效果是否冲突结语

1. 设置高亮

HighLights采用的是熟知的建造者模式,即首先需要构建不同参数的 Builder实例,针对参数也提供了两种设置方式:

一次指定单组高亮配置:addRange(Paint paint, int start, int end),如果多组需要设置同样高亮颜色的话,那要调用多次

一次指定多组高亮配置:addRange(Paint paint, int... ranges),如果多组需要设置同样高亮颜色的话,只要调用一次即可

既然是多组范围那么 int 参数必须是偶数数目的,即成对出现,反之会发生如下的 Exception:

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

可以说上述两个 API 的参数都是成对出现,对于高亮的响应范围的话:前者是包含 inclusive 在内的,后者是不包含 exclusive 在内的,需要注意。

我们通过代码实例演示通过上述两个 Builder API 构建一样的高亮效果,然后通过 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 参数设置方式可以对 val 设置黄色高亮,Highlights 和 Builder 设置绿色高亮。

2. 获取高亮

设置到 TextView 对象的 HighLights 实例还可以通过 getHighlights()获取,并通过如下的 API 获取高亮的细节:

首先通过 getSize()获取设置高亮的数量

其次从 0 开始遍历下标

通过 getPaint(int index)获取高亮的 Paint对象以及通过 getRanges(int index)获取对应的 Paint 范围 Ranges(也是一个数组,需要遍历打印具体的起始位置)
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 和设置的参数是一一对应的。

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. 动态更新高亮

既然我们可以获取已经设置的 HighLights,那么更新其属性,能否动态更新高亮效果呢?

首先在 TextView 下添加动态更新 HighLights 的 Button

然后点击该 Button 之后将 textView1 的 Paint 颜色从 GREEN 改为 BLUE,并将其中 “Highlights” 的文本范围增大:头尾各扩展一个或多个下标
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()
         }
     }
 }

点击 Button 之后,颜色确实变成了蓝色,但是高亮范围却没有变化。

我们打印的更新后 HighLights 的参数 log:可以看到,无论是颜色(GREEN -> BLUE)还是范围(14 -> 11,24 -> 25)确实都已经更改了。

可为什么唯独 Ranges 没有刷新?有可能是 14 预览版阶段的 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. 与选中时效果是否冲突

我们给上述其中一个 TextView 添加选中高亮颜色的配置即 textColorHighlight,该颜色与上述 HighLights 颜色不同,以清晰地判断两种高亮是否会发生冲突。

注意需要将 textIsSelectable设置为 true,这样 TextView 才可以被长按选中。


     
     < ... >
 

我们在该 TextView 上长按看一下效果:

可以看到水滴选中的范围内会变成我们设置的 textColorHighlight 紫色高亮,未选中的部分会按照 HighLights 配置的那样展示黄色和绿色以及没有设置 HighLights 的默认浅灰色。

5. 结语

可以看到新功能 HighLights可以使得高亮的处理变得简单、易用,大家可以在 14 上采用该 API,当高版本普及后,低版本上的自定义高亮逻辑就可以舍弃了。

至于其原理,因为 Android 14尚处于预览版阶段、源码没有公开,无法获悉实现。但估计是 TextViewdraw阶段会获取设置的 HighLights 包含的 size 以及对应的 PaintRanges,得以清晰地掌握各高亮的颜色和对应的范围,然后直接调用 CanvasdrawText(text, start, end, x, y, paint)去完成绘制。

可以说 HighLights 这种 API 既方便了开发者的使用:从设置高亮到获取高亮到动态更新高亮,其清晰的逻辑一定程度上也可以简化 SDK 的实现。

事实上 Android 14 还针对 TextView做了其他新功能的支持,比如设置文内搜索结果的文本高亮、索引,后续一并进行解读:

setSearchResultHighlightColor(int color):设置所有匹配到搜索关键字的文本颜色setSearchResultHighlights(int... ranges):设置所有匹配到搜索关键字的文本高亮 HighLights的范围setFocusedSearchResultHighlightColor(int color):设置当前聚焦到的匹配关键字的文本颜色setFocusedSearchResultIndex(int index):设置当前聚焦到的匹配关键字的索引

参考

Android 14 HighlightsTextView"s setHighLights()Spot on: Android 14 adds highlights to TextViews

以上就是Android 14新功能HighLights快速实现文本高亮的详细内容,更多关于Android HighLights文本高亮的资料请关注脚本之家其它相关文章!

上一篇:

下一篇:

x
推荐阅读

Android 14新功能HighLights快速实现文本高亮|当前短讯

屯留农商行持续打好打胜“清不良”反击战 天天看点

比亚迪股份(01211)拟向尚水智能采购锂电设备 涉资不超过约11.33亿元

乘联会:3月狭义乘用车零售预计159.0万辆 新能源预计56.0万辆 世界视点

【独家焦点】农夫山泉:2022年母公司拥有人应占净利润为84.95亿元 同比增18.6%

河北廊坊:高标准推进城市规划建设

即时:青菜炒肉丝(青菜炒肉丝做法)

报道称美国阻挠中企竞标海底电缆工程等多个项目 外交部回应|快看

天天关注:2023昆明口碑好的男科医院 昆明男科十强医院排名

专精特新企业!内蒙古某地方政府成功对接行业领先新材料扩建项目-今日精选

水文监测显示“中华水塔”水源涵养能力增强

全球观速讯丨南昌西湖朝阳52.36亩宅地将于3月29日摇号 此前因系统故障终止交易

游戏行业迎利好,10位基金经理发生任职变动

两部门发布小微企业和个体工商户所得税优惠政策-世界看点

环球最新:中方呼吁有关国家采取切实行动促进和保障人权

查天气 就要颜值与实力兼具

解药性的食物有哪些_绿豆汤解药性吗_天天微速讯

全球即时看!自制猫粮配方大全猫粮拌饭_自制猫粮配方

天天讯息:爱康医疗公布2022年业绩 净利约2.05亿元 同比增长121.1% 末期息每股6港仙

买洗发水时,这五款不显眼的不要错过!包装“丑”了点,却超好用_观速讯

Veiled Experts幕后高手下载教程 Steam幕后高手配置要求一览

资鲸北交所周报:安达科技上市 东方碳素、锦波生物过会

湖南移动网上营业厅网_湖南移动网上营业厅话费详单查询

苹果酸奶减肥法成功案例_苹果酸奶减肥法

补钙的十种最佳食物排名_补钙的最佳食物排行榜 世界快看

周生生黄金价格今天多少一克(2023年03月27日)

电脑密码忘记了咋办最简单的_电脑密码忘了怎么办最简单的方法

中伟股份:3月24日获融资买入1303.79万元,占当日流入资金比例9.52%

哥伦比亚第一美女的5部限制级作品分享

梦见吃鱼周公解梦_梦见吃鱼周公解梦|世界热文

天天实时:前央视一姐周涛近照曝光!55岁穿金戴银状态惊艳,新身份罕见曝光

世界上最坑中国人的国家,并不是韩国和越南,反而是我们最热爱的-天天快播报

热烈庆祝贵州三力荣获“2022年抗疫保供优秀药品零售企业”_世界速讯

4月20日起北京口腔种植类医疗服务项目价格大幅降低

天津宝坻经营主体有活力

泰国细伟真实故事|微速讯

视讯!洪都拉斯是个怎样的国家?

每日热门:去年我国光伏行业总产值超1.4万亿元 发展势头平稳向好

车内配置有惊喜/高速NOA抢先测 东风风行雷霆试驾体验

全球微资讯!三国杀中的仙左慈有哪些技能

弑父啃心脏!巴西杀人狂魔一生杀害100多人,血洗监狱,却被民众封为“英雄”?-当前关注

焦点速读:求生欲是什么意思呀_求生欲是什么意思

摩托也要玩AI!雅马哈宣布 10 年投资 1 亿美元研发 AI 与机器人

环球快消息!战地4剧情

【独家】三亚开展专项整治!涉及海鲜餐饮、婚纱摄影、旅游住宿等

加盟费持续下降,名创优品没有吸引力了?

企顺欣私董会走进视源股份贵州办事处 快播报

南雄银杏最佳观赏时间

用文化力量挖掘优秀影视商业价值

公司可以借款给个人吗,这样做的话是否符合法律?_世界热文