Android RichText 讓Textview輕松的支持富文本(圖像ImageSpan、點(diǎn)擊效果等等類似QQ微信聊天)
AndroidRichText幫助實(shí)現(xiàn)像QQ,微信一樣的,一個(gè)TextView里既有文字又有表情又有圖片的效果,采用插件化的框架,代碼簡單,可拓展性強(qiáng)。
基礎(chǔ)框架包只有四個(gè)java文件,
RichTextWrapper :TextView的包裹類,實(shí)現(xiàn)支持富文本,通過new RichTextWrapper(TextView v)來構(gòu)造。
RTMovementMethod: 繼承自Android原生的LinkMovementMethod,重寫onTouchEvent方法,優(yōu)化了ClickSpan(點(diǎn)擊響應(yīng)的文字區(qū)域)的點(diǎn)擊響應(yīng)。
Resolver:一個(gè)接口,我們需要實(shí)現(xiàn)一種支持富文本類型時(shí)就只需要寫一個(gè)相應(yīng)的Resolver重寫它的resolve方法,在resolve方法里實(shí)現(xiàn)所要實(shí)現(xiàn)的富文本樣式。
RichTexts:一些公用方法、類、接口的集合。接下來簡單介紹一下如何使用這個(gè)框架:
//直接根據(jù)TextView new一個(gè)RichTextWrapper,之后所有的事情都可以用它完成; RichTextWrapper richTextWrapper = new RichTextWrapper((TextView) findViewById(R.id.tv_main)); //比如QQ希望在TextView里同時(shí)有表情和圖片那么就可以相應(yīng)的寫兩個(gè)Resolver來實(shí)現(xiàn)分別的功能,直接在初始化時(shí)調(diào)用addResolver傳入就可以。 richTextWrapper.addResolver(ImageResolver.class,EmotionResolver.class); //同時(shí),我們?nèi)绻Mc(diǎn)擊圖片時(shí)有響應(yīng)事件,可以使用setOnRichTextListener來處理,參數(shù)要傳入對應(yīng)的Resolver,這里是ImageResolver,如果我們需要自定義的XXResolver處理的富文本效果實(shí)現(xiàn)響應(yīng)事件,那么久傳入XXResolver.class; richTextWrapper.setOnRichTextListener(ImageResolver.class, new RichTexts.RichTextClickListener() { @Override public void onRichTextClick(TextView v, String content) { //在這里可以進(jìn)行圖片的點(diǎn)擊事件處理 //do something } }); //最后直接把文本set進(jìn)去就可以 richTextWrapper.setText(content);
addResolver可以傳入任意個(gè)Resolver,讓TextView支持我們需要的富文本類型,如果需要取消支持某種富文本類型,只需要不傳入該Resolver比如上文中如果只需要支持表情,那么 richTextWrapper.addResolver(EmotionResolver.class);
不需要做太多代碼改動,比較靈活。
那么此外,大家可以看出來另一個(gè)關(guān)鍵的地方就是Resolver;Resolver是如何實(shí)現(xiàn)呢?這邊使用一個(gè)Demo來簡單示例:
public class ImageResolver implements Resolver { public static final String IMG_MATCH_REGULAR = "\\[img](\\w+)\\[/img]"; public static Pattern PATTERN = Pattern.compile(IMG_MATCH_REGULAR); //參數(shù)中的sp是該Textview的content,extra是方便我們使用的一個(gè)附加的數(shù)據(jù),默認(rèn)是空的,我們?nèi)绻M麖耐饷鎮(zhèn)魅霐?shù)據(jù)到這里面可以通過richTextWrapper.putExtra()來實(shí)現(xiàn) @Override public void resolve(final TextView textView, final Spannable sp, SparseArray<Object> extra, final RichTexts.RichTextClickListener listener) { Matcher matcher = PATTERN.matcher(sp); final Context context = textView.getContext(); while(matcher.find()){ String content = matcher.group(1); final RichTexts.TaggedInfo info = new RichTexts.TaggedInfo(matcher.start(),matcher.end(),content); if(listener!=null) { RichTexts.RichTextClickSpan span = new RichTexts.RichTextClickSpan(listener,info.content); sp.setSpan(span, info.start, info.end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } RichTexts.StickerSpan testSpan = new RichTexts.StickerSpan(context, R.drawable.icon,100,100); RichTexts.setImageSpan(sp, info, testSpan); textView.postInvalidate(); } }
上面的示例中,RichTextClickSpan是大家如果需要實(shí)現(xiàn)點(diǎn)擊效果必須要用到的,而StickerSpan則是實(shí)現(xiàn)圖像效果,以上一個(gè)可點(diǎn)擊的圖像的Resolver就實(shí)現(xiàn)了,當(dāng)然上文中是隨便傳入一個(gè)icon,真實(shí)情況,大家需要自己根據(jù)內(nèi)容以及所期待的效果自己再做些調(diào)整。
相關(guān)文章
Android使用HttpURLConnection實(shí)現(xiàn)網(wǎng)絡(luò)訪問流程
早些時(shí)候其實(shí)我們都習(xí)慣性使用HttpClient,但是后來Android6.0之后不再支持HttpClient,需要添加Apache的jar才行,所以,就有很多開發(fā)者放棄使用HttpClient了,HttpURLConnection畢竟是標(biāo)準(zhǔn)Java接口(java.net) ,適配性還是很強(qiáng)的2022-12-12Android點(diǎn)擊按鈕返回頂部實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Android返回頂部實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02Android studio創(chuàng)建第一個(gè)app
這篇文章主要為大家詳細(xì)介紹了如何使用Android studio創(chuàng)建你的第一個(gè)項(xiàng)目Hello World,感興趣的小伙伴們可以參考一下2016-05-05Android自定義View實(shí)現(xiàn)球形動態(tài)加速球
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)球形動態(tài)加速球,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06一文詳解?Compose?Navigation?的實(shí)現(xiàn)原理
這篇文章主要介紹了一文詳解?Compose?Navigation的實(shí)現(xiàn)原理,文章通告圍繞主題展開詳細(xì)的相關(guān)內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08Android性能優(yōu)化之弱網(wǎng)優(yōu)化詳解
這篇文章主要為大家介紹了Android性能優(yōu)化之弱網(wǎng)優(yōu)化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10