国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android中的SpannableString與SpannableStringBuilder詳解

2019-10-22 18:25:10
字體:
來源:轉載
供稿:網友

前言

最近在學習Android開發,發現確實有太多東西需要去整理,去學習。慢慢來吧,任何東東的深入學習都是不簡單的。今天稍微整理下SpannableString與SpannableStringBuilder,因為在上篇中,我們曾講到過有關CharSequence的東東,有關CharSequence的話,這兩個類是必談的,所以這里加以整理。

一、概述

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:

//使用SpannableString,必須一次傳入,構造完成 SpannableString word = new SpannableString("歡迎光臨Harvic的博客");  //使用SpannableStringBuilder,可以使用append()再添加 SpannableStringBuilder multiWord = new SpannableStringBuilder(); multiWord.append("歡迎光臨"); multiWord.append("Harvic的"); multiWord.append("博客"); 

spannablestring,居中,加粗,換行

(轉自博客:《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控件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent"  tools:context="com.example.try_spannable_blog.MainActivity" >   <EditText  android:id="@+id/edit"  android:layout_width="wrap_content"  android:layout_height="wrap_content" />  </RelativeLayout> 

(2)、這里用一個改變字體顏色的Span來做下演示

public class MainActivity extends Activity {   private EditText editText;  @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);   editText = (EditText)findViewById(R.id.edit);   //改變字體顏色  //先構造SpannableString  SpannableString spanString = new SpannableString("歡迎光臨Harvic的博客");  //再構造一個改變字體顏色的Span  ForegroundColorSpan span = new ForegroundColorSpan(Color.BLUE);  //將這個Span應用于指定范圍的字體  spanString.setSpan(span, 1, 3, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);  //設置給EditText顯示出來  editText.setText(spanString);  } } 

初始化效果是這樣的:

spannablestring,居中,加粗,換行

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

spannablestring,居中,加粗,換行

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

二、各種Span設置

在前面的一個小示例,大家應該也可以看出,要應用一個Span總共分三步:

      1、構造String

      2、構造Span
      3、利用SetSpan()對指定范圍的String應用這個Span

1、字體顏色設置(ForegroundColorSpan)

SpannableString spanString = new SpannableString("歡迎光臨Harvic的博客"); //再構造一個改變字體顏色的Span ForegroundColorSpan span = new ForegroundColorSpan(Color.BLUE); //將這個Span應用于指定范圍的字體 spanString.setSpan(span, 1, 5, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); //設置給EditText顯示出來 editText.setText(spanString); 

效果:

spannablestring,居中,加粗,換行

2、字體背景顏色(BackgroundColorSpan)

SpannableString spanString = new SpannableString("歡迎光臨Harvic的博客"); BackgroundColorSpan span = new BackgroundColorSpan(Color.YELLOW); spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); editText.setText(spanString); 

spannablestring,居中,加粗,換行

3、字體大小(AbsoluteSizeSpan)

SpannableString spanString = new SpannableString("歡迎光臨Harvic的博客"); AbsoluteSizeSpan span = new AbsoluteSizeSpan(16); spanString.setSpan(span, 2, 5, Spannable.SPAN_INCLUSIVE_INCLUSIVE); editText.setText(spanString); 

spannablestring,居中,加粗,換行

4、粗體、斜體(StyleSpan)

SpannableString spanString = new SpannableString("歡迎光臨Harvic的博客"); StyleSpan span = new StyleSpan(Typeface.BOLD_ITALIC); spanString.setSpan(span, 1, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); editText.setText(spanString); 

spannablestring,居中,加粗,換行

5、刪除線(StrikethroughSpan)

SpannableString spanString = new SpannableString("歡迎光臨Harvic的博客"); StrikethroughSpan span = new StrikethroughSpan(); spanString.setSpan(span, 2, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); editText.setText(spanString); 

spannablestring,居中,加粗,換行

6、下劃線(UnderlineSpan)

SpannableString spanString = new SpannableString("歡迎光臨Harvic的博客"); UnderlineSpan span = new UnderlineSpan(); spanString.setSpan(span, 1, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); editText.setText(spanString); 

spannablestring,居中,加粗,換行

7、圖片置換(ImageSpan)

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

SpannableString spanString = new SpannableString("歡迎光臨Harvic的博客"); Drawable d = getResources().getDrawable(R.drawable.ic_launcher); d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE); spanString.setSpan(span, 2, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); editText.setText(spanString); 

spannablestring,居中,加粗,換行

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 和平县| 阳谷县| 阿合奇县| 永宁县| 卢湾区| 攀枝花市| 西峡县| 若尔盖县| 当阳市| 新平| 应城市| 夹江县| 东海县| 梨树县| 宁远县| 息烽县| 玉环县| 甘肃省| 诸城市| 清涧县| 连南| 密山市| 盐边县| 贵德县| 巴林右旗| 嘉祥县| 原阳县| 公安县| 休宁县| 淳化县| 稻城县| 枝江市| 镶黄旗| 小金县| 诸暨市| 前郭尔| 波密县| 贺兰县| 黔西县| 兴化市| 抚顺县|