SpannableString 文字增强类

TextView通常用来显示普通文本,但是有时候需要对其中某些文本进行样式、事件方面的设置。Android系统通过SpannableString类来对指定文本进行相关处理,具体有以下功能:

1、BackgroundColorSpan 背景色 
2、ClickableSpan 文本可点击,有点击事件
3、ForegroundColorSpan 文本颜色(前景色)
4、MaskFilterSpan 修饰效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter)
5、MetricAffectingSpan 父类,一般不用
6、RasterizerSpan 光栅效果
7、StrikethroughSpan 删除线(中划线)
8、SuggestionSpan 相当于占位符
9、UnderlineSpan 下划线
10、AbsoluteSizeSpan 绝对大小(文本字体)
11、DynamicDrawableSpan 设置图片,基于文本基线或底部对齐。
12、ImageSpan 图片
13、RelativeSizeSpan 相对大小(文本字体)
14、ReplacementSpan 父类,一般不用
15、ScaleXSpan 基于x轴缩放
16、StyleSpan 字体样式:粗体、斜体等
17、SubscriptSpan 下标(数学公式会用到)
18、SuperscriptSpan 上标(数学公式会用到)
19、TextAppearanceSpan 文本外貌(包括字体、大小、样式和颜色)
20、TypefaceSpan 文本字体
21、URLSpan 文本超链接

这么多文字,为了让你有看下去的勇气,下面来张效果图:
TextView+SpannableString设置复合文本

1、BackgroundColorSpan 背景色

1
2
3
4
SpannableString spanText new SpannableString("萝卜白菜的博客 -- http://orgcent.com");
spanText.setSpan(new BackgroundColorSpan(Color.GREEN), 0, spanText.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);

2、ClickableSpan 文本可点击,有点击事件
查看:Android使用TextView实现无下划线超链接

3、ForegroundColorSpan 文本颜色(前景色)

1
2
3
4
spanText new SpannableString("萝卜白菜的博客 -- http://orgcent.com");
spanText.setSpan(new ForegroundColorSpan(Color.BLUE), 6, spanText.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);

4、MaskFilterSpan 修饰效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter)

1
2
3
4
5
6
7
8
9
10
11
spanText new SpannableString("MaskFilterSpan -- http://orgcent.com");
int length = spanText.length();
//模糊(BlurMaskFilter)
MaskFilterSpan maskFilterSpan new MaskFilterSpan(new BlurMaskFilter(3, Blur.OUTER));
spanText.setSpan(maskFilterSpan, 0, length 10, Spannable.
SPAN_INCLUSIVE_EXCLUSIVE);
//浮雕(EmbossMaskFilter)
maskFilterSpan new MaskFilterSpan(new EmbossMaskFilter(new float[]{1,1,3}, 1.5f, 8, 3));
spanText.setSpan(maskFilterSpan, length 10, length, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);


PS:从上图看,浮雕效果不明显。把字体设置大点后可以看得清晰些。需要其他效果可以继承MaskFilter来自定义。

6、RasterizerSpan 光栅效果

1
2
3
4
5
spanText new SpannableString("StrikethroughSpan");
spanText.setSpan(new StrikethroughSpan(), 0, 7, Spannable.
SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);

PS:暂不清楚,效果不明显。

7、StrikethroughSpan 删除线(中划线)

1
2
3
4
spanText new SpannableString("StrikethroughSpan");
spanText.setSpan(new StrikethroughSpan(), 0, 7, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);

8、SuggestionSpan
相当于占位符,一般用在EditText输入框中。当双击此文本时,会弹出提示框选择一些建议(推荐的)文字,选中的文本将替换此占位符。在输入法上用的较多。
PS:API 14新增,暂无示例。

9、UnderlineSpan 下划线

1
2
3
4
spanText new SpannableString("UnderlineSpan");
spanText.setSpan(new UnderlineSpan(), 0, spanText.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);

10、AbsoluteSizeSpan 绝对大小(文本字体)

1
2
3
4
spanText new SpannableString("AbsoluteSizeSpan");
spanText.setSpan(new AbsoluteSizeSpan(20, true), 0, spanText.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);

PS:把字体大小设置大点,效果硬朗。

11、DynamicDrawableSpan 设置图片,基于文本基线或底部对齐。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DynamicDrawableSpan drawableSpan =
 new DynamicDrawableSpan(DynamicDrawableSpan.ALIGN_BASELINE{
    @Override
    public Drawable getDrawable({
        Drawable d = getResources().getDrawable(R.drawable.ic_launcher);
        d.setBounds(0, 0, 50, 50);
        return d;
    }
};
DynamicDrawableSpan drawableSpan2 new DynamicDrawableSpan(
DynamicDrawableSpan.ALIGN_BOTTOM{
    @Override
    public Drawable getDrawable({
          Drawable d = getResources().getDrawable(R.drawable.ic_launcher);
          d.setBounds(0, 0, 50, 50);
                return d;
            }
        };
spanText.setSpan(drawableSpan, 3, 4, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
spanText.setSpan(drawableSpan2, 7, 8, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);

PS:左边图片基于基线对齐,右边图片基于底部对齐

12、ImageSpan 图片

1
2
3
4
5
6
spanText new SpannableString("ImageSpan");
Drawable d = getResources().getDrawable(R.drawable.ic_launcher);
</strong>d.setBounds(0, 0, 50, 50);
spanText.setSpan(new ImageSpan(d), 3, 4, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);

PS:和DynamicDrawableSpan差别不大

13、RelativeSizeSpan 相对大小(文本字体)

1
2
3
4
5
spanText new SpannableString("RelativeSizeSpan");
//参数proportion:比例大小
spanText.setSpan(new RelativeSizeSpan(2.5f), 3, 4,
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);

PS:相对大小的比例是基于当前文本字体大小

15、ScaleXSpan 基于x轴缩放

1
2
3
4
5
spanText new SpannableString("ScaleXSpan -- 萝卜白菜的博客");
//参数proportion:比例大小
spanText.setSpan(new ScaleXSpan(3.8f), 3, 7, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);

16、StyleSpan 字体样式:粗体、斜体等

1
2
3
4
5
spanText new SpannableString("StyleSpan -- 萝卜白菜的博客");
//Typeface.BOLD_ITALIC:粗体+斜体
spanText.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 3, 7,
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);

17、SubscriptSpan 下标(数学公式会用到)

1
2
3
4
spanText new SpannableString("SubscriptSpan -- 萝卜白菜的博客");
spanText.setSpan(new SubscriptSpan(), 6, 7, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);

18、SuperscriptSpan 上标(数学公式会用到)

1
2
3
4
spanText new SpannableString("SuperscriptSpan -- 萝卜白菜的博客");
spanText.setSpan(new SuperscriptSpan(), 6, 7, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);

19、TextAppearanceSpan 文本外貌(包括字体、大小、样式和颜色)

1
2
3
4
5
spanText new SpannableString("TextAppearanceSpan -- 萝卜白菜的博客");
//若需自定义TextAppearance,可以在系统样式上进行修改
spanText.setSpan(new TextAppearanceSpan(this, android.R.style.TextAppearance_Medium),
 6, 7, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);

PS:系统还提供了相关值TextAppearance_Small, TextAppearance_Large等。如有需要可在以上样式基础上修改。

20、TypefaceSpan 文本字体

1
2
3
4
5
spanText new SpannableString("TypefaceSpan -- 萝卜白菜的博客");
//若需使用自定义字体,可能要重写类TypefaceSpan
spanText.setSpan(new TypefaceSpan("monospace"), 3, 10,
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);

PS:关于自定义字体的设置,后面将介绍如何使用

21、URLSpan 文本超链接

 
1
2
3
4
5
6
spanText new SpannableString("URLSpan -- 萝卜白菜的博客");
spanText.setSpan(new URLSpan("http://orgcent.com"), 10, spanText.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);
//让URLSpan可以点击
mTVText.setMovementMethod(new LinkMovementMethod());
import android.content.Context;
import android.graphics.Color;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.BackgroundColorSpan;
import android.text.style.BulletSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.RelativeSizeSpan;
import android.text.style.ScaleXSpan;
import android.text.style.StrikethroughSpan;
import android.text.style.StyleSpan;
import android.text.style.SubscriptSpan;
import android.text.style.SuperscriptSpan;
import android.text.style.TypefaceSpan;
import android.text.style.UnderlineSpan;

public class TextViewUtil {

	/**
	 * 设置字体大小,用px
	 * 
	 * @param context
	 * 
	 * @param str
	 *            目标字符串
	 * @param start
	 *            开始位置
	 * @param end
	 *            结束位置
	 * @param pxSize
	 *            像素大小
	 * @return
	 */
	public SpannableString getSizeSpanUsePx(Context context, String str, int start, int end, int pxSize) {
		SpannableString ss = new SpannableString(str);
		ss.setSpan(new AbsoluteSizeSpan(pxSize), 4, str.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		return ss;
	}

	/**
	 * 设置字体大小,用dip
	 * 
	 * @param context
	 * 
	 * @param str
	 *            目标字符串
	 * @param start
	 *            开始位置
	 * @param end
	 *            结束位置
	 * @param dipSize
	 *            像素大小
	 * @return
	 */
	public SpannableString getSizeSpanUseDip(Context context, String str, int start, int end, int dipSize) {
		SpannableString ss = new SpannableString(str);
		ss.setSpan(new AbsoluteSizeSpan(dipSize, true), 4, str.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		return ss;
	}

	/**
	 * 设置字体大小,用sp
	 * 
	 * @param context
	 * 
	 * @param str
	 *            目标字符串
	 * @param start
	 *            开始位置
	 * @param end
	 *            结束位置
	 * @param spSize
	 *            sp大小
	 * @return
	 */
	public SpannableString getSizeSpanSpToPx(Context context, String str, int start, int end, int spSize) {
		SpannableString ss = new SpannableString(str);
		ss.setSpan(new AbsoluteSizeSpan(DisplayUtil.sp2px(context, spSize)), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		return ss;
	}

	/**
	 * 设置字体相对大小
	 * 
	 * @param context
	 * @param str
	 *            目标字符串
	 * @param start
	 *            开始位置
	 * @param end
	 *            结束位置
	 * @param relativeSize
	 *            相对大小 如:0.5f,2.0f
	 * @return
	 */
	public SpannableString getRelativeSizeSpan(Context context, String str, int start, int end, float relativeSize) {
		SpannableString ss = new SpannableString(str);
		ss.setSpan(new RelativeSizeSpan(relativeSize), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		return ss;
	}

	/**
	 * 设置字体
	 * 
	 * @param context
	 * @param str
	 *            目标字符串
	 * @param start
	 *            开始位置
	 * @param end
	 *            结束位置
	 * @param typeface
	 *            字体类型 如:default,efault-bold,monospace,serif,sans-serif
	 * @return
	 */
	public SpannableString getTypeFaceSpan(Context context, String str, int start, int end, String typeface) {
		SpannableString ss = new SpannableString(str);
		ss.setSpan(new TypefaceSpan(typeface), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		return ss;
	}

	/**
	 * 设置字体形体
	 * 
	 * @param context
	 * @param str
	 *            目标字符串
	 * @param start
	 *            开始位置
	 * @param end
	 *            结束位置
	 * @param style
	 *            字体类型 如: Typeface.NORMAL正常 Typeface.BOLD粗体 Typeface.ITALIC斜体
	 *            Typeface.BOLD_ITALIC粗斜体
	 * @return
	 */
	public SpannableString getStyleSpan(Context context, String str, int start, int end, int style) {
		SpannableString ss = new SpannableString(str);
		ss.setSpan(new StyleSpan(style), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		return ss;
	}

	/**
	 * 设置字体下划线
	 * 
	 * @param context
	 * @param str
	 *            目标字符串
	 * @param start
	 *            开始位置
	 * @param end
	 *            结束位置
	 * @return
	 */
	public SpannableString getUnderLineSpan(Context context, String str, int start, int end) {
		SpannableString ss = new SpannableString(str);
		ss.setSpan(new UnderlineSpan(), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		return ss;
	}

	/**
	 * 设置字体删除线
	 * 
	 * @param context
	 * @param str
	 *            目标字符串
	 * @param start
	 *            开始位置
	 * @param end
	 *            结束位置
	 * @return
	 */
	public SpannableString getDeleteLineSpan(Context context, String str, int start, int end) {
		SpannableString ss = new SpannableString(str);
		ss.setSpan(new StrikethroughSpan(), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		return ss;
	}

	/**
	 * 设置上标
	 * 
	 * @param context
	 * @param str
	 *            目标字符串
	 * @param start
	 *            开始位置
	 * @param end
	 *            结束位置
	 * @return
	 */
	public SpannableString getSuperscriptSpan(Context context, String str, int start, int end) {
		SpannableString ss = new SpannableString(str);
		ss.setSpan(new SuperscriptSpan(), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		return ss;
	}

	/**
	 * 设置放大系数
	 * 
	 * @param context
	 * @param str
	 *            目标字符串
	 * @param start
	 *            开始位置
	 * @param end
	 *            结束位置
	 * @param scale
	 *            放大多少倍,x轴方向,y轴不变 如:0.5f, 2.0f
	 * @return
	 */
	public SpannableString getScaleSpan(Context context, String str, int start, int end, float scale) {
		SpannableString ss = new SpannableString(str);
		ss.setSpan(new ScaleXSpan(scale), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		return ss;
	}

	/**
	 * 设置下标
	 * 
	 * @param context
	 * @param str
	 *            目标字符串
	 * @param start
	 *            开始位置
	 * @param end
	 *            结束位置
	 * @return
	 */
	public SpannableString getSubscriptSpan(Context context, String str, int start, int end) {
		SpannableString ss = new SpannableString(str);
		ss.setSpan(new SubscriptSpan(), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		return ss;
	}

	/**
	 * 设置背景色
	 * 
	 * @param context
	 * @param str
	 *            目标字符串
	 * @param start
	 *            开始位置
	 * @param end
	 *            结束位置
	 * @param color
	 *            颜色值 如Color.BLACK
	 * @return
	 */
	public SpannableString getBackGroundColorSpan(Context context, String str, int start, int end, int color) {
		SpannableString ss = new SpannableString(str);
		ss.setSpan(new BackgroundColorSpan(color), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		return ss;
	}

	/**
	 * 设置背景色
	 * 
	 * @param context
	 * 
	 * @param str
	 *            目标字符串
	 * @param start
	 *            开始位置
	 * @param end
	 *            结束位置
	 * @param color
	 *            颜色值 如:#CCCCCC
	 * @return
	 */
	public SpannableString getBackGroundColorSpan(Context context, String str, int start, int end, String color) {
		SpannableString ss = new SpannableString(str);
		ss.setSpan(new BackgroundColorSpan(Color.parseColor(color)), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		return ss;
	}

	/**
	 * 设置前景色
	 * 
	 * @param context
	 * 
	 * @param str
	 *            目标字符串
	 * @param start
	 *            开始位置
	 * @param end
	 *            结束位置
	 * @param color
	 *            颜色值 如Color.BLACK
	 * @return
	 */
	public SpannableString getForegroundColorSpan(Context context, String str, int start, int end, int color) {
		SpannableString ss = new SpannableString(str);
		ss.setSpan(new ForegroundColorSpan(color), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		return ss;
	}

	/**
	 * 设置前景色
	 * 
	 * @param context
	 * 
	 * @param str
	 *            目标字符串
	 * @param start
	 *            开始位置
	 * @param end
	 *            结束位置
	 * @param color
	 *            颜色值 如:#CCCCCC
	 * @return
	 */
	public SpannableString getForegroundColorSpan(Context context, String str, int start, int end, String color) {
		SpannableString ss = new SpannableString(str);
		ss.setSpan(new ForegroundColorSpan(Color.parseColor(color)), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		return ss;
	}
}

 昨晚研读 ApiDemo 源码至 com.example.android.apis.text.Link 类。首先,看一下其运行效果: 
 
要给 TextView 加上效果,方式主要有几种: 

第一种,自动应用效果,使用 android:autolink 属性,如: 

Java代码  收藏代码
  1. <TextView xmlns:android="http://schemas.android.com/apk/res/android"  
  2.             android:id="@+id/text1"  
  3.             android:layout_width="match_parent"  
  4.             android:layout_height="match_parent"  
  5.             android:autoLink="all"  
  6.             android:text="@string/link_text_auto"  
  7.             />  



第二种,在文本中使用 <a> 标签,如: 

Java代码  收藏代码
  1. <string name="link_text_manual"><b>text2:</b> This is some other  
  2.       text, with a <a href="http://www.google.com">link</a> specified  
  3.       via an &lt;a&gt; tag.  Use a \"tel:\" URL  
  4.       to <a href="tel:4155551212">dial a phone number</a>  
  5. </string>  



第三种,和第二种其实是一样的,只不过将文本改在 JAVA 代码中,如: 

Java代码  收藏代码
  1. TextView t3 = (TextView) findViewById(R.id.text3);  
  2. t3.setText(  
  3.     Html.fromHtml(  
  4.          "<b>text3:</b>  Text with a " +  
  5.          "<a href=\"http://www.google.com\">link</a> " +  
  6.          "created in the Java source code using HTML."));  
  7. t3.setMovementMethod(LinkMovementMethod.getInstance());  



第四种,前面三种可以说都是自动的,而第四种就是纯“手工”的了。通过创建 SpanableString 字符串,并在之上创 建一个或多个 Span 来实现丰富的效果。例子如下: 

Java代码  收藏代码
  1. SpannableString ss = new SpannableString("text4: Click here to dial the phone.");  
  2. ss.setSpan(new StyleSpan(Typeface.BOLD), 0, 6,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  
  3. ss.setSpan(new URLSpan("tel:4155551212"), 13, 17,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  
  4.   
  5. TextView t4 = (TextView) findViewById(R.id.text4);  
  6. t4.setText(ss);  
  7. t4.setMovementMethod(LinkMovementMethod.getInstance());  



完整的代码见 ApiDemo 吧,下面我提几点需要注意的: 

.setMovementMethod,此方法在需要响应用户事件时使用,如点击一个电话号码就跳转到拨号页面。如果不执行这个方法是不会响应事件的,即便文本看着已经是下划线蓝色字了。 
.Spanned.SPAN_EXCLUSIVE_EXCLUSIVE,这是在 setSpan 时需要指定的 flag,它的意义我试了很久也没试出来,睡个觉,今天早上才突然有点想法,试之,果然。它是用来标识在 Span 范围内的文本前后输入新的字符时是否把它们也应用这个效果。分别有 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE(前后都不包括)、Spanned.SPAN_INCLUSIVE_EXCLUSIVE(前面包括,后面不包括)、Spanned.SPAN_EXCLUSIVE_INCLUSIVE(前面不包括,后面包括)、Spanned.SPAN_INCLUSIVE_INCLUSIVE(前后都包括)。看个截图就更明白了: 

 
对比一下 
 



以下转自:http://blog.csdn.net/yang_hui1986527/article/details/6776629 
在Android中,TextView是我们最常用的用来显示文本的控件。 

  一般情况下,TextView中的文本都是一个样式。那么如何对于TextView中各个部分的文本来设置字体,大小,颜色,样式,以及超级链接等属性呢?下面我们通过SpannableString的具体实例操作来演示一下。 

res-layout-main.xml: 

Java代码  收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_height="wrap_content" android:layout_width="wrap_content" android:orientation="horizontal">  
  4. <TextView    
  5.     android:id="@+id/myTextView"  
  6.     android:layout_width="fill_parent"   
  7.     android:layout_height="wrap_content"   
  8.     />  
  9. </LinearLayout>  



res-color-color.xml 

res-color-linkcolor.xml: 

Java代码  收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <selector  xmlns:android="http://schemas.android.com/apk/res/android">  
  3.     <item android:state_pressed="true"  
  4.           android:color="#ffffff00"/> <!-- pressed -->  
  5.     <item android:state_focused="true"  
  6.           android:color="#ff00ffff"/> <!-- focused -->  
  7.     <item android:color="#ff0ff000"/> <!-- default -->  
  8. </selector>  



TextViewLinkActivity: 

Java代码  收藏代码
  1. import java.io.IOException;  
  2.   
  3. import org.xmlpull.v1.XmlPullParserException;  
  4.   
  5. import android.app.Activity;  
  6. import android.content.res.ColorStateList;  
  7. import android.content.res.XmlResourceParser;  
  8. import android.graphics.Bitmap;  
  9. import android.graphics.BitmapFactory;  
  10. import android.graphics.Color;  
  11. import android.graphics.drawable.Drawable;  
  12. import android.os.Bundle;  
  13. import android.text.SpannableString;  
  14. import android.text.Spanned;  
  15. import android.text.method.LinkMovementMethod;  
  16. import android.text.style.AbsoluteSizeSpan;  
  17. import android.text.style.BackgroundColorSpan;  
  18. import android.text.style.BulletSpan;  
  19. import android.text.style.DrawableMarginSpan;  
  20. import android.text.style.ForegroundColorSpan;  
  21. import android.text.style.IconMarginSpan;  
  22. import android.text.style.ImageSpan;  
  23. import android.text.style.RelativeSizeSpan;  
  24. import android.text.style.ScaleXSpan;  
  25. import android.text.style.StrikethroughSpan;  
  26. import android.text.style.StyleSpan;  
  27. import android.text.style.SubscriptSpan;  
  28. import android.text.style.SuperscriptSpan;  
  29. import android.text.style.TextAppearanceSpan;  
  30. import android.text.style.TypefaceSpan;  
  31. import android.text.style.URLSpan;  
  32. import android.text.style.UnderlineSpan;  
  33. import android.widget.TextView;  
  34.   
  35. public class TextViewLinkActivity extends Activity {  
  36.     TextView mTextView = null;     
  37.     SpannableString msp = null;    
  38.       
  39.     /** Called when the activity is first created. */  
  40.     @Override  
  41.     public void onCreate(Bundle savedInstanceState) {  
  42.         super.onCreate(savedInstanceState);  
  43.         setContentView(R.layout.main);  
  44.           
  45.         mTextView = (TextView)findViewById(R.id.myTextView);  
  46.           
  47.         //创建一个 SpannableString对象    
  48.         msp = new SpannableString("字体测试字体大小一半两倍前景色背景色正常粗体斜体粗斜体下划线删除线x1x2电话邮件网站短信彩信地图X轴综合/bot");   
  49.           
  50.         //设置字体(default,default-bold,monospace,serif,sans-serif)  
  51.         msp.setSpan(new TypefaceSpan("monospace"), 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  
  52.         msp.setSpan(new TypefaceSpan("serif"), 2, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  
  53.           
  54.         //设置字体大小(绝对值,单位:像素)   
  55.         msp.setSpan(new AbsoluteSizeSpan(20), 4, 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  
  56.         msp.setSpan(new AbsoluteSizeSpan(20,true), 6, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //第二个参数boolean dip,如果为true,表示前面的字体大小单位为dip,否则为像素,同上。  
  57.           
  58.         //设置字体大小(相对值,单位:像素) 参数表示为默认字体大小的多少倍  
  59.         msp.setSpan(new RelativeSizeSpan(0.5f), 8, 10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //0.5f表示默认字体大小的一半  
  60.         msp.setSpan(new RelativeSizeSpan(2.0f), 10, 12, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //2.0f表示默认字体大小的两倍  
  61.           
  62.         //设置字体前景色  
  63.         msp.setSpan(new ForegroundColorSpan(Color.MAGENTA), 12, 15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //设置前景色为洋红色  
  64.           
  65.         //设置字体背景色  
  66.         msp.setSpan(new BackgroundColorSpan(Color.CYAN), 15, 18, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //设置背景色为青色  
  67.        
  68.         //设置字体样式正常,粗体,斜体,粗斜体  
  69.         msp.setSpan(new StyleSpan(android.graphics.Typeface.NORMAL), 18, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //正常  
  70.         msp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 20, 22, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //粗体  
  71.         msp.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 22, 24, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //斜体  
  72.         msp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 24, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //粗斜体  
  73.           
  74.         //设置下划线  
  75.         msp.setSpan(new UnderlineSpan(), 27, 30, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  
  76.           
  77.         //设置删除线  
  78.         msp.setSpan(new StrikethroughSpan(), 30, 33, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  
  79.           
  80.         //设置上下标  
  81.         msp.setSpan(new SubscriptSpan(), 34, 35, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //下标     
  82.         msp.setSpan(new SuperscriptSpan(), 36, 37, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);   //上标              
  83.           
  84.         //超级链接(需要添加setMovementMethod方法附加响应)  
  85.         msp.setSpan(new URLSpan("tel:4155551212"), 37, 39, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //电话     
  86.         msp.setSpan(new URLSpan("mailto:webmaster@google.com"), 39, 41, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //邮件     
  87.         msp.setSpan(new URLSpan("http://www.baidu.com"), 41, 43, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //网络     
  88.         msp.setSpan(new URLSpan("sms:4155551212"), 43, 45, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //短信   使用sms:或者smsto:  
  89.         msp.setSpan(new URLSpan("mms:4155551212"), 45, 47, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //彩信   使用mms:或者mmsto:  
  90.         msp.setSpan(new URLSpan("geo:38.899533,-77.036476"), 47, 49, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //地图     
  91.           
  92.         //设置字体大小(相对值,单位:像素) 参数表示为默认字体宽度的多少倍  
  93.         msp.setSpan(new ScaleXSpan(2.0f), 49, 51, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //2.0f表示默认字体宽度的两倍,即X轴方向放大为默认字体的两倍,而高度不变  
  94.           
  95.         //设置字体(依次包括字体名称,字体大小,字体样式,字体颜色,链接颜色)  
  96.         ColorStateList csllink = null;  
  97.         ColorStateList csl = null;  
  98.         XmlResourceParser xppcolor=getResources().getXml (R.color.color);  
  99.         try {  
  100.             csl= ColorStateList.createFromXml(getResources(),xppcolor);  
  101.         }catch(XmlPullParserException e){  
  102.             // TODO: handle exception  
  103.             e.printStackTrace();          
  104.         }catch(IOException e){  
  105.             // TODO: handle exception  
  106.             e.printStackTrace();          
  107.         }  
  108.   
  109.         XmlResourceParser xpplinkcolor=getResources().getXml(R.color.linkcolor);  
  110.         try {  
  111.             csllink= ColorStateList.createFromXml(getResources(),xpplinkcolor);  
  112.         }catch(XmlPullParserException e){  
  113.             // TODO: handle exception  
  114.             e.printStackTrace();          
  115.         }catch(IOException e){  
  116.             // TODO: handle exception  
  117.             e.printStackTrace();          
  118.         }  
  119.         msp.setSpan(new TextAppearanceSpan("monospace",android.graphics.Typeface.BOLD_ITALIC, 30, csl, csllink), 51, 53, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);   
  120.        
  121.         //设置项目符号  
  122.         msp.setSpan(new BulletSpan(android.text.style.BulletSpan.STANDARD_GAP_WIDTH,Color.GREEN), 0 ,msp.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //第一个参数表示项目符号占用的宽度,第二个参数为项目符号的颜色  
  123.   
  124.         //设置图片  
  125.         Drawable drawable = getResources().getDrawable(R.drawable.icon);   
  126.         drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());    
  127.         msp.setSpan(new ImageSpan(drawable), 53, 57, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  
  128.           
  129.         mTextView.setText(msp);  
  130.         mTextView.setMovementMethod(LinkMovementMethod.getInstance());   
  131.     }  
  132. }  



效果预览: 

 

 
posted @ 2015-10-07 13:58  regalys168  阅读(549)  评论(0编辑  收藏  举报