SpanableString 一些常用方法的使用记录

最近登录页要给个什么隐私政策的提示,蓝白下滑线混合在一起,因为不想写几个TextView(主要是单个TextView会换行不好看),所以用了SpannableString,顺便就跑来这里记录一下一些比较常用的实现

后续操作都是在这个基本代码的基础上写的

TextView tvMessage = (TextView) findViewById(R.id.tvMessage);
SpannableString rawStr = new SpannableString("建议QQ删除好友时给对方通知");
//一些对rawStr的设置以后
tvMessage.setText(rawStr);

 

 

设置字体颜色

rawStr.setSpan(new ForegroundColorSpan(ContextCompat.getColor(this, R.color.red)), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果图

 

 

设置背景颜色

rawStr.setSpan(new BackgroundColorSpan(ContextCompat.getColor(this, R.color.red)), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果图

 

 

设置字体,官方注释是这几个"monospace", "serif", "sans-serif" 但我试了都没有效果,不知道是哪里的问题

rawStr.setSpan(new TypefaceSpan("sans-serif"), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果图

没有,压根没变化

 

 

设置字体大小,绝对值,其中第二个参数 true为dp值,false为像素值,如果不传,则默认像素值

rawStr.setSpan(new AbsoluteSizeSpan(20, false), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果图

 

 

设置字体大小,相对值,2f表示默认字体大小的两倍,一般我们默认的都是14sp

rawStr.setSpan(new RelativeSizeSpan(2f), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果图

 

 

设置字体大小,相对值,缩放X值,2f表示默认字体大小宽度的两倍,一般变宽了字体也会变大,但没有RelativeSizeSpan这么有规律

rawStr.setSpan(new ScaleXSpan(2f), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果图

 

 

设置字体样式 正常

rawStr.setSpan(new StyleSpan(Typeface.NORMAL), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果图

没有

 

 

设置字体样式 粗体

rawStr.setSpan(new StyleSpan(Typeface.BOLD), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果图

 

 

设置字体样式 斜体

rawStr.setSpan(new StyleSpan(Typeface.ITALIC), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果图

 

 

设置字体样式 粗斜体

rawStr.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果图

 

 

设置字体样式,真正意义上的样式。。。
后面两个null是颜色变化和link颜色的,快速看了一下源码没看懂,后面有时间再补,主要是我一直都传的null。。。

rawStr.setSpan(new TextAppearanceSpan("monospace", Typeface.BOLD, 40, null, null), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果图

 

 

设置下划线

rawStr.setSpan(new UnderlineSpan(), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果图

 

 

设置删除线

rawStr.setSpan(new StrikethroughSpan(), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果图

 

 

设置上角标,就是把字体往上平移,如果要用,记得用设置字体大小缩小一半以上

rawStr.setSpan(new SuperscriptSpan(), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果图

 

 

设置下角标,就是把字体往下平移,如果要用,记得用设置字体大小缩小一半以上

rawStr.setSpan(new SubscriptSpan(), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果图

 

 

设置超链,电话号码,要配合TextView的setMovementMethod一起使用才会响应点击事件,出来的效果就是点击后跳转到拨号界面,号码为tel:后面部分, 如果想修改字体样式,建议使用clickableSpan

rawStr.setSpan(new URLSpan("tel:10086"), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvMessage.setMovementMethod(LinkMovementMethod.getInstance());

效果图

 

 

设置超链,邮件,要配合TextView的setMovementMethod一起使用才会响应点击事件,出来的效果就是点击后跳转到发邮件界面,收件人为mailto:后面部分, 如果想修改字体样式,建议使用clickableSpan

rawStr.setSpan(new URLSpan("mailto:123456789@qq.com"), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvMessage.setMovementMethod(LinkMovementMethod.getInstance());

效果图

 

 

设置超链,网页,要配合TextView的setMovementMethod一起使用才会响应点击事件,出来的效果是点击后弹出让选择浏览器,打开浏览器就是指定的网址,一定要加上http://或者https://,如果想修改字体样式,建议使用clickableSpan

rawStr.setSpan(new URLSpan("http://www.baidu.com"), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvMessage.setMovementMethod(LinkMovementMethod.getInstance());

效果图

 

 

设置超链,短信,要配合TextView的setMovementMethod一起使用才会响应点击事件,出来效果是点击后跳转到编辑短信界面,收件人是sms:后面的号码,如果想修改字体样式,建议使用clickableSpan

rawStr.setSpan(new URLSpan("sms:10086"), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvMessage.setMovementMethod(LinkMovementMethod.getInstance());

效果图

 

 

设置超链,彩信,要配合TextView的setMovementMethod一起使用才会响应点击事件,出来的效果是点击后一般还是跳转到短信编辑界面,因为现在基本是短信彩信一起了,收件人是mms:后面的号码,如果想修改字体样式,建议使用clickableSpan

rawStr.setSpan(new URLSpan("mms:10086"), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvMessage.setMovementMethod(LinkMovementMethod.getInstance());

效果图

 

 

设置超链,地图,要配合TextView的setMovementMethod一起使用才会响应点击事件,出来的效果是点击后跳转到默认地图软件,注意传的是标准GPS坐标,不过软件一般会自动转成对应地图的经纬度,无需额外处理,如果想修改字体样式,建议使用clickableSpan

rawStr.setSpan(new URLSpan("geo:22.53125695006,114.0736434700"), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvMessage.setMovementMethod(LinkMovementMethod.getInstance());

效果图

 

 

设置图片

Drawable drawable = ContextCompat.getDrawable(this, R.drawable.ic_launcher_foreground);
int drawHeight = drawable.getMinimumHeight();//获取图片建议的最小高度
int drawWidth = drawable.getMinimumWidth();//获取图片建议的最小宽度
drawable.setBounds(0, 0, drawWidth, drawHeight);//限制在这个范围里,主要为了好看一点点
rawStr.setSpan(new ImageSpan(drawable), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果图

 

 

设置部分字体点击事件,前面说到建议用这个的,就是直接写点击事件,然后事件实现我们自己写,这个的好处就是可以改样式,还是要配置setMovementMethod使用

rawStr.setSpan(new ClickableSpan() {
    @Override
    public void onClick(@NonNull View widget) {
        //要实现的点击事件
    }

    @Override
    public void updateDrawState(@NonNull TextPaint ds){
        //在这里改变样式
        ds.setUnderlineText(false);//设置不要下划线,默认有
        ds.setColor(ContextCompat.getColor(SpannableStringLearningView.this,             R.color.blue));//设置蓝色
    }
}, 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvMessage.setMovementMethod(LinkMovementMethod.getInstance());

效果图

 

 

如果想点击后不显示背景的高光,可以设置背景高光为透明

tvMessage.setHighlightColor(ContextCompat.getColor(this, R.color.transparent));

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpannableStringBuilder可以用于自定义字重。通过使用setSpan方法,可以将自定义的字重样式应用于SpannableStringBuilder中的特定文本范围。具体来说,可以使用StyleSpan类来设置字重样式。例如,可以使用StyleSpan(Typeface.BOLD)来设置文本为粗体。下面是一个示例代码: ```java SpannableStringBuilder builder = new SpannableStringBuilder("Hello World"); StyleSpan boldSpan = new StyleSpan(Typeface.BOLD); builder.setSpan(boldSpan, 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); ``` 在上面的代码中,我们创建了一个SpannableStringBuilder对象,并将其初始化为"Hello World"。然后,我们创建了一个StyleSpan对象,将其设置为粗体样式。最后,我们使用setSpan方法将boldSpan应用于文本的前5个字符。这样,"Hello"这个单词就会以粗体显示。 希望这个例子能帮助你理解如何使用SpannableStringBuilder来自定义字重。 #### 引用[.reference_title] - *1* [Android花样Text设置神器之SpanableString](https://blog.csdn.net/xieluoxixi/article/details/77149255)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [EditText控件的使用续:Editor实现类SpannableStringBuilder实现的Spanned和Spannable接口方法](https://blog.csdn.net/vqqYuAn/article/details/44618205)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Android 富文本 SpannableStringBuilder 探究](https://blog.csdn.net/X_sunmmer/article/details/131301718)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值