不知道大家在工作中是否遇到过这种情况,明明就是一个字符串,但是设计师偏让我们显示成不同的样式,具体效果和下图类似 如果你用4个TextView去做的话,只能说可以做,但是代码被别人看到肯定要喷成翔。有人说用Html.fromHtml()方法来将文本刷成html格式,然后通过设置html样式的方式来做。这样不是不可以,首先我们不是很擅长html,其次这种方式提供的效果有限,很容易就卡壳了。这里我介绍一下用原生的动态样式字符串类SpannableStringBuilder类来实现各种各样不同的文字效果,感兴趣的同学赶快上车,一起来学习一下该如何优雅地实现这种效果吧!SpannableStringBuilder介绍SpannableStringBuilder是什么? 查看一下SpannableStringBuilder代码,它实现了CharSequence接口,这个接口就是字符串的父接口,说明它和字符串是功能类似的。可以这么认为,SpannableStringBuilder是字符串的升级版本,支持动态地设置字符串的各种各样的属性,具体可以设置哪些属性呢,下面一一道来。 这是SpannableStringBuilder的类继承: 下面是String的类继承:SpannableStringBuilder是怎么使用的? 首先初始化一个SpannableStringBuilder,然后初始化一个Span,这个Span具体是哪个对象,也就是what对象依具体情况而定。比如想设置文字颜色是传入ForegroundColorSpan,如果想插入图片就传入ImageSpan即可。初始化的span通过SpannableStringBuilder对象的setSpan方法传入,最后直接通过TextView的setText()将SpannableStringBuilder对象传入即可。注意,setSpan的第二个参数和第三个参数分别代表起始文字,以及影响到的结束文字,包括前面不包括后面文字。 void setSpan (Object what, int start, int end, int flags)SpannableStringBuilder ssb = new SpannableStringBuilder(“天王盖地虎!”);
XXSpan Span = new XXSpan();
ssb.setSpan(span,0,1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTv.setText(ssb);复制代码Spanned.SPAN_EXCLUSIVE_EXCLUSIVE是什么? 这是flgs中的一种,flags总共包括以下四种。可能大家光看文字肯定看晕了,我这里就举个例子吧,分别让大家看一下这四种flag设置以后的效果。 假设最初的文本样式时这样的: 接下来我在追风的前后分别插入一个字,效果就很明显了,插入代码如下:mSSB.insert(0,“哼”);
mSSB.insert(3,“哈”);复制代码 Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括(在标志位【start,end)前后添加文字,新添加的文字不会有任何设置的属性) Spannable.SPAN_EXCLUSIVE_INCLUSIVE :前面不包括,后面包括。(在标志位【start,end)前添加文字,新添加的文字不会有任何设置的属性,后边的添加的文字会带有设置的what属性)
Spannable.SPAN_INCLUSIVE_EXCLUSIVE :前面包括,后面不包括。(在标志位【start,end)后添加文字,新添加的文字不会有任何设置的属性,前边边的添加的文字会带有设置的what属性)
Spannable.SPAN_INCLUSIVE_INCLUSIVE :前后都包括。前后都不包括(在标志位【start,end)前后添加文字,新添加的文字会有设置的属性) Span是什么? Span是谷歌提供的专门用来代表字符串样式的一个抽象,可以非常完美地配合SpannableStringBuilder进行使用,就相当于是一个本身可以设置参数的高级参数吧。我们可以随便点进去一个Span,然后点击其父类,最后查看该父类的实现方式,发现总共有12个Span类型,当然它们可能还会有子类。这些个Span具体代表什么意思呢,接下来笔者会将最常用的Span一一道来。常用Span类型一览1.设置字体颜色ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.parseColor("#FF0000"));
mSSB.setSpan(foregroundColorSpan,0,1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTv.setText(mSSB);复制代码2.设置背景颜色BackgroundColorSpan backgroundColorSpan = new BackgroundColorSpan(Color.parseColor("#00FF00"));
mSSB.setSpan(backgroundColorSpan,1,2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTv.setText(mSSB);复制代码3.设置模糊效果MaskFilter filter=new BlurMaskFilter(4.0f,BlurMaskFilter.Blur.OUTER);
MaskFilterSpan maskFilterSpan=new MaskFilterSpan(filter);
mSSB.setSpan(maskFilterSpan,2,5,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTv.setText(mSSB);复制代码4.设置点击事件ClickableSpan clickableSpan = new ClickableSpan() {
@Override public void onClick(View view) {
Toast.makeText(getApplicationContext(),“点击了”,Toast.LENGTH_SHORT).show();
}};
mSSB.setSpan(clickableSpan,5,7,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// 设置此方法后,点击事件才能生效
mTv.setMovementMethod(LinkMovementMethod.getInstance());
mTv.setText(mSSB);复制代码5.设置删除线mSSB.setSpan(new StrikethroughSpan(),7,9,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTv.setMovementMethod(LinkMovementMethod.getInstance());
mTv.setText(mSSB);复制代码6.设置下划线UnderlineSpan underlineSpan=new UnderlineSpan();
mSSB.setSpan(underlineSpan,9,12,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTv.setText(mSSB);复制代码7.设置文字大小AbsoluteSizeSpan ab=new AbsoluteSizeSpan(36,true);
mSSB.setSpan(ab,12,14,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTv.setText(mSSB);复制代码8.指定位置插入图片Drawable drawable = getResources().getDrawable(R.mipmap.ic_launcher_round);
drawable.setBounds(0,0,100,100);
ImageSpan ab = new ImageSpan(drawable);
mSSB.setSpan(ab,15,16,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTv.setText(mSSB);复制代码9.上下缩放效果ScaleXSpan ab = new ScaleXSpan(3.0f);
mSSB.setSpan(ab,16,18,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTv.setText(mSSB);复制代码10.设置粗体斜体StyleSpan ab = new StyleSpan(Typeface.BOLD_ITALIC);
mSSB.setSpan(ab,18,22,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTv.setText(mSSB);复制代码11.设置上标,例如多少次方SuperscriptSpan ab=new SuperscriptSpan();
mSSB.setSpan(ab,22,23,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTv.setText(mSSB);复制代码12.设置下标,例如log(n)SubscriptSpan ab=new SubscriptSpan();
mSSB.setSpan(ab,23,24,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTv.setText(mSSB);复制代码13.设置超链接URLSpan ab = new URLSpan (“http://www.baidu.com”);
mSSB.setSpan(ab,25,27,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTv.setMovementMethod(new LinkMovementMethod());
mTv.setText(mSSB);复制代码14.设置字体样式TextAppearanceSpan ab=new TextAppearanceSpan(this, android.R.style.TextAppearance_DeviceDefault_Large);
mSSB.setSpan(ab,24,25,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTv.setText(mSSB);复制代码15.设置字体TypefaceSpan ab=new TypefaceSpan (“serif”);
mSSB.setSpan(ab,27,28,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
mTv.setText(mSSB);复制代码坑点一览坑点一 再次设置样式需要获取到原来的span 请看下图,我只是设置了少年,这3个字符的样式,但是实际上后面有一个逗号也复用了该样式。总结一下就是,前面设置过的样式,后面相同字符仍然生效! 解决方案是给后面的逗号重新设置新样式,就不会采用默认的了,如下图,我给它设置了一个新样式,新样式生效了。坑点二 修改点击事件的颜色 点击事件ClickableSpan使用后,默认是有颜色的。但是它并没有提供setColor的方法,如果我们想修改它的颜色应该怎么办呢? 这里需要复写UnderlineSpan类的updateDrawState方法,在里面进行修改mSSB.setSpan(new UnderlineSpan() {
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(Color.BLUE);//设置颜色
//ds.setUnderlineText(false);//去掉下划线
}}, 5, 7, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);复制代码坑点三 插入图片时会覆盖原内容 这是默认的效果,在插入图片时,图片是会占位置的,这里王字就被图片覆盖了。 为了解决这个问题,可以在需要插入图片的地方插入几个空格,或者回车即可,让图片去覆盖不重要的字符。总结 SpannableStringBuilder是一个高度定制化的StringBuilder,可以动态修改一个字符串中间某一段的样式,功能非常强大。本文简单介绍了SpannableStringBuilder的作用,已经如何使用,其次列举出了所有可设置的Span,以后碰到有一个TextView里多样式的情况可以直接拿过去使用了。掌握了SpannableStringBuilder以后,其实还可以做很多的事情,比如加入一些动画可以制作一些很酷炫的文字效果。除此之外,还可以实现最最简单的图文混排,当然复杂的图文混排还是要自定义view去做了。当然还有很多,比如文本最后的全文、展开效果等等。
https://www.jianshu.com/p/e00f7ebc5a8c
https://www.jianshu.com/p/2d3124f51a3d
https://www.jianshu.com/p/e2953bb0b576
https://www.jianshu.com/p/80c6a4f5436a
https://www.jianshu.com/p/e19641efc173

什么,同一个文本可以设置多种样式?相关推荐

  1. java文本框设置字体样式,java Swing设置文本框文字颜色和字体

    在java中文本编辑器单独设置文字的控件有个JTextPane,而通常使用的JTextArea似乎不能设置所选文字的颜色和字体. //实例化一个文本编辑的控件 JTextPane editorPane ...

  2. unity富文本使用:同一个文本框展示不同样式字体

    用的是HTML5的方式 < b>变粗< /b> < i>倾斜< /i> <color=#FF0000>大炮:谁家的<size=50&g ...

  3. TextView内可以有多种样式吗?

    是否可以在TextView中为不同的文本设置多种样式? 例如,我将文本设置如下: tv.setText(line1 + "\n" + line2 + "\n" ...

  4. html怎么设置椭圆文本框,怎么用PPT制作椭圆形的文本框 PPT椭圆形文本框设置教程...

    在使用PPT软件的过程中,如果我们想用PPT制作椭圆形的文本框,如何制作?方法很简单,下面教程之家网为大家带来PPT椭圆形文本框的设置教程,不会制作的朋友可以参照教程尝试下. 怎么用PPT制作椭圆形的 ...

  5. css设置字体颜色、文本对齐方式、首行缩进、文本装饰、列表样式、鼠标样式、禁止文本域拖拽、轮廓线、块级元素对齐方式、文字溢出设置

    color:设置字体颜色: 取值方式有:1.颜色值red,green等 .2.十六进制#FF0000,#FF2313等.3.RGB代码rgb(225,225,112)或rgb(100%,55%,0%) ...

  6. Flutter中文本输入框TexeFieldr键盘样式TextInputType总结TexeField设置不可编辑

    题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天. TextField 系列文章 TextField的基本使用以及TextField常用属性精讲<点击查看详情> ...

  7. odoo14 文本字段动态设置字体样式颜色 decoration

    简介:我们在实际开发中有时候需要突出显示字段文本,让使用者可以更直观的查看数据,就需要对字段文本进行字体及颜色的设置.odoo自带了一套简单的设置颜色的方式,可以设置列表中某个字段的颜色字体. (一) ...

  8. css中如何设置hr的样式?css hr标签多种样式(图文)

    在对html网页进行美化的时候,肯定少不了要用的hr标签进行修饰页面,但默认的hr标签样式对页面的修饰起不到什么好的作用,有经验的前端工作者就会通过使用css样式来对hr标签进行一些美化的操作.那么如 ...

  9. POI之PPT文本框生成及样式设置实例

    开心一笑 一大哥去医院看病. 医生问:你得了什么病? 大哥说: 我得了间接性失忆症. 医生问:具体什么症状? 大哥说:我一看到漂亮的姑娘就忘记自己已结婚了. 医生说:滚滚滚,这病我自己都没治好! 视频 ...

最新文章

  1. hard_negative_mining
  2. 深度学习核心技术精讲100篇(三)-层次自适应的多臂老虎机决策算法 ( HATCH )在滴滴中的应用
  3. java 二进制 base64编码_java 按字节读写二进制文件(Base64编码解码)
  4. sdk没有登录什么意思_检查肝功能没有空腹,影响效果吗?转氨酶100是什么意思?...
  5. 6-7 jmu-Java-07多线程-Thread (3分)
  6. 软件测试—软件测试基础知识—测试用例设计的方法之场景法、正交试验法和错误推断法
  7. C语言程序设计精要,C语言程序设计精要.doc
  8. 盒子背景颜色(HTML、CSS)
  9. ob_start()函数
  10. OpenWrt 路由器过滤广告的N种方法
  11. Mac下使用Automator实现截屏编辑保存
  12. PYTHON机器学习基础(初学机器学习者的福音)
  13. LeetCode 热题 HOT 100 -------160. 相交链表(链表)206. 反转链表(递归、回溯)
  14. Sqlalchemy 使用add_columns函数
  15. javah命令详解与idea使用javah一键编译JNI的.头文件
  16. 视频网站服务器该怎么选择呢
  17. 自己手动重写的equals方法与自动生成重写的equals方法的区别
  18. c#简易的金山打字游戏
  19. 华为强制升级鸿蒙,华为手机升级鸿蒙的方法,有哪位升级成功的吗?
  20. 区块链革命:从《失控》说起

热门文章

  1. 暗黑三php是什么东西,暗黑3卡奈魔盒怎么得有什么用_暗黑3卡奈魔盒详细介绍
  2. Illustrator 教程:如何在 Illustrator 中对齐内容?
  3. [渝粤教育] 武汉大学 水环境数学模型 参考 资料
  4. 企业做SEO的误区有哪些
  5. 4-1-9 高空坠球 (20分)
  6. STM32 ADC 引脚约0.7V问题解决方法
  7. CSS 修改滚动条样式 隐藏浏览器滚动条
  8. 6-8.用HLSL定义聚光灯
  9. CSS-上下滑动翻页效果
  10. Android进行代码混淆