SpannableString與SpannableStringBuilder使用

来源:http://www.cnblogs.com/upwgh/archive/2016/09/22/5897495.html
-Advertisement-
Play Games

1、SpannableString、SpannableStringBuilder與String的關係 首先SpannableString、SpannableStringBuilder基本上與String差不多,也是用來存儲字元串,但它們倆的特殊就在於有一個SetSpan()函數,能給這些存儲的Str... ...


轉自:http://blog.it985.com/14433.html
1、SpannableString、SpannableStringBuilder與String的關係 首先SpannableString、SpannableStringBuilder基本上與String差不多,也是用來存儲字元串,但它們倆的特殊就在於有一個SetSpan()函數,能給這些存儲的String添加各種格式或者稱樣式(Span),將原來的String以不同的樣式顯示出來,比如在原來String上加下劃線、加背景色、改變字體顏色、用圖片把指定的文字給替換掉,等等。所以,總而言之,SpannableString、SpannableStringBuilder與String一樣, 首先也是傳字元串,但SpannableString、SpannableStringBuilder可以對這些字元串添加額外的樣式信息,但String則不行。 註意:如果這些額外信息能被所用的方式支持,比如將SpannableString傳給TextView;也有對這些額外信息不支持的,比如前一章講到的Canvas繪製文字,對於不支持的情況,SpannableString和SpannableStringBuilder就是退化為String類型,直接顯示原來的String字元串,而不會再顯示這些附加的額外信息。 2、SpannableString與SpannableStringBuilder區別 它們的區別在於 SpannableString像一個String一樣,構造對象的時候傳入一個String,之後再無法更改String的內容,也無法拼接多個 SpannableString;而SpannableStringBuilder則更像是StringBuilder,它可以通過其append()方法來拼接多個String; 3、SetSpan() void setSpan (Object what, int start, int end, int flags) 函數意義:給SpannableString或SpannableStringBuilder特定範圍的字元串設定Span樣式,可以設置多個(比如同時加上下劃線和刪除線等),Falg參數標識了當在所標記範圍前和標記範圍後緊貼著插入新字元時的動作,即是否對新插入的字元應用同樣的樣式。 參數說明: object what :對應的各種Span,後面會提到; int start:開始應用指定Span的位置,索引從0開始 int end:結束應用指定Span的位置,特效並不包括這個位置。比如如果這裡數為3(即第4個字元),第4個字元不會有任何特效。從下麵的例子也可以看出來。 int flags:取值有如下四個 Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前後都不包括,即在指定範圍的前面和後面插入新字元都不會應用新樣式 Spannable.SPAN_EXCLUSIVE_INCLUSIVE :前面不包括,後麵包括。即僅在範圍字元的後面插入新字元時會應用新樣式 Spannable.SPAN_INCLUSIVE_EXCLUSIVE :前麵包括,後面不包括。 Spannable.SPAN_INCLUSIVE_INCLUSIVE :前後都包括。 下麵寫了個小demo,先看一下效果圖:


  1 public class MainActivity extends Activity implements OnClickListener {
  2     private TextView tv;
  3     private Button underline_btn;
  4     private Button strike_btn;
  5     private Button style_btn;
  6     private Button font_btn;
  7     private Button color_btn1;
  8     private Button color_btn2;
  9     private Button url_btn;
 10     private Button image_btn;
 11     private Button maskfilte_btn;
 12     private Button Rasterizer_btn;
 13     private Button spannablestringbuilder;
 14     @Override
 15     protected void onCreate(Bundle savedInstanceState) {
 16         super.onCreate(savedInstanceState);
 17         setContentView(R.layout.activity_main);
 18         tv = (TextView) this.findViewById(R.id.tv);
 19         underline_btn = (Button) this.findViewById(R.id.underline_btn);
 20         strike_btn = (Button) this.findViewById(R.id.strike_btn);
 21         style_btn = (Button) this.findViewById(R.id.style_btn);
 22         font_btn = (Button) this.findViewById(R.id.font_btn);
 23         color_btn1 = (Button) this.findViewById(R.id.color_btn1);
 24         color_btn2 = (Button) this.findViewById(R.id.color_btn2);
 25         url_btn = (Button) this.findViewById(R.id.url_btn);
 26         image_btn = (Button) this.findViewById(R.id.image_btn);
 27         maskfilte_btn = (Button) this.findViewById(R.id.maskfilte_btn);
 28         Rasterizer_btn = (Button) this.findViewById(R.id.Rasterizer_btn);
 29         spannablestringbuilder = (Button) this.findViewById(R.id.spannablestringbuilder);
 30  
 31         underline_btn.setOnClickListener(this);
 32         strike_btn.setOnClickListener(this);
 33         style_btn.setOnClickListener(this);
 34         font_btn.setOnClickListener(this);
 35         color_btn1.setOnClickListener(this);
 36         color_btn2.setOnClickListener(this);
 37         url_btn.setOnClickListener(this);
 38         image_btn.setOnClickListener(this);
 39         maskfilte_btn.setOnClickListener(this);
 40         Rasterizer_btn.setOnClickListener(this);
 41         spannablestringbuilder.setOnClickListener(this);
 42  
 43     }
 44  
 45     @Override
 46     public void onClick(View v) {
 47         switch (v.getId()) {
 48         case R.id.underline_btn:
 49             addUnderLineSpan();
 50             break;
 51         case R.id.strike_btn:
 52             addStrikeSpan();
 53             break;
 54         case R.id.style_btn:
 55             addStyleSpan();
 56             break;
 57         case R.id.font_btn:
 58             addFontSpan();
 59             break;
 60         case R.id.color_btn1:
 61             addForeColorSpan();
 62             break;
 63         case R.id.color_btn2:
 64             addBackColorSpan();
 65             break;
 66         case R.id.url_btn:
 67             addUrlSpan();
 68             break;
 69         case R.id.image_btn:
 70             addImageSpan();
 71             break;
 72         case R.id.maskfilte_btn:
 73             addmaskfilteSpan();
 74             break;
 75         case R.id.Rasterizer_btn:
 76             addRasterizerSpan();
 77             break;
 78         case R.id.spannablestringbuilder:
 79             addspannablestringbuilderSpan();
 80             break;
 81         }
 82     }
 83     /**
 84      * spannablestringbuilder
 85      */
 86     private void addspannablestringbuilderSpan() {
 87         SpannableStringBuilder ss=new SpannableStringBuilder("紅色超鏈接斜體刪除線綠色下劃線圖片:."); 
 88            //用顏色標記文本
 89         ss.setSpan(new ForegroundColorSpan(Color.RED), 0, 2, 
 90                 //setSpan時需要指定的 flag,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE(前後都不包括).
 91                 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
 92         //用超鏈接標記文本
 93         ss.setSpan(new URLSpan("tel:4155551212"), 2, 5, 
 94                 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
 95         //用樣式標記文本(斜體)
 96         ss.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 5, 7, 
 97                 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
 98         //用刪除線標記文本
 99         ss.setSpan(new StrikethroughSpan(), 7, 10, 
100                 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
101         //用下劃線標記文本
102         ss.setSpan(new UnderlineSpan(), 10, 16, 
103                 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
104         //用顏色標記
105         ss.setSpan(new ForegroundColorSpan(Color.GREEN), 10, 12, 
106                 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
107         //獲取Drawable資源
108         Drawable d = getResources().getDrawable(R.drawable.ic_launcher); 
109         d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
110         //創建ImageSpan
111         ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);
112         //用ImageSpan替換文本
113         ss.setSpan(span, 18, 19, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
114         tv.append("\n");
115         tv.setText(ss);
116         tv.setMovementMethod(LinkMovementMethod.getInstance()); //實現文本的滾動 
117     }
118  
119     /*
120      * Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前後都不包括,即在指定範圍的前面和後面插入新字元都不會應用新樣式
121      * Spannable.SPAN_EXCLUSIVE_INCLUSIVE :前面不包括,後麵包括。即僅在範圍字元的後面插入新字元時會應用新樣式
122      * Spannable.SPAN_INCLUSIVE_EXCLUSIVE :前麵包括,後面不包括。
123      * Spannable.SPAN_INCLUSIVE_INCLUSIVE :前後都包括。
124      */
125     /**
126      * 光柵效果
127      */
128     private void addRasterizerSpan() {
129         SpannableString spanText = new SpannableString("StrikethroughSpan");
130         spanText.setSpan(new StrikethroughSpan(), 0, 7, Spannable.
131         SPAN_INCLUSIVE_EXCLUSIVE);
132         tv.append("\n");
133         tv.append(spanText);
134          
135     }
136     /**
137      * 修飾效果
138      */
139     private void addmaskfilteSpan() {
140         SpannableString spanText = new SpannableString("benzlocke6666666");
141         int length = spanText.length();
142         //模糊(BlurMaskFilter)
143         MaskFilterSpan maskFilterSpan = new MaskFilterSpan(new BlurMaskFilter(3, Blur.OUTER));
144         spanText.setSpan(maskFilterSpan, 0, length - 10, Spannable.
145         SPAN_INCLUSIVE_EXCLUSIVE);
146         //浮雕(EmbossMaskFilter)
147         maskFilterSpan = new MaskFilterSpan(new EmbossMaskFilter(new float[]{1,1,3}, 1.5f, 8, 3));
148         spanText.setSpan(maskFilterSpan, length - 10, length, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
149         tv.append("\n");
150         tv.append(spanText);
151          
152     }
153  
154     /**
155      * 超鏈接
156      */
157     private void addUrlSpan() {
158         SpannableString spanString = new SpannableString("超鏈接");
159         URLSpan span = new URLSpan("tel:0123456789");
160         spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
161         tv.append("\n");
162         tv.append(spanString);
163          
164         tv.setMovementMethod(LinkMovementMethod.getInstance());
165     }
166  
167     /**
168      * 文字背景顏色
169      */
170     private void addBackColorSpan() {
171         SpannableString spanString = new SpannableString("文字背景顏色");
172         BackgroundColorSpan span = new BackgroundColorSpan(Color.YELLOW);
173         spanString.setSpan(span, 0, 6, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
174         tv.append("\n");
175         tv.append(spanString);
176     }
177  
178     /**
179      * 文字顏色
180      */
181     private void addForeColorSpan() {
182         SpannableString spanString = new SpannableString("文字顏色");
183         ForegroundColorSpan span = new ForegroundColorSpan(Color.BLUE);
184         spanString.setSpan(span, 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
185         tv.append("\n");
186         tv.append(spanString);
187     }
188  
189     /**
190      * 字體大小
191      */
192     private void addFontSpan() {
193         SpannableString spanString = new SpannableString("36號字體");
194         AbsoluteSizeSpan span = new AbsoluteSizeSpan(36);
195         spanString.setSpan(span, 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
196         tv.append("\n");
197         tv.append(spanString);
198     }
199  
200     /**
201      * 粗體,斜體
202      */
203     private void addStyleSpan() {
204         SpannableString spanString = new SpannableString("ABCDEF");
205         StyleSpan span = new StyleSpan(Typeface.BOLD_ITALIC);
206         spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
207         tv.append("\n");
208         tv.append(spanString);
209     }
210  
211     /**
212      * 刪除線
213      */
214     private void addStrikeSpan() {
215         SpannableString spanString = new SpannableString("刪除線");
216         StrikethroughSpan span = new StrikethroughSpan();
217         spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
218         tv.append("\n");
219         tv.append(spanString);
220     }
221  
222     /**
223      * 下劃線
224      */
225     private void addUnderLineSpan() {
226         SpannableString spanString = new SpannableString("下劃線");
227         UnderlineSpan span = new UnderlineSpan();
228         spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
229         tv.append("\n");
230         tv.append(spanString);
231     }
232  
233     /**
234      * 圖片
235      */
236     private void addImageSpan() {
237         SpannableString spanString = new SpannableString(" ");
238         Drawable d = getResources().getDrawable(R.drawable.ic_launcher);
239         d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
240         ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);
241         spanString.setSpan(span, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
242         tv.append("\n");
243         tv.append(spanString);
244     }
245 }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文章向大家介紹一個純css3製作的哆啦a夢圖像,主要巧妙的使用了css3的border-radius屬性,需要的朋友介意參考一下本文章的源碼。 效果圖: 源碼 線上運行 原文地址:http://www.manongjc.com/article/1203.html ...
  • 開本系列,討論一些有趣的 CSS 題目,拋開實用性而言,一些題目為了拓寬一下解決問題的思路,此外,涉及一些容易忽視的 CSS 細節。 解題不考慮相容性,題目天馬行空,想到什麼說什麼,如果解題中有你感覺到生僻的 CSS 屬性,趕緊去補習一下吧。 不斷更新,不斷更新,不斷更新,重要的事情說三遍。 所有題 ...
  • 摘要: 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 大概花了4,5天時間,做了一個對資料庫幾張表的維護的系統,採用的是MVC4+easyui構建,先附上幾張截圖讓大家瞭解下: 功能無非就是,增,刪,改,查,分頁顯示,功能很簡單,但是,主要是講下碰到的幾個問題: 一,大家都知道,通過點擊左邊 ...
  • IE7 下,不能夠自定義<select>/<option>的樣式,所以為了方便起見,用div可以進行模擬 註意事項:1、如果有多個併列,互相之間會相互影響,IE7下,會被遮擋,為避免此問題,所有 設置層級為:1,選中時,層級改為22、<a>標簽,缺少herf屬性的話,IE7下將無hover效果3、使 ...
  • 使用volley進行網路請求:需先將volley包導入androidstudio中 File下的Project Structrue,點加號導包 volley網路請求步驟: 1. 創建請求隊列 RequestQueue queue = Volley.newRequestQueue(this); 2.創 ...
  • 本文結合之前的動態創建fragment來進行一個實踐,來實現用Fragment創建一個選項卡 本文地址:http://www.cnblogs.com/wuyudong/p/5898075.html ,轉載請註明源地址。 項目佈局 新建Fragment1.java~Fragment4.java,其中F ...
  • 大家好,好久沒有跟新了。其實也就昨天到今天的時間。 前言:實際上,GIF動圖文件中包含了一組圖片及其信息數組,這些信息數據記錄著這一組圖片中各張圖片的播放時長等信息,我們可以將圖片和這些信息或取出來,使用UIImageView的幀動畫技術進行動畫播放。 好了不多說了 開始上代碼吧: 首先自己找一個G ...
  • 隨著Android應用開發規模的擴大,客戶端業務邏輯也越來越複雜,已然不是簡單的數據展示了。如同後端開發遇到瓶頸時採用的組件拆分思想,客戶端也需要進行架構設計,拆分視圖和數據,解除模塊之間的耦合,提高模塊內部的聚合度。 開始之前先上一張內部分享時用的PPT圖: 以上是筆者在客戶端開發過程中面臨的問題 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...