Android TextView 自定義文本高亮

原生高亮弊端

安卓原生textview控件自帶高亮功能稚机,只需在xml或者代碼中設(shè)置 android:textIsSelectable="true"即可蜡秽。但自帶的文本高亮功能有一些弊端:1:自由選擇的時(shí)候代赁,彈出的框可定制性差踊兜,在android6.0之前竿滨,大多數(shù)手機(jī)是不支持修改高亮框的,6.0后才允許修改捏境,但具體能修改成什么樣也不太確定于游。2:原生自帶的高亮功能是包括行高的效果圖

系統(tǒng)自帶的高亮?xí)r選中區(qū)域是包含行高的垫言,當(dāng)行高很大的時(shí)候,會很丑鸠澈。除此之外截驮,左右游標(biāo)的高度當(dāng)有富文本的時(shí)候,游標(biāo)的高還是固定的葵袭,也不是很美觀。ok坡锡,基于這兩點(diǎn)鹉勒,開啟我們自定制之旅。

認(rèn)識TextView

在開始高亮功能開發(fā)之前禽额,讓我們重新認(rèn)識一下textview。

有圖中可以看到行高部分是textview的leading值实辑,但是在textview中是獲取不到leading值的藻丢,各種log,一直是0残黑,即便設(shè)置了行高,也是0萍摊。所以把焦點(diǎn)放在了baseline和descent這兩個(gè)屬性上如叼。(此外這里有個(gè)需要注意點(diǎn),雖然沒有用到bottom值踊沸,但是textview在6.0之后社证,textview的最后一行的bottom的值是不包含行高的,跟之前的textviewbottom值有所差別追葡。)

高亮

安卓原生自帶的高亮是用textview眾多span中的BackgroundColorSpan實(shí)現(xiàn)的,但就是這個(gè)span是包含行高的匀钧,所以高亮的時(shí)候會一片區(qū)域全部選中谬返。經(jīng)過多次調(diào)研和可重寫性,最后選用LineBackgroundSpan來實(shí)現(xiàn)不帶行高的高亮遣铝。
首先寫一個(gè)CustomUnderlineSpan 實(shí)現(xiàn) LineBackgroundSpan類酿炸,實(shí)現(xiàn)drawBackground()方法,如圖:

實(shí)現(xiàn)方法

LineBackgroundSpan是一個(gè)畫下劃線的樣式填硕,有第一部分我們可知baseline對我們來說非常重要,如果想排除行高频鉴,我們想畫的bottom值必須是baseline+descent 恋拍,在此回調(diào)方法中,我們可以拿到每一行的首字符下標(biāo)和每一行末尾的下標(biāo)周荐,還有這一行的baseline,top概作,paint等值。而重要的是descent我們可以用p.descent()獲得骤素。廢話少說愚屁,上代碼。

start送浊,end是高亮部分的下標(biāo)

用原生的BackgroundSpan替換為自定義的CustomUnderLineSpan后就可以實(shí)現(xiàn)不帶行高的高亮文本功能了丘跌。


富文本高亮

由于Android有很多富文本渲染控件,所以自己可以根據(jù)自己的情況去實(shí)現(xiàn)高亮功能闭树。在此只介紹自己渲染富文本后如何實(shí)現(xiàn)高亮。

1:根據(jù)想高亮區(qū)間[start,end],計(jì)算出start對應(yīng)字符的左下標(biāo)點(diǎn)榆纽,end同理捏肢。

2:計(jì)算方法,逐個(gè)字符遍歷鸵赫,看是否存在圖片,如果存在圖片狼忱,則寬由字符的寬變?yōu)閳D片的寬

3:如果一行中含有圖片一睁,則高度也會隨之變化。

貼代碼:


計(jì)算左起始點(diǎn)和右結(jié)束點(diǎn)


計(jì)算高

左右游標(biāo)處理

1:原生的文本長按后窘俺,左右出現(xiàn)游標(biāo)复凳,拖拽游標(biāo)可改變高亮區(qū)域灶泵。原生的textview的實(shí)現(xiàn)方式是赦邻,左右游標(biāo)是PopupWindow,然后根據(jù)字符的index惶洲,計(jì)算出在屏幕中的位置劲妙,然后彈出pop儒喊,焦點(diǎn)也是放在游標(biāo)本身的。

2:我實(shí)現(xiàn)的方式是侨颈,在高亮文本的同時(shí)芯义,用代碼畫出左右游標(biāo),這樣左右游標(biāo)的高可以動態(tài)跟著富文本的高來變化扛拨,其次,左右游標(biāo)的焦點(diǎn)區(qū)域可以人為設(shè)置大小求泰。

原生的方式我也重寫了一下计盒,如果有疑問的小伙伴或者想交流的可以給我發(fā)信息。在此介紹第二種小清新的方式北启。

直接貼代碼

用代碼畫左右游標(biāo)


在高亮文本的代碼畫完后咕村,緊跟著就畫游標(biāo)。

講述到此懈涛,主要的不帶行高的高亮功能基本算是實(shí)現(xiàn)了。

在此稍微提幾句計(jì)算下標(biāo)和焦點(diǎn)沖突的問題泣港。

計(jì)算下標(biāo)主要用到的代碼行:

int topVisibleLine = mLayout.getLineForVertical(y);

int offset = mLayout.getOffsetForHorizontal(topVisibleLine,x);具體使用到的方法,大家可以隨意Google

焦點(diǎn)沖突: TextView本身的長按事件呛每,點(diǎn)擊事件坡氯,和觸摸事件之間的沖突想必大家都很清楚了,這個(gè)我是沒有用長按和點(diǎn)擊事件箫柳,直接用觸摸事件自己判斷的長按事件和點(diǎn)擊事件,其中長按事件判斷時(shí)間是500ms库糠,點(diǎn)擊事件偏移量是50.

如有不嚴(yán)謹(jǐn)?shù)牡胤綒g迎更正

如有其它更好的方法涮毫,歡迎交流

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市艘虎,隨后出現(xiàn)的幾起案子咒吐,更是在濱河造成了極大的恐慌,老刑警劉巖恬叹,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妄呕,死亡現(xiàn)場離奇詭異,居然都是意外死亡肿孵,警方通過查閱死者的電腦和手機(jī)疏魏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛉腌,“玉大人,你說我怎么就攤上這事烙丛。” “怎么了钠右?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵忘蟹,是天一觀的道長。 經(jīng)常有香客問我狠毯,道長褥芒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任惜颇,我火速辦了婚禮少辣,結(jié)果婚禮上羡蛾,老公的妹妹穿的比我還像新娘。我一直安慰自己痴怨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布捐迫。 她就那樣靜靜地躺著爱葵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪萌丈。 梳的紋絲不亂的頭發(fā)上辆雾,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天,我揣著相機(jī)與錄音藤乙,去河邊找鬼猜揪。 笑死坛梁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的毅人。 我是一名探鬼主播尖殃,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼送丰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了俐载?” 一聲冷哼從身側(cè)響起登失,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎揽浙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體膛虫,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钓猬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年敞曹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片异雁。...
    茶點(diǎn)故事閱讀 38,768評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡纲刀,死狀恐怖担平,靈堂內(nèi)的尸體忽然破棺而出锭部,到底是詐尸還是另有隱情,我是刑警寧澤拌禾,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布湃窍,位于F島的核電站,受9級特大地震影響您市,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜茵休,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一榕莺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钉鸯,春花似錦、人聲如沸扣蜻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至灵再,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間栋猖,已是汗流浹背汪榔。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雌团,地道東北人燃领。 一個(gè)月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓猛蔽,卻偏偏與公主長得像灵寺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子略板,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,666評論 2 350

推薦閱讀更多精彩內(nèi)容