1. 程式人生 > >android 各種 span的生成 如:修改TextView中部分文字的顏色 ,生成圖片span

android 各種 span的生成 如:修改TextView中部分文字的顏色 ,生成圖片span

		textView = (TextView) findViewById(R.id.textview);
		SpannableStringBuilder builder = new SpannableStringBuilder(textView.getText().toString());
		
		//ForegroundColorSpan 為文字前景色,BackgroundColorSpan為文字背景色
		ForegroundColorSpan redSpan = new ForegroundColorSpan(Color.RED);
		ForegroundColorSpan whiteSpan = new ForegroundColorSpan(Color.WHITE);
		ForegroundColorSpan blueSpan = new ForegroundColorSpan(Color.BLUE);
		ForegroundColorSpan greenSpan = new ForegroundColorSpan(Color.GREEN);
		ForegroundColorSpan yellowSpan = new ForegroundColorSpan(Color.YELLOW);
		


		builder.setSpan(redSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
		builder.setSpan(whiteSpan, 1, 2, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
		builder.setSpan(blueSpan, 2, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
		builder.setSpan(greenSpan, 3, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
		builder.setSpan(yellowSpan, 4,5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
		
		textView.setText(builder);

 2) BackgroundColorSpan文字背景色

private void setBackgroundColorSpan() {  
    SpannableString spanString = new SpannableString("背景色");  
    BackgroundColorSpan span = new BackgroundColorSpan(Color.YELLOW);  
    spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
    tv.append(spanString);  
} 

3) StyleSpan         字型樣式:粗體、斜體等

private void setStyleSpan() {  
    SpannableString spanString = new SpannableString("粗體斜體");  
    StyleSpan span = new StyleSpan(Typeface.BOLD_ITALIC);  
    spanString.setSpan(span, 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
    tv.append(spanString);  
}  

 4)RelativeSizeSpan  相對大小

private void setRelativeFontSpan() {
	SpannableString spanString = new SpannableString("字型相對大小");
	spanString.setSpan(new RelativeSizeSpan(2.5f), 0, 6,Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
	tv.append(spanString);    
}

5) TypefaceSpan         文字字型

private void setTypefaceSpan() {
	SpannableString spanString = new SpannableString("文字字型");
	spanString.setSpan(new TypefaceSpan("monospace"), 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
	tv.append(spanText);
}

6) URLSpan 文字超連結

private void addUrlSpan() {  
    SpannableString spanString = new SpannableString("超連結");  
    URLSpan span = new URLSpan("http://www.baidu.com");  
    spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
    tv.append(spanString);  
}  


7) ImageSpan         圖片

private void addImageSpan() {  
    SpannableString spanString = new SpannableString("3 ");  
    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, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
    tv.append(spanString);  
} 

 注意new SpannableString後面 添加了"3空格"3是的佔位符號隨意,  空格一定要有的,不然回到導致下面BUG:

1.連續輸入多次imageSpan的時候:在換行的時候,會導致上面的一行ImageSpan消失

下面是我自己使用的方法,發現這個Bitmap轉換成ImageSpan,比較精確的高度
	/**
	 * 將文字 生成 文字圖片 生成顯示編碼的Bitmap,目前這個方法是可用的
	 * 
	 * @param contents
	 * @param context
	 * @return
	 */
	public static Bitmap creatCodeBitmap(String contents ,Context context) {
		float scale=context.getResources().getDisplayMetrics().scaledDensity;
		
		TextView tv = new TextView(context);
		LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
				LinearLayout.LayoutParams.MATCH_PARENT,
				LinearLayout.LayoutParams.WRAP_CONTENT);
		tv.setLayoutParams(layoutParams);
		tv.setText(contents);
		tv.setTextSize(scale*12);
		tv.setGravity(Gravity.CENTER_HORIZONTAL);
		tv.setDrawingCacheEnabled(true);
		tv.setTextColor(Color.BLACK);
		tv.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
				MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
		tv.layout(0, 0, tv.getMeasuredWidth(), tv.getMeasuredHeight());


		tv.setBackgroundColor(Color.GREEN);
		
		tv.buildDrawingCache();
		Bitmap bitmapCode = tv.getDrawingCache();
		return bitmapCode;
	}

8) ClickableSpan                 文字有點選事件

private TextView textView;
textView = (TextView)this.findViewById(R.id.textView);
String text = "顯示Activity";
SpannableString spannableString = new SpannableString(text);
spannableString.setSpan(new ClickableSpan() {
	@Override
	public void onClick(View widget) {
		Intent intent = new Intent(Main.this,OtherActivity.class);
		startActivity(intent);
	}
	// 表示點選整個text的長度都有效觸發這個事件
}, 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);
textView.setMovementMethod(LinkMovementMethod.getInstance());

9) UnderlineSpan         下劃線

private void addUnderLineSpan() {  
    SpannableString spanString = new SpannableString("下劃線");  
    UnderlineSpan span = new UnderlineSpan();  
    spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
    tv.append(spanString);  
} 

10) StrikethroughSpan  刪除線

private void addStrikeSpan() {  
    SpannableString spanString = new SpannableString("刪除線");  
    StrikethroughSpan span = new StrikethroughSpan();  
    spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
    tv.append(spanString);  
}  

11) SuggestionSpan  相當於佔位符
 


12) MaskFilterSpan  修飾效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter)
 


13) RasterizerSpan   光柵效果
 


14) AbsoluteSizeSpan   絕對大小(文字字型)

private void setAbsoluteFontSpan() {
		SpannableString spannableString = new SpannableString("40號字型");
		AbsoluteSizeSpan absoluteSizeSpan = new AbsoluteSizeSpan(40);
		spannableString.setSpan(absoluteSizeSpan, 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		editText.append(spannableString);
}








15) DynamicDrawableSpan    設定圖片,基於文字基線或底部對齊。

16) TextAppearanceSpan 文字外貌(包括字型、大小、樣式和顏色)

private void setTextAppearanceSpan() {
	SpannableString spanString = new SpannableString("文字外貌");
	TextAppearanceSpan textAppearanceSpan = new TextAppearanceSpan(this, android.R.style.TextAppearance_Medium);
	spanString.setSpan(textAppearanceSpan, 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
	tv.append(spanString);
}