文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android的TextView文本:用SpannableString打造绚丽多彩的显示效果

2024-12-02 19:09

关注

绝大多数情况我们用 TextView 只是单纯地显示一个文本;

但是简单的 TextView 也能千变万化显示出各种效果,这一切都要归功于 SpannableString;

今天我们就来讲解;

一、SpannableString介绍

SpannableString其实和String一样,都是一种字符串类型,同样TextView也可以直接设置SpannableString作为显示文本,不同的是SpannableString可以通过使用其方法setSpan方法实现字符串各种形式风格的显示,重要的是可以指定设置的区间,也就是为字符串指定下标区间内的子字符串设置格式;

setSpan(Object what, int start, int end, int flags)方法需要用户输入四个参数,what表示设置的格式是什么,可以是前景色、背景色也可以是可点击的文本等等,start表示需要设置格式的子字符串的起始下标,同理end表示终了下标,flags属性就有意思了,共有四种属性:

SpannableString可以实现的效果

二、效果实现

1、绝对大小

AbsoluteSizeSpan 就是构建绝对大小的类,它有两个参数,第一个表示字体大小,第二个表示是否使用 DIP,false 的话单位就是 px,true 的话单位就是 dp;

  1. SpannableString ss = new SpannableString(txAbsoluteSize.getText()); 
  2. ss.setSpan(new AbsoluteSizeSpan(12, true), 2, 4, SPAN_EXCLUSIVE_EXCLUSIVE); 
  3. txAbsoluteSize.setText(ss); 

2、相对大小

相对字体大小就简单一些了,只需要传入一个字体相对大小,比如我们传入了 1.5,中间两个字就变成了原始字体的 1.5 倍大;

  1. SpannableString ss = new SpannableString(txRelativeSize.getText()); 
  2. ss.setSpan(new RelativeSizeSpan(1.5f), 2, 4, SPAN_EXCLUSIVE_EXCLUSIVE); 
  3. txRelativeSize.setText(ss); 

3、前景色

  1. SpannableString ss = new SpannableString(txForegroundColor.getText()); 
  2. ss.setSpan(new ForegroundColorSpan(Color.BLUE), 0, txForegroundColor.getText().length(), SPAN_EXCLUSIVE_EXCLUSIVE); 
  3. txForegroundColor.setText(ss); 

4、背景色

  1. SpannableString ss = new SpannableString(txBackgroundColor.getText()); 
  2. ss.setSpan(new BackgroundColorSpan(Color.LTGRAY), 0,  
  3.     txBackgroundColor.getText().length(), SPAN_EXCLUSIVE_EXCLUSIVE); 
  4. txBackgroundColor.setText(ss); 

5、加粗和倾斜

粗体、斜体、粗斜体对应的常量是:Typeface.BOLD、Typeface.ITALIC、Typeface.BOLD_ITALIC

  1. SpannableString ss = new SpannableString(txBord.getText()); 
  2. ss.setSpan(new StyleSpan(Typeface.BOLD), 0, txBord.getText().length(),  
  3.     SPAN_EXCLUSIVE_EXCLUSIVE); 
  4. txBord.setText(ss); 

6、删除线

删除线用到的类是 StrikethroughSpan,没有参数;

  1. SpannableString ss = new SpannableString(txDeleteLine.getText()); 
  2. ss.setSpan(new StrikethroughSpan(), 0, txDeleteLine.getText().length(),  
  3.     SPAN_EXCLUSIVE_EXCLUSIVE); 
  4. txDeleteLine.setText(ss); 

7、点击事件添加ClickableSpan的使用

  1. SpannableString spannableString = new SpannableString("要点击的内容"); 
  2. spannableString.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.theme_default)), 0, 6, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);//修改字体颜色 
  3. ClickableSpan clickableSpan = new ClickableSpan() {//添加点击 
  4.      @Override 
  5.      public void onClick(View widget) { 
  6.         onMyCommentClick(widget);//点击事件 
  7.      } 
  8.      @Override 
  9.      public void updateDrawState(TextPaint ds) { 
  10.      //去除连接下划线 
  11.         ds.setColor(ds.linkColor); 
  12.         ds.setUnderlineText(false); 
  13.       } 
  14. }; 
  15. spannableString.setSpan(clickableSpan, 0, 6, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); 
  16. txtView.setMovementMethod(LinkMovementMethod.getInstance());;//这句必须添加,否则点击没反应 
  17. txtView.setText(spannableString); 

8、下划线

下划线用到的类是 UnderlineSpan

  1. SpannableString ss = new SpannableString(txUnderLine.getText()); 
  2. ss.setSpan(new UnderlineSpan(), 0, txUnderLine.getText().length(),  
  3.     SPAN_EXCLUSIVE_EXCLUSIVE); 
  4. txUnderLine.setText(ss); 

9、插入图片或者表情

SpannableString 除了可以像前面那样把文字变大变小变长变色,还可以把一部分文字变成图片,承载图片的是 Drawable 对象,而实现这个效果的就是 ImageSpan;

  1. SpannableString ss = new SpannableString(str); 
  2. ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BOTTOM); 
  3. ss.setSpan(span, 0, str.length(), SPAN_EXCLUSIVE_EXCLUSIVE); 

10、文字的上标和下标

  1. SpannableString ss = new SpannableString(txSubSuperScript.getText()); 
  2. ss.setSpan(new SuperscriptSpan(), 2, 3, SPAN_EXCLUSIVE_EXCLUSIVE); 
  3. ss.setSpan(new SubscriptSpan(), 5, 6, SPAN_EXCLUSIVE_EXCLUSIVE); 
  4. txSubSuperScript.setText(ss); 

11、超链接形式

SpannableString 支持 6 中超链接形式,分别是:电话超链接、邮件超链接、网址超链接、短信超链接、彩信超链接、地图超链接;

11.1.电话超链接

类:URLSpan,实际上6种超链接都是使用 URLSpan 构建的,只是构造函数传入的链接格式不一样, 电话超链接传入的是 tel: 开头,后面接要拨打的电话号码,点击后就会自动跳转拨打电话;

  1. SpannableString ss = new SpannableString(txTelUrl.getText()); 
  2. ss.setSpan(new URLSpan("tel:02512345678"), 0, txTelUrl.getText().length(),  
  3.     SPAN_EXCLUSIVE_EXCLUSIVE); 
  4. txTelUrl.setText(ss); 
  5. txTelUrl.setMovementMethod(LinkMovementMethod.getInstance()); 

11.2.邮件超链接

邮件超链接是以 mailto: 开头,后面接邮箱地址。点击后就会自动跳转邮件 app;

  1. SpannableString ss = new SpannableString(txMailUrl.getText()); 
  2. ss.setSpan(new URLSpan("mailto:xxx@google.com"), 0, txMailUrl.getText().length(),  
  3.     SPAN_EXCLUSIVE_EXCLUSIVE); 
  4. txMailUrl.setText(ss); 
  5. txMailUrl.setMovementMethod(LinkMovementMethod.getInstance()); 

11.3.网址超链接

网址超链接是以 http:// 或 https:// 开头,后面接网址,点击后跳转浏览器 app,同样如果有多个浏览器,需要作出选择;

  1. SpannableString ss = new SpannableString(txWebUrl.getText()); 
  2. ss.setSpan(new URLSpan("http://www.baidu.com"), 0, txWebUrl.getText().length(),  
  3.     SPAN_EXCLUSIVE_EXCLUSIVE); 
  4. txWebUrl.setText(ss); 
  5. txWebUrl.setMovementMethod(LinkMovementMethod.getInstance()); 

11.4.短信超链接

短信超链接是以 sms: 开头,后面接手机号码,点击后跳转系统短信 app;

  1. SpannableString ss = new SpannableString(txSmsUrl.getText()); 
  2. ss.setSpan(new URLSpan("sms:02512345678"), 0, txSmsUrl.getText().length(),  
  3.     SPAN_EXCLUSIVE_EXCLUSIVE); 
  4. txSmsUrl.setText(ss); 
  5. txSmsUrl.setMovementMethod(LinkMovementMethod.getInstance()); 

11.5.彩信超链接

彩信超链接是以 mms: 开头,后面接手机号码,点击跳转系统短信app;

  1. SpannableString ss = new SpannableString(txMmsUrl.getText()); 
  2. ss.setSpan(new URLSpan("mms:02512345678"), 0, txMmsUrl.getText().length(),  
  3.     SPAN_EXCLUSIVE_EXCLUSIVE); 
  4. txMmsUrl.setText(ss); 
  5. txMmsUrl.setMovementMethod(LinkMovementMethod.getInstance()); 

11.6.地图超链接

地图超链接以 geo: 开头,后面接经纬度,点击后跳转地图 app;

  1. SpannableString ss = new SpannableString(txGeoUrl.getText()); 
  2. ss.setSpan(new URLSpan("geo:30.123456,-50.024456"), 0,  
  3.     txGeoUrl.getText().length(), SPAN_EXCLUSIVE_EXCLUSIVE); 
  4. txGeoUrl.setText(ss); 
  5. txGeoUrl.setMovementMethod(LinkMovementMethod.getInstance()); 

12、添加项目符号

BulletSpan 类用于构建项目符号,第一个参数是项目符号所占的宽度,第二个参数是项目符号的颜色;

  1. SpannableString ss = new SpannableString(txBullte.getText()); 
  2. ss16.setSpan(new BulletSpan(20, Color.RED), 0, txBullte.getText().length(),  
  3.     SPAN_EXCLUSIVE_EXCLUSIVE); 
  4. txBullte.setText(ss); 

13、文字的横向和纵向拉伸

ScaleXSpan 类用于指定横向拉伸的比例,我们传 2.5 表示横向拉伸为原来的 2.5 倍;

有了横向拉伸,自然我们会想纵向拉伸,不好意思,不支持。因为纵向的高度就得用 textSize 设置;

  1. SpannableString ss = new SpannableString(txScaleX.getText()); 
  2. ss.setSpan(new ScaleXSpan(2.5f), 0, txScaleX.getText().length(),  
  3.     SPAN_EXCLUSIVE_EXCLUSIVE); 
  4. txScaleX.setText(ss); 

总结

EditText显示表情包也是SpannableString,后面我们可以做个表情包自定义控件;

一起学习加油;

本文转载自微信公众号「Android开发编程」

 

来源:Android开发编程内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯