編輯:關於android開發
轉自: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 }
Android 源碼下載方法(Git 方式clone),androidgitAndroid源碼對於Android開發者來說,遲早有一天你會用到的,我也是從一個大牛那兒學過
模擬QQ側滑控件 實現三種界面切換效果(知識點:回調機制,解析網絡json數據,fragment用法等)。,jsonfragment需要用到的lib包 :解析json&n
Unity+高通Vuforia SDK——AR播放視頻 在之前的文章中我們已經實現了基本的圖片識別,並在識別的圖片上顯示3D模型,但是有的時候我們實際上需要在
android:自定義HorizontalScrollView實現qq側滑菜單 今天看了鴻洋_大神在慕課網講的qq5.0側滑菜單。學了不少的知識,同時也佩服鴻洋_大神