Android中Spannable的用法

一、Spannable简介

Spannable

首先,从官方文档可以看出Spannable是一个接口,它本身实现了Spanned接口,派生了三个子类分类Editable, SpannableString, SpannableStringBuilderSpannable是设置文字样式的基础类,它引出的相关类主要是使文字实现不同的样式效果。
  这里写图片描述
  
  这是Spannable在文字相关类中的关系图,SpannedStringStringBuilder并列为三大字符串类。如果说String为普通字符串,StringBuilder是高级动态字符串,那么Spanned就是附带样式的高级字符串了,而所谓Spannable,就是描述这个字符串的样式部分。

1.Spannable基本使用方法

String string = "0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz";
SpannableString spannableString = new SpannableString(string);
spannableString.setSpan(new WhatSpan(), startIndex, endIndex, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);

2.各种Span样式

各种Span类为我们带来了各种各样的样式,这些span分为两类:

  • 一类是CharacterStyle,也就是说是针对单个字符可以设置的样式
  • 另一类是ParagraphStyle,是针对段落进行的操作,ParagraphStyle的span运行的时候会检测目标段落前后是否有\n,如果没有的话会抛出错误"PARAGRAPH span must start at paragraph boundary",这是一个大坑请务必要注意。
BulletSpan

BulletSpan 影响段落层次的文本格式。它可以给段落的开始处加上项目符号。

/**
 * gapWidth: 项目符号和文本之间的间隙
 * color: 项目符号的颜色,默认为透明
 */
 
 BulletSpan   span = new BulletSpan(36, Color.BLUE);

BulletSpan

QuoteSpan

QuoteSpan 影响段落层次的文本格式。它可以给一个段落加上垂直的引用线。

/**
 * color: 垂直的引用线颜色,默认是蓝色
 */
 
span = new QuoteSpan(Color.RED);

这里写图片描述

AlignmentSpan.Standard

AlignmentSpan.Standard 影响段落层次的文本格式。它可以把段落的每一行文本按正常、居中、相反的方式对齐。

/**
 * align: 对齐方式  有三种:
 * Layout.Alignment.ALIGN_OPPOSITE
 * Layout.Alignment.ALIGN_NORMAL    
 * Layout.Alignment.ALIGN_CENTER
 */
 
span = new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER);

AlignmentSpan.Standard

UnderlineSpan

UnderlineSpan 影响字符级的文本格式。它可以为字符集加上下划线,归功于 Paint的setUnderlineText(true))方法。

//下划线
span = new UnderlineSpan();

这里写图片描述

StrikethroughSpan

StrikethroughSpan 影响字符级的文本格式。它可以给字符集加上删除线,归功于 Paint的setStrikeThruText(true))方法。

//删除线
span = new StrikethroughSpan();

这里写图片描述

SubscriptSpan

SubscriptSpan 影响字符级的文本格式,它可以通过减小 TextPaint#baselineShift 给字符集加下标。

//下标
span = new SubscriptSpan();

这里写图片描述

SuperscriptSpan

SuperscriptSpan 影响字符级的文本格式。它可以通过增加 TextPaint#baselineShift 给字符集加上标。

//上标
span = new SuperscriptSpan();

这里写图片描述

BackgroundColorSpan

BackgroundColorSpan 影响字符级的文本格式。它可以给字符集加上背景颜色。

//设置字符背景颜色
span = new BackgroundColorSpan(Color.GREEN);

BackgroundColorSpan

ForegroundColorSpan

ForegroundColorSpan 影响字符级的文本格式,它可以设置字符集的前景颜色也即文字颜色。

//设置蓝色的前景
span = new ForegroundColorSpan(Color.BLUE);

这里写图片描述

ImageSpan

ImageSpan 影响字符级的文本格式。它可以生成图像字符。这是为数不多的文档齐全的 Span

/**
 * Context: 上下文
 * resourceId: 图像资源id
 */
 
span = new ImageSpan(this, R.drawable.ic_small);

这里写图片描述

StyleSpan

StyleSpan 影响字符级的文本格式,它可以给字符集设置样式(blod、italic、normal)。

//设置bold+italic的字符样式
span = new StyleSpan(Typeface.BOLD | Typeface.ITALIC);

这里写图片描述

TypefaceSpan

TypefaceSpan 影响字符级的文本格式。它可以给字符设置字体集(monospace、serif等)。

//设置serif family
span = new TypefaceSpan("serif");

这里写图片描述

TextAppearanceSpan

TextAppearanceSpan 影响字符级的文本格式。它可以给字符集设置外观(appearance)。

/**
 *      context: 上下文
 *      appearance:appearance资源id(例如:android.R.style.TextAppearance_Small)
 *      colorList:文本的颜色资源id(例如:android.R.styleable.Theme_textColorPrimary)
 */

TextAppearanceSpan(Context context, int appearance, int colorList)

/**
 *      family:字体family
 *		style:描述样式(例如:android.graphics.Typeface)
 *		size:文字大小
 *		color:文字颜色
 *		linkColor:连接文本的颜色
 */

TextAppearanceSpan(String family, int style, int size, ColorStateList color, ColorStateList linkColor)
<-- style.xml -->
<style name="SpecialTextAppearance" parent="@android:style/TextAppearance">
    <item name="android:textColor">@color/color1</item>
    <item name="android:textColorHighlight">@color/color2</item>
    <item name="android:textColorHint">@color/color3</item>
    <item name="android:textColorLink">@color/color4</item>
    <item name="android:textSize">28sp</item>
    <item name="android:textStyle">italic</item>
</style>

这里写图片描述

参考: http://flavienlaurent.com/blog/2014/01/31/spans/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值