转自:http://blog.it985.com/14433.html1、SpannableString、SpannableStringBuilder与String的关系
首先SpannableString、SpannableStringBuilder基本上与String差不多,也是用来存储字符串,但它们俩的特殊就在于有一个SetSpan()函数,能给这些存储的String添加各种格式或者称样式(Span),将原来的String以不同的样式显示出来,比如在原来String上加下划线、加背景色、改变字体颜色、用图片把指定的文字给替换掉,等等。所以,总而言之,SpannableString、SpannableStringBuilder与String一样, 首先也是传字符串,但SpannableString、SpannableStringBuilder可以对这些字符串添加额外的样式信息,但String则不行。
注意:如果这些额外信息能被所用的方式支持,比如将SpannableString传给TextView;也有对这些额外信息不支持的,比如前一章讲到的Canvas绘制文字,对于不支持的情况,SpannableString和SpannableStringBuilder就是退化为String类型,直接显示原来的String字符串,而不会再显示这些附加的额外信息。 2、SpannableString与SpannableStringBuilder区别 它们的区别在于 SpannableString像一个String一样,构造对象的时候传入一个String,之后再无法更改String的内容,也无法拼接多个 SpannableString;而SpannableStringBuilder则更像是StringBuilder,它可以通过其append()方法来拼接多个String;  3、SetSpan() void setSpan (Object what, int start, int end, int flags)  函数意义:给SpannableString或SpannableStringBuilder特定范围的字符串设定Span样式,可以设置多个(比如同时加上下划线和删除线等),Falg参数标识了当在所标记范围前和标记范围后紧贴着插入新字符时的动作,即是否对新插入的字符应用同样的样式。  参数说明:  object what :对应的各种Span,后面会提到; int start:开始应用指定Span的位置,索引从0开始 int end:结束应用指定Span的位置,特效并不包括这个位置。比如如果这里数为3(即第4个字符),第4个字符不会有任何特效。从下面的例子也可以看出来。 int flags:取值有如下四个 Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括,即在指定范围的前面和后面插入新字符都不会应用新样式 Spannable.SPAN_EXCLUSIVE_INCLUSIVE :前面不包括,后面包括。即仅在范围字符的后面插入新字符时会应用新样式 Spannable.SPAN_INCLUSIVE_EXCLUSIVE :前面包括,后面不包括。 Spannable.SPAN_INCLUSIVE_INCLUSIVE :前后都包括。 下面写了个小demo,先看一下效果图:

  1 public class MainActivity extends Activity implements OnClickListener {
  2     private TextView tv;
  3     private Button underline_btn;
  4     private Button strike_btn;
  5     private Button style_btn;
  6     private Button font_btn;
  7     private Button color_btn1;
  8     private Button color_btn2;
  9     private Button url_btn;
 10     private Button image_btn;
 11     private Button maskfilte_btn;
 12     private Button Rasterizer_btn;
 13     private Button spannablestringbuilder;
 14     @Override
 15     protected void onCreate(Bundle savedInstanceState) {
 16         super.onCreate(savedInstanceState);
 17         setContentView(R.layout.activity_main);
 18         tv = (TextView) this.findViewById(R.id.tv);
 19         underline_btn = (Button) this.findViewById(R.id.underline_btn);
 20         strike_btn = (Button) this.findViewById(R.id.strike_btn);
 21         style_btn = (Button) this.findViewById(R.id.style_btn);
 22         font_btn = (Button) this.findViewById(R.id.font_btn);
 23         color_btn1 = (Button) this.findViewById(R.id.color_btn1);
 24         color_btn2 = (Button) this.findViewById(R.id.color_btn2);
 25         url_btn = (Button) this.findViewById(R.id.url_btn);
 26         image_btn = (Button) this.findViewById(R.id.image_btn);
 27         maskfilte_btn = (Button) this.findViewById(R.id.maskfilte_btn);
 28         Rasterizer_btn = (Button) this.findViewById(R.id.Rasterizer_btn);
 29         spannablestringbuilder = (Button) this.findViewById(R.id.spannablestringbuilder);
 30
 31         underline_btn.setOnClickListener(this);
 32         strike_btn.setOnClickListener(this);
 33         style_btn.setOnClickListener(this);
 34         font_btn.setOnClickListener(this);
 35         color_btn1.setOnClickListener(this);
 36         color_btn2.setOnClickListener(this);
 37         url_btn.setOnClickListener(this);
 38         image_btn.setOnClickListener(this);
 39         maskfilte_btn.setOnClickListener(this);
 40         Rasterizer_btn.setOnClickListener(this);
 41         spannablestringbuilder.setOnClickListener(this);
 42
 43     }
 44
 45     @Override
 46     public void onClick(View v) {
 47         switch (v.getId()) {
 48         case R.id.underline_btn:
 49             addUnderLineSpan();
 50             break;
 51         case R.id.strike_btn:
 52             addStrikeSpan();
 53             break;
 54         case R.id.style_btn:
 55             addStyleSpan();
 56             break;
 57         case R.id.font_btn:
 58             addFontSpan();
 59             break;
 60         case R.id.color_btn1:
 61             addForeColorSpan();
 62             break;
 63         case R.id.color_btn2:
 64             addBackColorSpan();
 65             break;
 66         case R.id.url_btn:
 67             addUrlSpan();
 68             break;
 69         case R.id.image_btn:
 70             addImageSpan();
 71             break;
 72         case R.id.maskfilte_btn:
 73             addmaskfilteSpan();
 74             break;
 75         case R.id.Rasterizer_btn:
 76             addRasterizerSpan();
 77             break;
 78         case R.id.spannablestringbuilder:
 79             addspannablestringbuilderSpan();
 80             break;
 81         }
 82     }
 83     /**
 84      * spannablestringbuilder
 85      */
 86     private void addspannablestringbuilderSpan() {
 87         SpannableStringBuilder ss=new SpannableStringBuilder("红色超链接斜体删除线绿色下划线图片:.");
 88            //用颜色标记文本
 89         ss.setSpan(new ForegroundColorSpan(Color.RED), 0, 2,
 90                 //setSpan时需要指定的 flag,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE(前后都不包括).
 91                 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
 92         //用超链接标记文本
 93         ss.setSpan(new URLSpan("tel:4155551212"), 2, 5,
 94                 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
 95         //用样式标记文本(斜体)
 96         ss.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 5, 7,
 97                 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
 98         //用删除线标记文本
 99         ss.setSpan(new StrikethroughSpan(), 7, 10,
100                 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
101         //用下划线标记文本
102         ss.setSpan(new UnderlineSpan(), 10, 16,
103                 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
104         //用颜色标记
105         ss.setSpan(new ForegroundColorSpan(Color.GREEN), 10, 12,
106                 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
107         //获取Drawable资源
108         Drawable d = getResources().getDrawable(R.drawable.ic_launcher);
109         d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
110         //创建ImageSpan
111         ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);
112         //用ImageSpan替换文本
113         ss.setSpan(span, 18, 19, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
114         tv.append("\n");
115         tv.setText(ss);
116         tv.setMovementMethod(LinkMovementMethod.getInstance()); //实现文本的滚动
117     }
118
119     /*
120      * Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括,即在指定范围的前面和后面插入新字符都不会应用新样式
121      * Spannable.SPAN_EXCLUSIVE_INCLUSIVE :前面不包括,后面包括。即仅在范围字符的后面插入新字符时会应用新样式
122      * Spannable.SPAN_INCLUSIVE_EXCLUSIVE :前面包括,后面不包括。
123      * Spannable.SPAN_INCLUSIVE_INCLUSIVE :前后都包括。
124      */
125     /**
126      * 光栅效果
127      */
128     private void addRasterizerSpan() {
129         SpannableString spanText = new SpannableString("StrikethroughSpan");
130         spanText.setSpan(new StrikethroughSpan(), 0, 7, Spannable.
131         SPAN_INCLUSIVE_EXCLUSIVE);
132         tv.append("\n");
133         tv.append(spanText);
134
135     }
136     /**
137      * 修饰效果
138      */
139     private void addmaskfilteSpan() {
140         SpannableString spanText = new SpannableString("benzlocke6666666");
141         int length = spanText.length();
142         //模糊(BlurMaskFilter)
143         MaskFilterSpan maskFilterSpan = new MaskFilterSpan(new BlurMaskFilter(3, Blur.OUTER));
144         spanText.setSpan(maskFilterSpan, 0, length - 10, Spannable.
145         SPAN_INCLUSIVE_EXCLUSIVE);
146         //浮雕(EmbossMaskFilter)
147         maskFilterSpan = new MaskFilterSpan(new EmbossMaskFilter(new float[]{1,1,3}, 1.5f, 8, 3));
148         spanText.setSpan(maskFilterSpan, length - 10, length, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
149         tv.append("\n");
150         tv.append(spanText);
151
152     }
153
154     /**
155      * 超链接
156      */
157     private void addUrlSpan() {
158         SpannableString spanString = new SpannableString("超链接");
159         URLSpan span = new URLSpan("tel:0123456789");
160         spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
161         tv.append("\n");
162         tv.append(spanString);
163
164         tv.setMovementMethod(LinkMovementMethod.getInstance());
165     }
166
167     /**
168      * 文字背景颜色
169      */
170     private void addBackColorSpan() {
171         SpannableString spanString = new SpannableString("文字背景颜色");
172         BackgroundColorSpan span = new BackgroundColorSpan(Color.YELLOW);
173         spanString.setSpan(span, 0, 6, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
174         tv.append("\n");
175         tv.append(spanString);
176     }
177
178     /**
179      * 文字颜色
180      */
181     private void addForeColorSpan() {
182         SpannableString spanString = new SpannableString("文字颜色");
183         ForegroundColorSpan span = new ForegroundColorSpan(Color.BLUE);
184         spanString.setSpan(span, 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
185         tv.append("\n");
186         tv.append(spanString);
187     }
188
189     /**
190      * 字体大小
191      */
192     private void addFontSpan() {
193         SpannableString spanString = new SpannableString("36号字体");
194         AbsoluteSizeSpan span = new AbsoluteSizeSpan(36);
195         spanString.setSpan(span, 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
196         tv.append("\n");
197         tv.append(spanString);
198     }
199
200     /**
201      * 粗体,斜体
202      */
203     private void addStyleSpan() {
204         SpannableString spanString = new SpannableString("ABCDEF");
205         StyleSpan span = new StyleSpan(Typeface.BOLD_ITALIC);
206         spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
207         tv.append("\n");
208         tv.append(spanString);
209     }
210
211     /**
212      * 删除线
213      */
214     private void addStrikeSpan() {
215         SpannableString spanString = new SpannableString("删除线");
216         StrikethroughSpan span = new StrikethroughSpan();
217         spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
218         tv.append("\n");
219         tv.append(spanString);
220     }
221
222     /**
223      * 下划线
224      */
225     private void addUnderLineSpan() {
226         SpannableString spanString = new SpannableString("下划线");
227         UnderlineSpan span = new UnderlineSpan();
228         spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
229         tv.append("\n");
230         tv.append(spanString);
231     }
232
233     /**
234      * 图片
235      */
236     private void addImageSpan() {
237         SpannableString spanString = new SpannableString(" ");
238         Drawable d = getResources().getDrawable(R.drawable.ic_launcher);
239         d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
240         ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);
241         spanString.setSpan(span, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
242         tv.append("\n");
243         tv.append(spanString);
244     }
245 }

转载于:https://www.cnblogs.com/upwgh/p/5897495.html

SpannableString与SpannableStringBuilder使用相关推荐

  1. SpannableString

    http://blog.csdn.net/fengkuanghun/article/details/7904284 背景介绍 在开发应用过程中经常会遇到显示一些不同的字体风格的信息犹如默认的LockS ...

  2. Android开发之SpannableString具体解释

    在实际的应用开发过程中常常会遇到.在文本的不同部分显示一些不同的字体风格的信息如:文本的字体.大小.颜色.样式.以及超级链接等. 普通情况下,TextView中的文本都是一个样式.对于类似的情况.能够 ...

  3. Android利用SpannableStringBuilder设置TextView中部分文字的颜色...

    原文:android - SpannableString或SpannableStringBuilder以及string.xml文件中的整型和string型代替 背景介绍 在开发应用过程中经常会遇到显示 ...

  4. android string 原理,Android中的SpannableString,Spans以及TextView绘制原理

    前言 前段时间看过一篇 实现类似新浪微博帖子显示(2)--话题.@好友.表情解析工具类类似这种富文本的显示我们一般首先就会想到SpannableString,原作者也是这样实现的,就想着整理一下 相关 ...

  5. android多媒体图文混排,干货!!!Android富文本实现图文混排

    效果图 rich.jpg 像图中的效果,大家在开发并不少见,大家可能不知道android提供了实现图文混排的类.大家或许会写一个布局或者使用drawableLeft这个属性实现文本的左侧图标. and ...

  6. 浅谈ClickableSpan , 实现TextView文本某一部分文字的点击响应

    超文本:http://www.baidu.com 这么一个效果:一行文本当中 前面显示黑色颜色的"超文本:",后面显示红色颜色的"http://www.baidu.com ...

  7. android textview 设置字体,Android TextView设置字体风格

    在开发应用过程中经常会遇到显示一些不同的字体风格的信息犹如默认的LockScreen上面的时间和充电信息.对于类似的情况,可能第一反应就是用不同的多个TextView来实现,对于每个TextView设 ...

  8. Android开发之TextView高级应用

    Android开发之TextView高级应用 我们平时使用TextView往往让它作为一个显示文字的容器,但TextView的功能并不局限于此.以下就和大家分享一下TextView的一些使用技巧. A ...

  9. 原生与html,解析原生与html之间进行的一些关联

    1.Android中设置部分字体的颜色改变,并且能点击 1, 使用SpannableStringBuilder来实现//1,使用 SpannableStringBuilder , 参数中的数字表示修改 ...

最新文章

  1. java复习2(编码)
  2. SSH整合注解版(Spring+Struts2+Hibernate)
  3. 设计模式笔记八:过滤器模式
  4. 在linux上ansi格式转换换utf-8格式会乱码吗?,c++对编码格式ANSI utf8 unicode 进行转换...
  5. 打断点是什么意思_英语微课堂:“Give me a break”是什么意思呢?
  6. 揭秘无聊程序猿的趣味人生|斑鸠职业
  7. 智能电话机器人--基于 UniMRCP 实现讯飞 ASR MRCP Server
  8. 【代码】获取日期所在月份的 月初、月末的日期
  9. Kerberos鉴权后Spark程序连接Redis数据库,解决No Reachable node in cluster错误
  10. 授人以渔:分享我的算法学习经验
  11. C++ string现代写法
  12. 2020年3大免费又好用的BI工具软件
  13. uni-app AppStore推广内购、SKPaymentTransactionObser
  14. Android输入法弹窗导致背景变形处理
  15. 机器人操作的“圣杯问题” -- Bin Picking
  16. 《社交网站界面设计(原书第2版)》——2.3 沿着脚印铺路
  17. 前端报504错误如何定位
  18. 报错解决:was not registered for synchronization because synchronization is not active
  19. monodepth无监督卷积神经网络深度估计代码解析(一)
  20. 游戏无法启动解决方案(VC环境问题无法启动)

热门文章

  1. 一分钟了解阿里云产品:ESC五大热点技术问题分析
  2. win2008r2 or centos6 硬盘挂载
  3. SharePoint 2013 基础版 离线安装步骤
  4. PyCharm配置django环境
  5. Office 365系列之八:配置和体验Exchange和Lync
  6. 面试题9:斐波那契数列
  7. ASP.NET之SqlBulkCopy
  8. ASP.NET画图全攻略(上)
  9. mysql 字符串 底层_Mysql 的索引底层原理及数据结构详解
  10. python oop求三角形面积公式_Python OOP --action()函数