Android花样Text设置神器之SpanableString
? ? ? ?TextView在Android中幾乎是再常見不過的控件了,幾乎遍布在各個角落里,對TextView并沒有什么技術點來做分析,但是有時候可能會需要你在項目中處理一些特殊字體,比如下劃線,橫穿線,亦或者是為TextView部分字體設置點擊或者顏色背景等等,這點需求雖然不是什么難事,但是選不好解決方法真的會可能會讓你折騰好久。說了這么多無非就是開篇引個題,下面為大家介紹SpanableString哈。
里面需要具體分析的技術點并不是太多,我先給大家貼上源碼,看看google是怎么定義這么一個東東的。
/*** This is the class for text whose content is immutable but to which* markup objects can be attached and detached.* For mutable text, see {@link SpannableStringBuilder}.*/?
上面這段內容摘自安卓SpanableString源碼里面的注釋,大體意思就是說
這是一個內容和標記都可以更改的文本類
其實源碼內容并不是太多,感興趣的話可以去查看下源碼
源碼關鍵的兩個方法
public void setSpan(Object what, int start, int end, int flags) {}public void removeSpan(Object what) {}我先帶大家簡單使用下這個控件,然后在來分析,其實說到這里有一個小細節開篇的時候忘記跟大家提起了,就是看到SpanableString,其實還有SpanableStringBuilder,其用法類似,大家可以類比String跟StringBuilder來區別,我在此不多解釋了,就像你會有String肯定也會使用StringBuilder,我就不在做重復的解釋了,下面先來具體舉個例子帶大家認識下這個東東。
?
SpannableString spannableString = new SpannableString("轉點軟件技術工作室技術分享專題");ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.parseColor("#009ad6"));spannableString.setSpan(colorSpan, 0, 3, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);((TextView)findViewById(R.id.mode1)).setText(spannableString);?
通過上述代碼就可以實現開篇提到的給部分字體設置顏色的效果,那趁著大家現在對SpanableString有個大概的認識之后我先簡單分析下流程,然后再把其他使用方法給大家總結下。
?
我個人是吧SpanableString理解成一個特殊的字符串,不同于String的是他可以在上面做出一些花哨的東西,示例代碼中分四步完成了這一操作。
1.先是new出一個SpanableString對象,并為其初始化一個字符串,
2.然后通過span的方式生成一個colorSpan對象,這里的span可以設置成其他任何你想設置的形式,比如開篇提到的下劃線或者上劃線,點擊事件都可以,對應于不同的span對象,稍后我整理給大家。
3.為SpanableString設置span。setSpan的四個參數稍后我結合源碼分析給大家。
4.為textView設置特殊樣式的字體。
?
具體分析:
從上面的步驟中大家也看出了,其實設置特殊樣式的關鍵步驟在第2步,下面我先為大家整理里具體都可以設置那些特殊樣式:
常用到的Span大致如下
BackgroundColorSpan : 文本背景色ForegroundColorSpan : 文本顏色MaskFilterSpan : 修飾效果,如模糊(BlurMaskFilter)浮雕RasterizerSpan : 光柵效果StrikethroughSpan : 刪除線SuggestionSpan : 相當于占位符UnderlineSpan : 下劃線AbsoluteSizeSpan : 文本字體(絕對大小)DynamicDrawableSpan : 設置圖片,基于文本基線或底部對齊。ImageSpan : 圖片RelativeSizeSpan : 相對大小(文本字體)ScaleXSpan : 基于x軸縮放StyleSpan : 字體樣式:粗體、斜體等SubscriptSpan : 下標(數學公式會用到)SuperscriptSpan : 上標(數學公式會用到)TextAppearanceSpan : 文本外貌(包括字體、大小、樣式和顏色)TypefaceSpan : 文本字體URLSpan : 文本超鏈接ClickableSpan : 點擊事件其用法大家可以套用示例代碼中的樣子,無非是具體的Span類型不同,用法一致。
?
現在我解釋剛剛在第三步中說到的setSpan的用法,以及4個參數具體代表的含義,先給大家貼上setSpan的源碼。
public void setSpan(Object what, int start, int end, int flags) {super.setSpan(what, start, end, flags);}
上述源碼是我直接從SpanableString類中摘取出來的,
第一個參數 ?Object what:這個what就是上面分享的各種Span的類型,大家根據需要自己指定。
第二個第三個參數 int start int end:這兩個參數是Span開始跟結束的位置。
第四個參數: int flag 參數用4中類型,分別代表的意思為span開始結束的位置包含或者不包含start 、end,
flags的取值如下:
Spannable. SPAN_INCLUSIVE_EXCLUSIVE:前面包括,后面不包括,即在文本前插入新的文本會應用該樣式,而在文本后插入新文本不會應用該樣式
Spannable. SPAN_INCLUSIVE_INCLUSIVE:前面包括,后面包括,即在文本前插入新的文本會應用該樣式,而在文本后插入新文本也會應用該樣式
Spannable. SPAN_EXCLUSIVE_EXCLUSIVE:前面不包括,后面不包括
Spannable. SPAN_EXCLUSIVE_INCLUSIVE:前面不包括,后面包括
好了,看到這里我想你應該已經掌握了具體怎么設置特殊并且花哨的textview了,其他各種Span的設置,代碼大同小異我就不重復貼代碼帶大家演示了,有一個小細節需要大家注意下,我貼上代碼算是提醒下大家吧,在設置ClickableSpan的時候千萬別忘了setMovementMethod。示例代碼如下:
?
上述過程,如有分析不到位的地方,還請各位看官批評扶正。
?
?
?
?
總結
以上是生活随笔為你收集整理的Android花样Text设置神器之SpanableString的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用于Firefox的Google工具栏B
- 下一篇: Quora的技术探索