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]

效果图:
 
     
使用方法具体解释:(使用非常easy,所以仅仅简单的解释。直接上代码,看效果)
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 : 下划线


使用起来是非常easy的。主要是分析Span的原理。

下一篇文章,来分析Span的深层次源代码。

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

  1. Android之TextView的样式类Span的使用详解

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

  2. android:为TextView加入样式——下划线,颜色,设置链接样式及前背景色

    实现下划线及颜色设置: public class AtActivity extends Activity { LinearLayout ll;     /** Called when the acti ...

  3. 【Android】 TextView设置个别字体样式

    SpannableString msp = new SpannableString("测试"+XM+"更换当前号码将从手机发送一条普通短信进行验证"); msp ...

  4. Android控件第1类——TextView

    Android提供TextView,它不能被编辑,它的子类EditText可以编辑.TextView有很多子类. 1.EditText,继承自TextView EditText可以编辑. 可以设置in ...

  5. 注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式

    注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式 这个坑,必须要注意呀, 比如在用ListView的时候,如果在List_ ...

  6. Android按钮的各个样式设置

    安卓开发学习之014 Button应用详解(样式.背景.按钮单击.长按.双击.多击事件) 一.Button简介 按钮也是继承自TextView 二.XML定义方法 <Button android ...

  7. [Android教程]TextView使用SpannableString设置复合文本

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

  8. Android设置TextView显示一行或多行

    在listView的item中或者是特殊的业务需求中,会要求TextView的内容不完全显示,只有通过一个指定的操作后才显示所有的,比如说一个按钮或者是其它的什么控件. 要想实现这个效果并不难,只要控 ...

  9. 我的Android进阶之旅------&gt; Android在TextView中显示图片方法

    面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包括图像的文本信息).并简要说明实现方法. 答案:Android SDK支持例如以下显示富文本信息的方式. 1.使用T ...

随机推荐

  1. Tar打包、压缩与解压缩到指定目录的方法

    tar在linux上是常用的打包.压缩.加压缩工具,他的参数很多,折里仅仅列举常用的压缩与解压缩参数 参数: -c :create 建立压缩档案的参数: -x : 解压缩压缩档案的参数: -z : 是 ...

  2. linux之SQL语句简明教程---表格连接

    现在我们介绍连接 (Join) 的概念.要了解连接,我们需要用到许多我们之前已介绍过的指令.我们先假设我们有以下的两个表格, Store_Information 表格 Store_Name Sales ...

  3. ngrok首页、文档和下载 - Web服务安全通道 - 开源中国社区

    ngrok首页.文档和下载 - Web服务安全通道 - 开源中国社区      Web服务安全通道 ngrok 编辑/纠错    分享到     新浪微博腾讯微博    已用    +0    收藏 ...

  4. ranlib的作用 -----更新静态库的符号索引表

    摘自 http://blog.csdn.net/jubincn/article/details/6958840 更新静态库的符号索引表 本小节的内容相对简单.前边提到过,静态库文件需要使用“ar”来创 ...

  5. hdu 1035 Robot Motion(模拟)

    Problem Description A robot has been programmed to follow the instructions in its path. Instructions ...

  6. spring mvc &lt;mvc:annotation-driven&gt;配置使用出现故障

    我在使用converter进行全局的日期类型转换. 1.写converer public class CustomDateConverter implements Converter<Strin ...

  7. JavaScript检测原始值、引用值、属性

    上周写过一篇读书笔记<编写可维护的JavaScript>之编程实践,其中 第8章 避免『空比较』是博主在工作中遇坑较多的雷区,所以特此把该章节重新整理分享,希望大家不再坑队友(>﹏& ...

  8. 关于HTML css的一些题目

    1.dcutype是什么,他是干嘛用的 doctype是文档的一种声明,告诉浏览器器用什么规则来解析文档. 2.ul ol dl分别适用于什么地方? ul无序列表 ol有序列表 dl是定义列表,会默认 ...

  9. RDLC报表系列(四) 矩阵

    继续接上一篇的内容,本文主要是讲矩阵的内容 用到的数据源如下: DataTable dt = new DataTable(); dt.Columns.Add("FiscalYear" ...

  10. [Linked List]Remove Duplicates from Sorted List II

    Total Accepted: 59433 Total Submissions: 230628 Difficulty: Medium Given a sorted linked list, delet ...