用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 = "每个人都有一个死角, \n 自己走不出来,别人也闯不进去。\n我把最深沉的秘密放在那里。\n你不懂我,我不怪你。www.baidu.com " + 27 "\n每个人都有一道伤口,\n或深或浅,盖上布,以为不存在。\n我把最殷红的鲜血涂在那里。\n你不懂我,我不怪你。" + 28 "\n每个人都有一段告白,\n忐忑、不安,却饱含真心和勇气。\n我把最抒情的语言用在那里,\n你不懂我,我不怪你。" + 29 "\n每个人都有一场爱恋,\n用心、用情、用力,感动也感伤。\n我把最炙热的心情藏在那里,\n你不懂我,我不怪你。" + 30 "\n每个人都有一行眼泪,\n喝下的冰冷的水,酝酿成的热泪。\n我把最心酸的委屈汇在那里,\n你不懂我,我不怪你。"; 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轴方向放大为默认字体的两倍,而高度不变