您的位置:首页 > 移动开发 > Android开发

Android开发总结笔记 Spannable(文本样式[上]) 1-1-6-2

2015-10-08 08:19 483 查看
本文参考 /article/8846652.html

Spannable的继承结构









从上图可以看出,Spannable实现了Spanned这个接口,而Spanned又实现了CharSequence这个接口

而在TextView的setText(CharSequence text)方法中,参数又恰好是CharSequence类型的。

所以,Spannable可以通过setText方法来实现这个文本的设置

具体的用法跟字符串相似,有以下两种

Spannable span = new SapnnableString("字符串");
或者通过SpannableStringBuilder

下面来了解一下Spannable这个类的一个常用方法setSpan(Obj what,int start,int end,int flag)

Obj表示的是具体样式的对象
start是样式开始的位置
end是样式结束的位置
flag 有四个值 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE --- 不包含两端start和end所在的端点 (a,b)

Spanned.SPAN_EXCLUSIVE_INCLUSIVE
--- 不包含端start,但包含end所在的端点 (a,b]

Spanned.SPAN_INCLUSIVE_EXCLUSIVE
--- 包含两端start,但不包含end所在的端点 [a,b)

Spanned.SPAN_INCLUSIVE_INCLUSIVE---
包含两端start和end所在的端点 [a,b]

各种样式
1、AbsoluteSizeSpan(改变字体)
这个类有三个构造方法

AbsoluteSizeSpan(int size)
AbsoluteSizeSpan(int size,boolean dip)

AbsoluteSizeSpan(Parcel)

size 顾名思义就是大小啦
dip 如果此处设置为true,size的单位就会以dip为单位
Parcel 这是一个存放对象引用和数据的容器
在AbsoluteSizeSpan的这个构造方法中,会把parcel中的数据读取出来作为size来设定字体大小





下面用代码来实现一下

Parcel parcel=Parcel.obtain();
parcel.writeInt(50);
parcel.setDataPosition(0);
AbsoluteSizeSpan absolute=new AbsoluteSizeSpan(parcel);
Spannable span=new SpannableString("哈哈");
AbsoluteSizeSpan absolute2=new AbsoluteSizeSpan(70);
Spannable span2=new SpannableString("嘿嘿");
AbsoluteSizeSpan absolute3=new AbsoluteSizeSpan(90);
Spannable span3=new SpannableString("嘻嘻");
span.setSpan(absolute, 0, span.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
span2.setSpan(absolute2, 0, span.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
span3.setSpan(absolute3, 0, span.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
SpannableStringBuilder spannableStringBuilder=new SpannableStringBuilder();
spannableStringBuilder.append(span);
spannableStringBuilder.append(span2);
spannableStringBuilder.append(span3);
textView.setText(spannableStringBuilder);






为了代码简洁一点,我决定简单地封装一下

public static CharSequence getStyleText(Object[] styleArray, String[] textArray) {
SpannableStringBuilder builder = new SpannableStringBuilder();
for (int i = 0; i < textArray.length; i++) {
Spannable span = new SpannableString(textArray[i]);
span.setSpan(styleArray[i], 0, textArray[i].length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
builder.append(span);
}
return builder;
}


Parcel parcel=Parcel.obtain();
parcel.writeInt(50);
parcel.setDataPosition(0);
AbsoluteSizeSpan absolute=new AbsoluteSizeSpan(parcel);
AbsoluteSizeSpan absolute2=new AbsoluteSizeSpan(70);
AbsoluteSizeSpan absolute3=new AbsoluteSizeSpan(90);
Object[] obj={absolute,absolute2,absolute3};
String[] str={"哈哈","嘿嘿","嘻嘻"};
textView.setText(StringStyleUtil.getStyleText(obj,str));


这样代码就少很多了。哈哈!!

2.AlignmentSpan.Standard(标准文本对齐方式)
这个类有两个构造方法

AlignmentSpan.Standard(Parcel src)
AlignmentSpan.Standard(Layout.Alignment align)

Layout.Alignment是一个常量,有三个值

ALIGN_NORMAL
ALIGN_CENTER
ALIGN_OPPOSITE

Parcel parcel=Parcel.obtain();
parcel.writeString("ALIGN_NORMAL");
parcel.setDataPosition(0);
AlignmentSpan.Standard alignmentSpan=new AlignmentSpan.Standard(parcel);
AlignmentSpan.Standard alignmentSpan2=new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER);
AlignmentSpan.Standard alignmentSpan3=new AlignmentSpan.Standard(Layout.Alignment.ALIGN_OPPOSITE);
Object[] obj={alignmentSpan,alignmentSpan2,alignmentSpan3};
String[] str={"哈哈\n","嘿嘿\n","嘻嘻"};
textView.setText(StringStyleUtil.getStyleText(obj,str));
}


然后就是这个样子了,注意"\n",要换行,对齐方式才有效





后面的就不详细说了,用法是一样的,列举一下

3.BackgroundColorSpan(背景色样式)
两个构造函数

BackgroundColorSpan(Parcel parcel)
BackgroundColorSpan(int color) 颜色值

Parcel parcel=Parcel.obtain();
parcel.writeInt(Color.GREEN);
parcel.setDataPosition(0);


4.BulletSpan(着重样式,类似于html的无序列表标签<li>)

四个构造函数

BulletSpan() 提供一个和文本颜色一样的符号
BulletSpan(int gapWidth) 提供一个和文本颜色一样的符号,并设置符号和文字之间的间隔
BulletSpan(int color,int gapWidth) 提供一个指定颜色的符号,并且设置符号和文字之间的间隔
BulletSpan(Parcel parcel)

5.DrawableMarginSpan(图片+margin 样式)

两个构造函数

DrawableMarginSpan(Drawable b) 提供一个图片显示
DrawableMarginSpan(Drawable b,int pad) 提供一个图片显示并且设置图片到文字的距离

6.ForegroundColorSpan(文字颜色样式)

两个构造函数

ForegroundColorSpan(Parcel parcel)
ForegroundColorSpan(int color)

7.IconMarginSpan(图标+margin样式)

两个构造函数

IconMarginSpan(Bitmap bitmao) 提供一个图片显示
IconMarginSpan(Bitmap ,int pad) 提供一个图片显示并且设置图片到文字的距离

8.LeadingMarginSpan.Standard(文本缩进样式)

三个构造函数

Standard(int arg0) 缩进的像素
Standard(int arg0,int arg1) 首行缩进的像素,剩余行缩进的像素
Standard(Parcel parcel)

9.ImageSpan(图片样式,就是添加图片)

这个类的构造方法还挺多的

ImageSpan(Context context,Bitmap b) 上下文对象,提供一个图片显示
ImageSpan(Context context,Bitmap b,int verticalAlignment) 上下文对象,提供一个图片显示,还有对齐方式
ImageSpan(Drawable d) 这个drawable需要设置大小
ImageSpan(Drawable d,int verticalalignment)
ImageSpan(Drawable d,String source) source 字符串资源
ImageSpan(Drawable d,String source,int verticalAlignment)
ImageSpan(Context context,Uri uri) uri 图片uri
ImageSpan(Context context,Uri uri,int verticalalignment)

ImageSpan(Context context,int resourceId) resourceId 图片资源ID
ImageSpan(Context context,int resourceId,int verticalalignment)

10.URLSpan(打开链接)

两个构造函数

URLspan(String url)
URLspan(Parcel parcel)

11.UnderLineSpan(下划线样式)

两个构造函数

UnderLineSpan()
UnderLineSpan(Parcel src)

事实上在UnderLineSpan(Parcel src)的内部没有对src这个参数进行处理,所以,两个构造函数得到的结构都是一样的

12.TypeFaceSpan(字体样式)

两个构造函数

TypeFaceSpan(String family) 字体名字的字符串 SANS_SERIF、MONOSPACE和SERIF
TypeFaceSpan(Parcel parcel)

13.TextAppearanceSpan(用style文件来定义文本样式)

四个构造函数

TextAppearanceSpan(Context context,int appearance) 上下文和style文件的id
TextAppearanceSpan(Context context,int appearance,int colorList) colorList指定颜色
TextAppearanceSpan(String family,int style,int size,ColorStateList color,ColorStateList linkColor)

Makes
text be drawn with the specified typeface, size, style, and colors.(官方文档描述这个构造方法的一句话)

TextAppearanceSpan(Parcel parcel)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: