用SpannableString来设置一个textview的各种样式

通常情况下,textview 设置文本的样式很单一,为了满足某种需求可以使用SpannableString来设置文本字体大小、颜色、超链接等属性。

xml就一个TextView所以就不在给出了,直接看代码。

 1 package com.dj.test;
 2 
 3 import android.app.Activity;
 4 import android.graphics.Color;
 5 import android.os.Bundle;
 6 import android.text.SpannableString;
 7 import android.text.Spanned;
 8 import android.text.method.ScrollingMovementMethod;
 9 import android.text.style.AbsoluteSizeSpan;
10 import android.text.style.BackgroundColorSpan;
11 import android.text.style.ForegroundColorSpan;
12 import android.text.style.RelativeSizeSpan;
13 import android.text.style.StyleSpan;
14 import android.text.style.URLSpan;
15 import android.text.style.UnderlineSpan;
16 import android.widget.TextView;
17 
18 public class MainActivity extends Activity {
19     private TextView tv;
20 
21     @Override
22     protected void onCreate(Bundle savedInstanceState) {
23         super.onCreate(savedInstanceState);
24         setContentView(R.layout.activity_main);
25         tv = (TextView) findViewById(R.id.tv);
26         String str = "每个人都有一个死角, 
 自己走不出来,别人也闯不进去。
我把最深沉的秘密放在那里。
你不懂我,我不怪你。www.baidu.com " +
27                 "
每个人都有一道伤口,
或深或浅,盖上布,以为不存在。
我把最殷红的鲜血涂在那里。
你不懂我,我不怪你。" +
28                 "
每个人都有一段告白,
忐忑、不安,却饱含真心和勇气。
我把最抒情的语言用在那里,
你不懂我,我不怪你。" +
29                 "
每个人都有一场爱恋,
用心、用情、用力,感动也感伤。
我把最炙热的心情藏在那里,
你不懂我,我不怪你。" +
30                 "
每个人都有一行眼泪,
喝下的冰冷的水,酝酿成的热泪。
我把最心酸的委屈汇在那里,
你不懂我,我不怪你。";
31         
32         SpannableString spanStr = new SpannableString(str);
33         //设置字体的绝对大小,原来字体为20sp,所以10表示原来字体的一半。true表示字体大小与屏幕有关,与像素无关。
34         spanStr.setSpan(new AbsoluteSizeSpan(10, true), 2, 5,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
35         //设置字体的相对大小,正常大小为1,所以0.5f为原来的一半
36         spanStr.setSpan(new RelativeSizeSpan(0.5f), 7, 10,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
37         //设置字体的背景色
38         spanStr.setSpan(new BackgroundColorSpan(Color.CYAN), 11, 15,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
39         //设置字体的前景色
40         spanStr.setSpan(new ForegroundColorSpan(Color.MAGENTA), 16, 19,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
41         //设置粗体
42         spanStr.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 22, 24, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
43         //设置下划线
44         spanStr.setSpan(new UnderlineSpan(), 30, 37, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  
45         //设置超链接
46         spanStr.setSpan(new URLSpan("http://www.baidu.com"), 53, 66, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  
47         //设置textview超出屏幕是可滚动
48         tv.setMovementMethod(ScrollingMovementMethod.getInstance());
49         tv.setText(spanStr);
50     }
51 }

用SpannableString还可以设置很多属性,就不在用代码一一举例说明了。

  //设置字体样式正常,粗体,斜体,粗斜体 
        spanStr.setSpan(new StyleSpan(android.graphics.Typeface.NORMAL), 18, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //正常 
        spanStr.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 20, 22, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //粗体 
        spanStr.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 22, 24, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //斜体 
        spanStr.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 24, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //粗斜体 
         
        //设置下划线 
        spanStr.setSpan(new UnderlineSpan(), 27, 30, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
         
        //设置删除线 
        spanStr.setSpan(new StrikethroughSpan(), 30, 33, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
         
        //设置上下标 
        spanStr.setSpan(new SubscriptSpan(), 34, 35, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //下标    
        spanStr.setSpan(new SuperscriptSpan(), 36, 37, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);   //上标             
         
        //超级链接(需要添加setMovementMethod方法附加响应) 
        spanStr.setSpan(new URLSpan("tel:4155551212"), 37, 39, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //电话    
        spanStr.setSpan(new URLSpan("mailto:webmaster@google.com"), 39, 41, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //邮件    
        spanStr.setSpan(new URLSpan("http://www.baidu.com"), 41, 43, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //网络    
        spanStr.setSpan(new URLSpan("sms:4155551212"), 43, 45, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //短信   使用sms:或者smsto: 
        spanStr.setSpan(new URLSpan("mms:4155551212"), 45, 47, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //彩信   使用mms:或者mmsto: 
        spanStr.setSpan(new URLSpan("geo:38.899533,-77.036476"), 47, 49, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //地图    
         
        //设置字体大小(相对值,单位:像素) 参数表示为默认字体宽度的多少倍 
        spanStr.setSpan(new ScaleXSpan(2.0f), 49, 51, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //2.0f表示默认字体宽度的两倍,即X轴方向放大为默认字体的两倍,而高度不变 

原文地址:https://www.cnblogs.com/dj168/p/SpannableString.html