前言

相信大家对Android的TextView的使用已经相当熟悉了,但有没有发现TextView的文字总是那么单调,可以修改的就字体大小,颜色等等。要想实现自定义的文字,就要用到我们今天的主角——SpannableString了。

定义

This is the class for text whose content is immutable but to which markup objects can be attached and detached.

SpannableString是文本内容不可改变,但标记对象可以绑定和解绑的类。

官方文档中前半句话好理解,后半句就不怎么好理解了。问题就来了:

  • 什么是标记对象呢(markup objects)?
  • 绑定和解绑(attached and detached)又是什么意思呢?
标记对象

标记语言(也称置标语言、标记语言、标志语言、标识语言)是一种将文本(Text)以及文本相关的其他信息结合起来,展现出关于文档结构和数据处理细节的计算机文字编码。至于标记对象则是和标记语言一个意思,就是能设置文本的各种样式的方法。

绑定和解绑

至于什么事绑定和解绑,意思就是对于一个已经设置了标记对象的文本(已绑定标记对象)则可以移除它的标记对象。

示例代码

   public class MainActivity extends ActionBarActivity {
TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.text);
//创建SpannableString对象,内容不可修改
SpannableString ss=new SpannableString("字体测试字体绝对大小相对大小缩放大小" +
"前景颜色背景颜色字体样式下划线删除线上标X2下标Y3链接" +
"字体外表图图图图");
//使用setSpan()方法设置标记对象
//使用removeSpan()解绑标记对象
//public void setSpan (Object what, int start, int end, int flags)
//绑定特定的标记对象(Object what)到起始为start,终止为end的text对象上(若已绑定标记对象则先移除)
//设置字体TypefaceSpan()
//设置字体大小(绝对值)AbsoluteSizeSpan()
//设置字体大小(相对值)RelativeSizeSpan()
//设置字体大小(相对值,默认字体宽度的倍数)ScaleXSpan()
//设置字体的前景色ForegroundColorSpan()
//设置字体的背景色BackgroundColorSpan()
//设置字体的样式StyleSpan()
//设置下划线UnderlineSpan()
//删除线StrikethroughSpan()
//上标SuperscriptSpan()
//下标SubscriptSpan()
//链接URLSpan()-->需要添加setMovementMethod方法附加响应
//字体外观设置(依次包括字体名称,字体大小,字体样式,字体颜色,链接颜色)TextAppearanceSpan()
//项目符号BulletSpan()
//图片ImageSpan() //设置字体(default,default-bold,monospace,serif,sans-serif)
ss.setSpan(new TypefaceSpan("sans-serif"),0,4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ss.setSpan(new AbsoluteSizeSpan(30,true),4,10,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ss.setSpan(new RelativeSizeSpan(0.5f),10,14,Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
ss.setSpan(new ScaleXSpan(1.5f),14,18,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ss.setSpan(new ForegroundColorSpan(Color.BLUE),18,22,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ss.setSpan(new BackgroundColorSpan(Color.YELLOW),22,26,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ss.setSpan(new StyleSpan(Typeface.BOLD),26,30,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ss.setSpan(new UnderlineSpan(),30,33,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ss.setSpan(new StrikethroughSpan(),33,36,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ss.setSpan(new SuperscriptSpan(),39,40,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ss.setSpan(new SubscriptSpan(),43,44,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ss.setSpan(new URLSpan("http://www.baidu.com"),44,46,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); ColorStateList color = null;
ColorStateList linkColor = null; XmlResourceParser parser = getResources().getXml(R.drawable.colorselector);
try {
color = ColorStateList.createFromXml(getResources(),parser);
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
linkColor = ColorStateList.createFromXml(getResources(),parser);
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
ss.setSpan(new TextAppearanceSpan("serif",Typeface.BOLD_ITALIC,40,color,linkColor),46,50,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); Drawable drawable = getResources().getDrawable(R.mipmap.ic_launcher);
drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());
ss.setSpan(new ImageSpan(drawable), 50, 54, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ss.setSpan(new BulletSpan(BulletSpan.STANDARD_GAP_WIDTH,Color.RED),0,ss.length(),Spanned.SPAN_COMPOSING);
mTextView.setMovementMethod(LinkMovementMethod.getInstance());
mTextView.setText(ss);
}
}

效果示例

Android学习之——SpannableString和TextView的使用及研究的更多相关文章

  1. Android学习笔记⑤——UI组件的学习TextView相关

    TextView是一个强大的视图组件,直接继承了View,同时也派生出了很多子类,TextView其作用说白了就是在布局中显示文本,有点像Swing编程中的JLabel标签,但是他比JLabel强大的 ...

  2. Android(java)学习笔记88:TextView属性大全

    TextView属性大全: android:autoLink       设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接.可选值(none/web/email/ph ...

  3. Android学习总结——TextView跑马灯效果

    Android系统中TextView实现跑马灯效果,必须具备以下几个条件: 1.android:ellipsize="marquee" 2.TextView必须单行显示,即内容必须 ...

  4. Android学习笔记-TextView(文本框)(一)

    1.基础属性详解: id:为TextView设置一个组件id,根据id,我们可以在Java代码中通过findViewById()的方法获取到该对象,然后进行相关属性的设置,又或者使用RelativeL ...

  5. Android(java)学习笔记27:TextView属性大全

    TextView属性大全: android:autoLink       设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接.可选值(none/web/email/ph ...

  6. Android学习路线总结,绝对干货

    title: Android学习路线总结,绝对干货 tags: Android学习路线,Android学习资料,怎么学习android grammar_cjkRuby: true --- 一.前言 不 ...

  7. Android学习——第一个NDK程序

    在前面的学习中,我们已经讲解了关于NDK编程的环境搭建流程,简单的使用我们也通过官网本身自带的例子进行说明了.可是相信大家一定还存在这么的一个疑惑:“如果我要自己利用NDK编写一个Android应用, ...

  8. 十、Android学习第九天——小结(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 十.Android学习第九天——小结 通过这段时间的学习,今晚上来做个小小 ...

  9. 九、Android学习第八天——广播机制与WIFI网络操作(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 九.Android学习第八天——广播机制与WIFI网络操作 今天熟悉了An ...

随机推荐

  1. Android 程序drawable资源保存到data目录

    今天做了个小功能,就是把我们程序Drawable里面的图片保存到data目录下面,然后另外一个程序需要读取data目录里面保存的图片.涉及了data目录读写.这功能看上去挺简单,不过实际做的时候还是遇 ...

  2. Sql server在另一台服务器,在Visual Studio 中没问题,IIS中 提示“在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。。。。”

    可能问题一: 确切的说是在IIS 7.5中有这问题 就是在visual studio中都用的好好的,但是加载到IIS上的时候竟然报错“ 在与 SQL Server 建立连接时出现与网络相关的或特定于实 ...

  3. C语言 · 筛选号码

    算法训练 筛选号码   时间限制:1.0s   内存限制:512.0MB      问题描述 有n个人围成一圈,顺序排号(编号为1到n).从第1个人开始报数(从1到3报数),凡报到3的人退出圈子.从下 ...

  4. opencv中图像伪彩色处理(C++ / Python)

    使用OpenCV的预定义的颜色映射来将灰度图像伪彩色化. 1. colormap(色度图)是什么? 假设我们想在地图上显示美国不同地区的温度.我们可以把美国地图上的温度数据叠加为灰度图像——较暗的区域 ...

  5. idea mac快捷键

    mac快捷键 alt+f7查找变量方法使用的地方 F3添加书签 Ctrl + O快捷覆写方法 Alt + F3 添加书签标识 command + F3 显示书签 command + Shift + A ...

  6. c# 读取excel数据的两种方法

    转载自:http://developer.51cto.com/art/201302/380622.htm, 方法一:OleDb: 用这种方法读取Excel速度还是非常的快的,但这种方式读取数据的时候不 ...

  7. Docker run 命令的使用方法

    [编者的话]在Docker中,run应该是用户使用最多的命令了,很多读者反馈不是很明白run命令的用法,而且相关的书籍.中文资料中对run命令的描述也不是非常完整,所以DockerOne组织翻译了Do ...

  8. Java关键字instanceof

    深入Java关键字instanceof   instanceof关键字用于判断一个引用类型变量所指向的对象是否是一个类(或接口.抽象类.父类)的实例.   举个例子:   public interfa ...

  9. QT:QObject 简单介绍

    QObject 是所有Qt对象的基类. QObject 是Qt模块的核心.它的最主要特征是关于对象间无缝通信的机制:信号与槽.使用connect()建立信号到槽的连接,使用disconnect()销毁 ...

  10. Mac和Linux下pip更换源

    cd ~mkdir .pip vim .pip/pip.conf 在pip.conf中写入 [global]timeout = 6000index-url = https://pypi.tuna.ts ...