Android項目實戰(一): SpannableString與SpannableStringBuilder

來源:互聯網
上載者:User

標籤:初始   範圍   介紹   置換   sequence   實現   參數說明   圖片   注意   

原文:Android項目實戰(一): SpannableString與SpannableStringBuilder

前言:

曾經在一些APP中的一些類似“協助”“關於”的介面看過一行文字顯示不同的顏色的效果,如下效果:

本軟體是一款高、大、上的社區類軟體。

一般來說,這應該是由一個TextView來顯示的,但是自己又不會實現,怎麼辦呢,只能一個顏色搞一個TextView連起來,形成上面的效果。

但是那樣實現的話都顯得太低級了。直到我偶然的知道了SpannableString 類。網上學習了一下,挺簡單的一個類,網上詳細的介紹很多,自己就不再測試寫博了,直接轉一個寫的不錯的留著以後項目中用吧。

本文轉自:

http://blog.csdn.net/harvic880925/article/details/38984705 

一、概述

 

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:

 

[java] view plaincopy 
  1. //使用SpannableString,必須一次傳入,構造完成  
  2. SpannableString word = new SpannableString("歡迎光臨Harvic的部落格");  
  3.   
  4. //使用SpannableStringBuilder,可以使用append()再添加  
  5. SpannableStringBuilder multiWord = new SpannableStringBuilder();  
  6. multiWord.append("歡迎光臨");  
  7. multiWord.append("Harvic的");  
  8. multiWord.append("部落格");  


(轉自部落格:《android - SpannableString或SpannableStringBuilder以及string.xml檔案中的整型和string型代替》)

 

因為Spannable等最終都實現了CharSequence介面,所以可以直接把SpannableString和SpannableStringBuilder通過TextView.setText()設定給TextView。

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:前後都包括。

舉個例子來說明這個前後包括的問題:

由於Flag的作用是用來指定範圍前後輸入新的字元時,會不會應用效果的,所以我們利用EditText來顯示SpannableString

(1)、布局XML中加入一個EditText控制項:

 

[html] view plaincopy 
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     tools:context="com.example.try_spannable_blog.MainActivity" >  
  6.   
  7.     <EditText  
  8.         android:id="@+id/edit"  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content" />  
  11.   
  12. </RelativeLayout>  

(2)、這裡用一個改變字型顏色的Span來做下示範

[java] view plaincopy 
  1. public class MainActivity extends Activity {  
  2.       
  3.     private EditText editText;    
  4.     @Override  
  5.     protected void onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         setContentView(R.layout.activity_main);  
  8.           
  9.         editText = (EditText)findViewById(R.id.edit);  
  10.           
  11.         //改變字型顏色  
  12.         //先構造SpannableString  
  13.         SpannableString spanString = new SpannableString("歡迎光臨Harvic的部落格");    
  14.        //再構造一個改變字型顏色的Span  
  15.         ForegroundColorSpan span = new ForegroundColorSpan(Color.BLUE);    
  16.         //將這個Span應用於指定範圍的字型  
  17.         spanString.setSpan(span, 1, 3, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);    
  18.         //設定給EditText顯示出來  
  19.         editText.setText(spanString);  
  20.     }  
  21. }  

初始化效果是這樣的:

分別在設定Span的前面和後面加入新文字,結果是這樣的

 

在前面和後面都加入蝦米兩個字,可見,前面的蝦米沒有任何效果,後面的則不同,添加上相同的Span特效,這是由於我們設定了Spannable.SPAN_EXCLUSIVE_INCLUSIVE的原因,即(前面不應用特效,後面應用特效),其它幾個Flags參數的含義想必大家也都清楚了。在此就不再贅述。

 

二、各種Span設定

在前面的一個小樣本,大家應該也可以看出,要應用一個Span總共分三步:
1、構造String
2、構造Span
3、利用SetSpan()對指定範圍的String應用這個Span

1、字型顏色設定(ForegroundColorSpan)

 

 

[java] view plaincopy 
  1. SpannableString spanString = new SpannableString("歡迎光臨Harvic的部落格");    
  2. //再構造一個改變字型顏色的Span  
  3. ForegroundColorSpan span = new ForegroundColorSpan(Color.BLUE);    
  4. //將這個Span應用於指定範圍的字型  
  5. spanString.setSpan(span, 1, 5, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);    
  6. //設定給EditText顯示出來  
  7. editText.setText(spanString);  

效果:

2、字型背景顏色(BackgroundColorSpan)

 

 

[java] view plaincopy 
  1. SpannableString spanString = new SpannableString("歡迎光臨Harvic的部落格");    
  2. BackgroundColorSpan span = new BackgroundColorSpan(Color.YELLOW);    
  3. spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);    
  4. editText.setText(spanString);    

3、字型大小(AbsoluteSizeSpan)

 

 

[java] view plaincopy 
  1. SpannableString spanString = new SpannableString("歡迎光臨Harvic的部落格");    
  2. AbsoluteSizeSpan span = new AbsoluteSizeSpan(16);    
  3. spanString.setSpan(span, 2, 5, Spannable.SPAN_INCLUSIVE_INCLUSIVE);    
  4. editText.setText(spanString);   

4、粗體、斜體(StyleSpan)

 

 

[java] view plaincopy 
  1. SpannableString spanString = new SpannableString("歡迎光臨Harvic的部落格");    
  2. StyleSpan span = new StyleSpan(Typeface.BOLD_ITALIC);    
  3. spanString.setSpan(span, 1, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);    
  4. editText.setText(spanString);   

5、刪除線(StrikethroughSpan)

 

 

[java] view plaincopy 
  1. SpannableString spanString = new SpannableString("歡迎光臨Harvic的部落格");    
  2. StrikethroughSpan span = new StrikethroughSpan();    
  3. spanString.setSpan(span, 2, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);    
  4. editText.setText(spanString);   

6、底線(UnderlineSpan)

 

 

[java] view plaincopy 
  1. SpannableString spanString = new SpannableString("歡迎光臨Harvic的部落格");    
  2. UnderlineSpan span = new UnderlineSpan();    
  3. spanString.setSpan(span, 1, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);    
  4. editText.setText(spanString);   



7、圖片置換(ImageSpan)

ImagSpan有很多建構函式,一般是通過傳入Drawableg來構造,詳細的構造說明看這裡:http://developer.android.com/reference/android/text/style/ImageSpan.html

 

[java] view plaincopy 
  1. SpannableString spanString = new SpannableString("歡迎光臨Harvic的部落格");    
  2. Drawable d = getResources().getDrawable(R.drawable.ic_launcher);    
  3. d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());    
  4. ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);    
  5. spanString.setSpan(span, 2, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);    
  6. editText.setText(spanString);   


這個函數的不同之處在於,前幾都是在原來文字的基礎上加上特效,而這裡卻是利用圖片將文字替換。如果遇到不支援顯示圖片的函數,比如前一篇中的canvas繪圖。就會退化成String,即以原來的String字串來顯示。

 

 

本篇文章所涉及到圖片及工程:http://download.csdn.net/detail/harvic880925/7854761

 

請大家尊重原創者著作權,轉載請標明出處:http://blog.csdn.net/harvic880925/article/details/38984705 謝謝!

Android項目實戰(一): SpannableString與SpannableStringBuilder

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.