Spanable和span是用于富文本拼接

SpannedString, SpannableString 或 SpannableStringBuilder区别:

SpannedString不能用span

SpannableString 能用span 不能变文本

SpannableStringBuilder 能用span 能变文本

  • 仅 读取而不设置 文本和 span –> SpannedString

  • 设置文本和 span –> SpannableStringBuilder

  • 设置 少量的 span (<~ 10) –> SpannableString

  • 设置 大量的 span (>~ 10) –> SpannableStringBuilder

Spannable中的常用常量:

网上一堆的什么包含不包含, 说是text设置span的位置,其实根本没有关系, 这包含不包含是指insert的文本是否跟随原本的span

EXCLUSIVE指 不跟随, INCLUSIVE是跟随

  • Spannable.SPAN_EXCLUSIVE_INCLUSIVE:在 Span前面输入的字符不应用 Span的效果,在后面输入的字符应用Span效果。
  • Spannable.SPAN_INCLUSIVE_EXCLUSIVE:在 Span前面输入的字符应用 Span 的效果,在后面输入的字符不应用Span效果。
  • Spannable.SPAN_INCUJSIVE_INCLUSIVE:在 Span前后输入的字符都应用 Span 的效果。
  • Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不应用。

setSpan的start end可以理解为[a,b) 比如:

SpannableStringBuilder text = new SpannableStringBuilder("0123456789");
ForegroundColorSpan span = new ForegroundColorSpan(Color.RED);
text.setSpan(span, 2, 3, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
textView.setText(text);

结果就是2变红色

不论最后的Spannable.SPAN_INCLUSIVE_EXCLUSIVE到底是上述四个常量中的哪个,都是2变成红色

如果加上text.insert(2, "二");

那就变成在index=2的位置插入二 变成 "01二23456789"

同时由于2的flag是Spannable.SPAN_INCLUSIVE_EXCLUSIVE,前应用 后不应用,因此二也会变红色

如果再加一句text.insert(4, "二");

那就变成在index=4的位置插入二 变成 "01二2二3456789"

tips: 如果插入位置的前后的文字的flag都是INCLUSIVE,跟随后面的

常用的Span

  • BackgroundColorSpan : 文本背景色
  • ForegroundColorSpan : 文本颜色
  • MaskFilterSpan : 修饰效果,如模糊(BlurMaskFilter)浮雕
  • RasterizerSpan : 光栅效果
  • StrikethroughSpan : 删除线
  • SuggestionSpan : 相当于占位符
  • UnderlineSpan : 下划线
  • AbsoluteSizeSpan : 文本字体(绝对大小)
  • DynamicDrawableSpan : 设置图片,基于文本基线或底部对齐。
  • ImageSpan : 图片
  • RelativeSizeSpan : 相对大小(文本字体)
  • ScaleXSpan : 基于x轴缩放
  • StyleSpan : 字体样式:粗体、斜体等
  • SubscriptSpan : 下标(数学公式会用到)
  • SuperscriptSpan : 上标(数学公式会用到)
  • TextAppearanceSpan : 文本外貌(包括字体、大小、样式和颜色)
  • TypefaceSpan : 文本字体
  • URLSpan : 文本超链接
  • ClickableSpan : 点击事件

例子:

 private void setView() {//创建一个 SpannableString对象msp = new SpannableString("字体测试字体大小一半两倍前景色背景色正常粗体斜体粗斜体下划线删除线x1x2电话邮件网站短信彩信地图X轴综合/bot");//设置字体(default,default-bold,monospace,serif,sans-serif)msp.setSpan(new TypefaceSpan("monospace"), 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);msp.setSpan(new TypefaceSpan("serif"), 2, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//设置字体大小(绝对值,单位:像素)msp.setSpan(new AbsoluteSizeSpan(20), 4, 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);msp.setSpan(new AbsoluteSizeSpan(20, true), 6, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //第二个参数boolean dip,如果为true,表示前面的字体大小单位为dip,否则为像素,同上。//设置字体大小(相对值,单位:像素) 参数表示为默认字体大小的多少倍msp.setSpan(new RelativeSizeSpan(0.5f), 8, 10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //0.5f表示默认字体大小的一半msp.setSpan(new RelativeSizeSpan(2.0f), 10, 12, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //2.0f表示默认字体大小的两倍//设置字体前景色msp.setSpan(new ForegroundColorSpan(Color.MAGENTA), 12, 15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //设置前景色为洋红色//设置字体背景色msp.setSpan(new BackgroundColorSpan(Color.CYAN), 15, 18, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //设置背景色为青色//设置字体样式正常,粗体,斜体,粗斜体msp.setSpan(new StyleSpan(android.graphics.Typeface.NORMAL), 18, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //正常msp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 20, 22, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //粗体msp.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 22, 24, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //斜体msp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 24, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //粗斜体//设置下划线msp.setSpan(new UnderlineSpan(), 27, 30, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//设置删除线msp.setSpan(new StrikethroughSpan(), 30, 33, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//设置上下标msp.setSpan(new SubscriptSpan(), 34, 35, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //下标msp.setSpan(new SuperscriptSpan(), 36, 37, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);   //上标//超级链接(需要添加setMovementMethod方法附加响应)msp.setSpan(new URLSpan("tel:4155551212"), 37, 39, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //电话msp.setSpan(new URLSpan("mailto:webmaster@google.com"), 39, 41, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //邮件msp.setSpan(new URLSpan("http://www.baidu.com"), 41, 43, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //网络msp.setSpan(new URLSpan("sms:4155551212"), 43, 45, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //短信   使用sms:或者smsto:msp.setSpan(new URLSpan("mms:4155551212"), 45, 47, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //彩信   使用mms:或者mmsto:msp.setSpan(new URLSpan("geo:38.899533,-77.036476"), 47, 49, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //地图//设置字体大小(相对值,单位:像素) 参数表示为默认字体宽度的多少倍msp.setSpan(new ScaleXSpan(2.0f), 49, 51, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //2.0f表示默认字体宽度的两倍,即X轴方向放大为默认字体的两倍,而高度不变//设置字体(依次包括字体名称,字体大小,字体样式,字体颜色,链接颜色)ColorStateList csllink = null;ColorStateList csl = null;@SuppressLint("ResourceType") XmlResourceParser xppcolor = getResources().getXml(R.color.linkcolor);try {csl = ColorStateList.createFromXml(getResources(), xppcolor);} catch (XmlPullParserException e) {// TODO: handle exceptione.printStackTrace();} catch (IOException e) {// TODO: handle exceptione.printStackTrace();}@SuppressLint("ResourceType") XmlResourceParser xpplinkcolor = getResources().getXml(R.color.linkcolor);try {csllink = ColorStateList.createFromXml(getResources(), xpplinkcolor);} catch (XmlPullParserException e) {// TODO: handle exceptione.printStackTrace();} catch (IOException e) {// TODO: handle exceptione.printStackTrace();}msp.setSpan(new TextAppearanceSpan("monospace", android.graphics.Typeface.BOLD_ITALIC, 30, csl, csllink), 51, 53, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//设置项目符号msp.setSpan(new BulletSpan(android.text.style.BulletSpan.STANDARD_GAP_WIDTH, Color.GREEN), 0, msp.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //第一个参数表示项目符号占用的宽度,第二个参数为项目符号的颜色//设置图片Drawable drawable = getResources().getDrawable(R.drawable.ic_launcher_background);drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());msp.setSpan(new ImageSpan(drawable), 53, 57, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);mTextView.setText(msp);mTextView.setMovementMethod(LinkMovementMethod.getInstance());}

https://blog.csdn.net/a214024475/article/details/53261122

https://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650243866&idx=1&sn=c5ba5fec2507c913fd3cce589dead997&chksm=88637275bf14fb63de996d99c7e3b87f2a2df7124a1b794c60b7963c6ed4f550e8ed459ac735&scene=0#rd

Spanable和span使用相关推荐

  1. MTK Android添加驱动模块

    1 [编写linux驱动程序] 1.1 一.编写驱动核心程序 1.2 二.配置Kconfig 1.3 三.配置Makefile 1.4 四.配置系统的autoconfig 1.5 五.编译 2 [编写 ...

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

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

  3. Android Span富文本设置点击事件/超链接 - URLSpan/ClickableSpan

    ######为文字实现很丰富的特殊效果,下面来实现 点击事件/超链接 操作 so... 直接上效果: ##使用前提条件: textView.movementMethod = LinkMovementM ...

  4. css html span 块状不换行

    span标记的样式设定width属性,会发现不会产生效果. 如果设置display:block,width属性生效,但是此时的span跟div一样了.  如果设置display:inline-bloc ...

  5. AttributeError: ‘NoneType‘ object has no attribute ‘span‘

    span 是返回配置到内容的下标,使用span 的时候需要注意,当匹配不到内容的时候就会报错了, 如下的例子就会报错 str_content = "Python is a good lang ...

  6. [Swift]LeetCode901. 股票价格跨度 | Online Stock Span

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  7. 行内标签(最常用的:a标签、img标签、span标签)

    a 标签: 功能: 从一个页面跳转到其他页面,或者是当前页面的其他位置. 属性: href :指定跳转的目标路径. 值可以是一个外部网站的地址: 也可以是一个内部网页的地址 target: _self ...

  8. 交换机SPAN功能配置

    实验项目性质:验证性 计划学时:4学时 一.实验目的 掌握交换机设备的端口镜像(SPAN)功能与原理,掌握配置指令与用法. 二.实验原理 用户可以利用端口镜像(SPAN)提供的功能,将指定端口的报文复 ...

  9. 数学中的span以及线性流形是什么意思

    span在矩阵论中是指生成线性子空间V1V_1V1​的意思. 说到线性子空间,那肯定有原线性空间VVV. 我们从VVV中取nnn个向量,x1,⋯,xnx_1,\cdots,x_nx1​,⋯,xn​,他 ...

最新文章

  1. 20141125-2
  2. MFC中“资源在另一个编译器中打开”报错解决方法
  3. 为什么大数据需要数据湖?
  4. Linux内核中ioremap映射的透彻理解
  5. OpenJudge NOI 1.5 25:求特殊自然数
  6. 数据结构思维 第七章 到达哲学
  7. oracle 定时任务例子【项目例子】
  8. PDI(KETTLE)学习笔记
  9. 学习MAXScript
  10. 傲梅分区助手看不到linux,傲梅分区助手使用教程
  11. (Android7.0) init.rc与AIL(Android Init Language)语句
  12. Codeforces 1398 F. Controversial Rounds —— 线段树+dp
  13. 字节跳动疯狂挖人,校招平均年薪30万,我还有机会吗?
  14. 如何将计算机基础拷到u盘上,怎么把电脑上的CAD拷贝到u盘里
  15. android沙漏动画app,沙漏动画
  16. uniapp App端后台间隔时间发送定位功能实现
  17. 网易云音乐等三方app如何在锁屏显示
  18. 2.11 求N分之一序列前N项和
  19. 丹尼尔·克雷格詹姆斯·邦德锻炼培训
  20. 身份证纹理去除思路探究

热门文章

  1. python判断能否组成三角形_【python+任意输入3个数+判断能否组成三角形】 - #1
  2. H5前端,正方体动画效果
  3. 被召者 RC: E_NOINTERFACE (0x80004002) 无法运行virtualBox的完善解决办法
  4. 华为电脑管家下载(非华为电脑)
  5. HAL库之485+DMA通信(STM32F746)
  6. 【单片机系列】基于51单片机的四路抢答器
  7. UC3843 PWM控制芯片详解及其应用电路
  8. 用友java错误_用友NC系统使用过程中常见问题和解决方法
  9. echarts国内各省份地图js/json文件,全球地图js文件/汉化,字符云js文件
  10. GoAccess 网站日志分析