[Android开发]富文本TextView修改部分字体颜色、大小、加粗、斜体、下划线、删除线,以及添加点击事件,插入本地或网络图片

一、主要解决的使用场景

1,UI可能会设计一段文本,部分字体跟整段文本的样式不一样,例如很多app登陆首页都需要显示用户协议和隐私政策并且需要能够点击。

2,遇到需要翻译多个国家语言的,每个国家的语言字符长度不一样,所以没办法通过字符所在字符串中的位置去设置样式(除非你为每个语言做适配)。如果采用多个TextView拼接的方式,多国语言语法不一,这将会导致语序不对,而且字符串一旦长了换行也是个问题。

二、支持功能

1、本库支持字体设置字体颜色甚至渐变色,加粗,斜体,下划线,删除线,字体大小

2、本库支持下划线支持设置线宽,距离文字距离,下划线颜色

3、本库支持删除线支持设置线宽,删除线颜色

4、本库支持设置图片,大小,左右距离,加载本地、网络图片

5、支持给每个位置的富文本添加点击事件

6、支持给每个位置的富文本设置背景色

  

三、实现原理

1,把需要设置单独样式的文本替换为变量,例如:

        我已阅读并同意《用户协议》和《隐私政策》

提取文字为:

val agreeText = "我已阅读并同意%1$s和%2$s";

2,接下啦我将会为以上两个变量赋值为 《用户协议》和《隐私政策》

        第1步,将《用户协议》《隐私政策》替换为

val str1 = "<a href=\"0\">《用户协议》</a>"    
val str2 = "<a href=\"1\">《隐私政策》</a>"    

         第2步,把 str1str2 赋值给 agreeText

 val richText = String.format(textValue, str1,str2)

这时richText已经带有html标签的字符串了

3,设置样式

//获取富文本
val spannedHtml = Html.fromHtml(richText)//富文本

val htmlBuilder = SpannableStringBuilder(spannedHtml)
//得到刚才两个文本数组了
val spans = htmlBuilder.getSpans(0, spannedHtml.length,URLSpan::class.java)
//给每个span设置样式
for (i in spans.indices) {
    val urlSpan = spans[i]
    val pos = span.url.toInt()
//  pos就是上边a标签的href设置的下标根据这个去找对应的样式
    val start = htmlBuilder.getSpanStart(urlSpan)
    val end = htmlBuilder.getSpanEnd(urlSpan)
    val flags = htmlBuilder.getSpanFlags(urlSpan)

    val clickableSpan: ClickableSpan = object : ClickableSpan() {
         override fun onClick(widget: View) {
             val url = urlSpan.url
             //回调点击事件
             onFormatClickListener?.onLabelClick(url.toInt())
             isClickSpanItem = true
         }

         override fun updateDrawState(ds: TextPaint) {
             super.updateDrawState(ds)
             //设置颜色
             if (color != 0) {
                 ds.color = resources.getColor(color)
             } else {
                 ds.color = currentTextColor
             }
             //设置是否要下划线
             ds.isUnderlineText = underline
        }
    }  
    //设置点击事件
    htmlBuilder.setSpan(clickableSpan, start, end, flags)
    //设置字体大小
    htmlBuilder.setSpan(AbsoluteSizeSpan(textSize,true), start, end, flags)
    //设置字体加粗
    htmlBuilder.setSpan(StyleSpan(Typeface.BOLD), start, end, flags)
    //设置字体斜体
    htmlBuilder.setSpan(StyleSpan(Typeface.ITALIC), start, end, flags)
}

四、结束语

        其实原理很简单,把想要设置单独样式文本提取出来替换为富文本,为每个富文本设置单独的样式

以下是项目开源地址,欢迎star~~~

https://github.com/FlyJingFish/FormatTextViewLib

使用方法:

1,设置文本和样式

textView.setFormatTextBean(R.string.test_text,
            FormatText().setColor(R.color.colorAccent).setBold(true).setUnderline(true).setItalic(true).setResValue(R.string.we).setTextSize(30),
            FormatText().setColor(R.color.colorPrimaryDark).setBold(true).setUnderline(false).setItalic(false).setStrValue("you"))

2,设置监听

textView.setOnFormatClickListener(object : OnFormatClickListener{
            override fun onLabelClick(position: Int) {//position就是设置数据的顺序
                Toast.makeText(this@MainActivity,"onItemClick-item"+position,Toast.LENGTH_SHORT).show()
            }
        })

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以通过使用 SpannableString 和 ClickableSpan 类来实现在 TextView 中设置不同字体大小、颜色和点击事件的效果。 要设置部分文字的字体大小和颜色,您可以使用 RelativeSizeSpan 和 ForegroundColorSpan。下面是一个示例代码: ```java String text = "这是一个示例文本"; SpannableString spannableString = new SpannableString(text); // 设置部分文字的字体大小 RelativeSizeSpan sizeSpan = new RelativeSizeSpan(1.5f); // 放大1.5倍 spannableString.setSpan(sizeSpan, 2, 5, Spanned.SPAN_INCLUSIVE_INCLUSIVE); // 设置第2到第5个字符的字体大小 // 设置部分文字的颜色 ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.RED); spannableString.setSpan(colorSpan, 8, 10, Spanned.SPAN_INCLUSIVE_INCLUSIVE); // 设置第8到第10个字符的颜色 TextView textView = findViewById(R.id.textView); textView.setText(spannableString); ``` 要设置部分文字的点击事件,您可以使用 ClickableSpan。下面是一个示例代码: ```java String text = "点击这里触发事件"; SpannableString spannableString = new SpannableString(text); ClickableSpan clickableSpan = new ClickableSpan() { @Override public void onClick(View widget) { // 在这里处理点击事件 Toast.makeText(MainActivity.this, "点击事件触发了", Toast.LENGTH_SHORT).show(); } }; spannableString.setSpan(clickableSpan, 2, 4, Spanned.SPAN_INCLUSIVE_INCLUSIVE); // 设置第2到第4个字符的点击事件 TextView textView = findViewById(R.id.textView); textView.setText(spannableString); textView.setMovementMethod(LinkMovementMethod.getInstance()); // 必须设置这个方法才能触发点击事件 ``` 上述代码中,我们通过创建 SpannableString 对象,然后使用 setSpan() 方法来设置不同的 Span(包括字体大小、颜色和点击事件),最后将 SpannableString 对象设置给 TextView 显示出来。 希望能帮到您!如有更多问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值