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

来源:互联网 发布:吉他谱曲软件 编辑:程序博客网 时间:2024/06/10 02:32
本文参考 http://blog.csdn.net/lixin84915/article/details/8110667

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)

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 11个月宝宝拉肚子怎么办 2岁宝宝反复呕吐怎么办 1岁半幼儿拉肚子怎么办 宝宝打嗝呕吐胃难受怎么办 3岁宝宝发烧还吐怎么办 孩子喝水都吐怎么办啊 宝宝吃多了呕吐怎么办 3岁宝宝吐怎么办才好 儿童受凉肚子疼发热呕吐怎么办 两岁宝宝半夜呕吐怎么办 两岁宝宝吐了怎么办 2岁宝宝发烧吐怎么办 2岁多宝宝呕吐是怎么办 2周岁宝宝中暑了怎么办 2岁半宝宝着凉呕吐怎么办 3岁宝宝吐了几次怎么办 一岁宝宝恶心吐怎么办 9个月宝宝一直吐怎么办 晚上冻着了呕吐怎么办 2岁宝宝一直吐怎么办 两岁宝宝门牙龋齿怎么办 两岁宝宝得龋齿怎么办 两岁宝宝长龋齿怎么办 宝宝2岁不吃饭怎么办 两岁宝宝总是吐怎么办 3岁儿童受凉呕吐怎么办 两岁宝宝四天没拉大便怎么办 两岁宝宝发烧吐怎么办 四岁宝宝吐了怎么办啊 3岁宝宝突然吐了怎么办 宝宝撑着了吐拉怎么办 2岁宝宝体温37.5怎么办 宝宝2岁乳牙烂了怎么办 孕40周还没入盆怎么办 孕妇脸上长斑了怎么办 七个月宝宝大便干怎么办 两月大婴儿不拉大便怎么办 周岁宝宝大便出血了怎么办 十一个月宝宝大便干燥怎么办 8个月宝宝大便干燥怎么办 7个月宝宝大便干燥怎么办