Android中的TextView是个显示文字的的UI类,在现实中的需求中,文字有各式各样的样式,TextView本身没有属性去设置实现,我们可以通过Android提供的 SpannableString类封装。Android提供了很多的Span的类去实现样式,这个样式都是继承自CharacterStyle类。

        要想理解Span的具体使用,那肯定得了解SPan类群的构成,研究代码继承结构,深入的了解、理解,才能更好的使用它。我们来统计一下,最前端的可用功能的SPAN有:URLSpan、ClickableSpan、BackgroundColorSpan、ForegroundColorSpan、MaskFilterSpan、AbsoluteSizeSpan、RelativeSizeSpan、ImageSpan、ScaleXSpan、StyleSpan、SubscriptSpan、SuperscriptSpan、TextAppearanceSpan、TypefaceSpan、RasterizerSpan、StrikethroughSpan、UnderlineSpan。
            先看一下Spanable中的常用常量:
             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. SpannableString的使用:
   各种的Span就是通过SpannableString来封装样式的,设置完Span之后需要将Span放入到SpannableString类中,然后SpannableString设置到TextView中去。
使用:
          TestText test = (TestText) findViewById(R.id.test);
        SpannableString spannableString = new SpannableString(testText) ;
        BackgroundColorSpan backgroundColorSpan = new BackgroundColorSpan(Color.RED);
        spannableString.setSpan(backgroundColorSpan, 0, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) ;
        test.setText(spannableString) ; 



2. BackgroundColorSpan :看名字就知道是跟背景颜色相关的,
   使用:
       BackgroundColorSpan backgroundColorSpan = new BackgroundColorSpan(Color.RED);

spannableString.setSpan(backgroundColorSpan, 0, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) ;  


3. ClickableSpan: 点击事件相关的Span。
   代码实现:
ClickableSpan clickableSpan = new ClickableSpan() {
            @Override
            public void onClick(View widget) {
                Toast.makeText(MainActivity.this, "click", Toast.LENGTH_SHORT).show();
                Log.e("Easy", "click");
            }
        };
        spannableString.setSpan(clickableSpan, 11, 21, Spannable.SPAN_EXCLUSIVE_INCLUSIVE) ;

test.setMovementMethod(LinkMovementMethod.getInstance());  

注意:在使用ClickableSpan的时候,在单击链接时凡是有要执行的动作,都必须设置MovementMethod对象。

4. URLSpan:链接,类似HTML中的a标签。
 代码实现:
        URLSpan urlSpan = new URLSpan("http://www.baidu.com");

spannableString.setSpan(urlSpan, 22, 32, Spannable.SPAN_INCLUSIVE_EXCLUSIVE) ;  

UrilSpan是继承自ClickableSpan的,我们可以看一下源码:
@Override
    public void onClick(View widget) {
        Uri uri = Uri.parse(getURL());
        Context context = widget.getContext();
        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
        intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());
        context.startActivity(intent);

}  

URILSpan也是实现了onClick的方法,将URL跳转到浏览器中的。  因此,我们可以通过ClickableSpan去做文字的点击事件。
注意:在使用URLSpan的时候,也需要设置MovementMethod对象。

5. ForegroundColorSpan :设置字体颜色。
代码实现:
        ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.GRAY);

spannableString.setSpan(foregroundColorSpan, 32, 43, Spannable.SPAN_INCLUSIVE_INCLUSIVE) ;  



6. MaskFilterSpan:文字的装饰效果。分为两种:BlurMaskFilter(模糊效果) 和 EmbossMaskFilter (浮雕效果)
        MaskFilterSpan maskFilterSpan = new MaskFilterSpan(new EmbossMaskFilter(new float[]{1,1,3}, 1.5f, 8, 3));
        spannableString.setSpan(maskFilterSpan, 44, 55, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) ;
        
        MaskFilter filter2 = new BlurMaskFilter(10, Blur.OUTER );
        MaskFilterSpan maskFilterSpan2 = new MaskFilterSpan(filter2 );

spannableString.setSpan(maskFilterSpan2, 56, 67, Spannable.SPAN_EXCLUSIVE_INCLUSIVE) ;  


有很陌生的类,我们看一下源码:(BlurMaskFilter)
 public enum Blur {
        NORMAL(0),    SOLID(1),      OUTER(2),     INNER(3);        
        Blur(int value) {
            native_int = value;
        }
        final int native_int;
    }

    public BlurMaskFilter(float radius, Blur style) {
        native_instance = nativeConstructor(radius, style.native_int);
    }

private static native long nativeConstructor(float radius, int style);  


啊哦,调用的是native的方法,那我们先记住是如何使用的即可,Blur是其内部类,提供了四种样式。有兴趣的可以一一去实验其效果。
EmbossMaskFilter是同样的调用native的方法。

6. AbsoluteSizeSpan:字体大小的
  代码实现:
                 AbsoluteSizeSpan absoluteSizeSpan = new AbsoluteSizeSpan(100) ;

spannableString.setSpan(absoluteSizeSpan, 77, 88, Spannable.SPAN_INCLUSIVE_INCLUSIVE) ;

具体的看源码其实现:
     @Override
    public void updateDrawState(TextPaint ds) {
        if (mDip) {
            ds.setTextSize(mSize * ds.density);
        } else {
            ds.setTextSize(mSize);
        }

}


可以看出来的是,设置的paint的字体大小,构造函数中的 public AbsoluteSizeSpan(int size, boolean dip)  dip是标识你传入的数据是否是dp数值。


7. RelativeSizeSpan:相对的字体大小
这个是什么意思那?看源码就知道了:
@Override
    public void updateDrawState(TextPaint ds) {
        ds.setTextSize(ds.getTextSize() * mProportion);

}

原来是字体大小的多少倍啊。

8. ImageSpan:有关图片的。
代码实现:
        ImageSpan imageSpan = new ImageSpan(MainActivity.this, R.drawable.ic_launcher) ;

spannableString.setSpan(imageSpan, 100, 105, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) ;  

这个类有很多的构造函数,其作用就是通过不同方式传入drawble,可以资源地址,可以是Drawable  也可以是uri

9. ScaleXSpan:横向压缩比例因子。
 
 10. StyleSpan :主要由正常、粗体、斜体和同时加粗倾斜四种样式,常量值定义在Typeface类中。
Typeface.DEFAULT //常规字体类型
Typeface.DEFAULT_BOLD //黑体字体类型
Typeface.MONOSPACE //等宽字体类型
Typeface.SANS_SERIF //sans serif字体类型
Typeface.SERIF //serif字体类型

11. SubscriptSpan: 脚注样式,比如化学式的常见写法,当然,还可以对脚注的文字做一定的缩放
看一下源码:
SubscriptSpan():无参构造。
SubscriptSpan(Parcel src):一参构造,参数src并未起任何作用,源码中为:
public SuperscriptSpan(Parcel src) {
}   这个是比较特殊的地方。这个构造函数没有任何作用。

12. SuperscriptSpan:上标样式,比如数学上的次方运算,当然,还可以对上标文字进行缩放。同11样式的作用刚好相反。

13.TextAppearanceSpan:使用style文件来定义文本样式。

14.TypefaceSpan:字体样式,可以设置不同的字体

15.RasterizerSpan:设置光栅字样

16.StrikethroughSpan:删除线
17.UnderlineSpan : 下划线


使用起来是很简单的,主要是分析Span的原理。下一篇文章,来分析Span的深层次源码。




附件列表

Android之TextView的样式类Span的使用详解的更多相关文章

  1. Android之TextView的样式类Span的使用具体解释

    Android中的TextView是个显示文字的的UI类,在现实中的需求中,文字有各式各样的样式.TextView本身没有属性去设置实现,我们能够通过Android提供的 SpannableStrin ...

  2. Android 高级UI设计笔记07:RecyclerView 的详解

    1. 使用RecyclerView       在 Android 应用程序中列表是一个非常重要的控件,适用场合非常多,如新闻列表.应用列表.消息列表等等,但是从Android 一出生到现在并没有非常 ...

  3. Android PopupWindow Dialog 关于 is your activity running 崩溃详解

    Android PopupWindow Dialog 关于 is your activity running 崩溃详解 [TOC] 起因 对于 PopupWindow Dialog 需要 Activi ...

  4. Android中Intent传值与Bundle传值的区别详解

    Android中Intent传值与Bundle传值的区别详解 举个例子我现在要从A界面跳转到B界面或者C界面   这样的话 我就需要写2个Intent如果你还要涉及的传值的话 你的Intent就要写两 ...

  5. Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(上)

    前言 Android中绘图离不开的就是Canvas了,Canvas是一个庞大的知识体系,有Java层的,也有jni层深入到Framework.Canvas有许多的知识内容,构建了一个武器库一般,所谓十 ...

  6. Delphi中TStringList类常用属性方法详解

    TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. 常规的用法大家都知道,现在来讨论它的一些高级的用法. 先把要讨论的几个属性列出来: 1.CommaText 2.Delim ...

  7. Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(下)

    LinearGradient 线性渐变渲染器 LinearGradient中文翻译过来就是线性渐变的意思.线性渐变通俗来讲就是给起点设置一个颜色值如#faf84d,终点设置一个颜色值如#CC423C, ...

  8. Python的Django框架中forms表单类的使用方法详解

    用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ...

  9. Java基础-DButils工具类(QueryRunner)详解

    Java基础-DButils工具类(QueryRunner)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC ...

随机推荐

  1. CSS中"!important"的使用

    本篇文章使用最新的IE10以及firefox与chrome测试(截止2013年5月27日22:23:22) CSS的原理: 我们知道,CSS写在不同的地方有不同的优先级, .css文件中的定义 < ...

  2. [转]android:动态创建多个按钮 及 批量设置监听

    之前投机取巧,先创建好多个按钮,再根据需要的数量进行部分隐藏,不过还是逃不过呀. 这样根本无法批量地 findId,批量地 设置监听. 所以今天还是认认真真地研究回“动态创建按钮”,终于,通过不断尝试 ...

  3. 理解MVC,MVP和MVVM设计模式

    有3个非常受欢迎的MV-*系列设计模式:MVC,MVP,MVVM.他们被广泛应用于不多种结束.这篇文章我回阐述我自己对这3个设计模式的看法. MVC模式: MVC即Model-VIew-Control ...

  4. Django后台

    django的后台我们只要加少些代码,就可以实现强大的功能. 与后台相关文件:每个app中的 admin.py 文件与后台相关. 下面示例是做一个后台添加博客文章的例子: 一,新建一个 名称为 zqx ...

  5. SQL SQL语句的增删改查

    一.增:有2种方法 1.使用insert插入单行数据: 语法:insert [into] <表名> [列名] values <列值> 例:insert into Strdent ...

  6. php面向对象中的几个基本定义

    面向对象: 面向对象是现代编程中的一种重要设计方法,其基本思想是使用对象,类,封装,继承等来进行程序设计. 对象: 一只猪,一只羊,一辆汽车. 类: 类的主要作用就是创建对象. 封装: 类的特点是将对 ...

  7. OUTLOOK 发生错误0x8004010D

    问题:    outlook 2003 在接收邮件时报错: “正在接收”报告了错误(0x8004010D):“在包含您的数据文件的驱动器上,磁盘空间不足.请清空“已删除邮件”文件夹或删除某些文件以释放 ...

  8. Node.js 框架

    Node.js的是一个JavaScript平台,它允许你建立大型的Web应用程序.  Node.js的框架平台使用JavaScript作为它的脚本语言来构建可伸缩的应用. 当涉及到Web应用程序的开发 ...

  9. AJAX学习随笔

    AJAX名为“啊,贾克斯”,听着挺怪的哈. 主要的技术就是XMLHttpRequest对象和Javascript 度娘的解答: AJAX即“AsynchronousJavascriptAndXML”( ...

  10. 小菜学习设计模式(五)—控制反转(Ioc)

    写在前面 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Metho ...