Android如何在一个TextView中设置不同字体大小、不同字体颜色封装

 更新时间:2024年07月23日 10:14:08   作者:飘杨......  
在开发过程中遇到过这样一种业务,有很多单行文本字体,字符串中每一部分的字体样式、大小、颜色都不相同,传统的做法是放多个TextView以达到效果,这篇文章主要介绍了android在一个TextView中设置不同字体大小、不同字体颜色封装,需要的朋友可以参考下

一、概述

  在开发过程中遇到过这样一种业务,有很多单行文本字体。字符串中每一部分的字体样式、大小、颜色都不相同。传统的做法是放多个TextView以达到效果。

  但是当这个页面中的这样的元素非常多,且非常复杂的时候,就会出现页面加载缓慢的问题(view加载=深度(递归)+平铺),也就是页面元素越多,层级越深加载速度越慢。

  此时如果能把本来要用四五个TextView才能完成的事情用一个TextView完成,这样就能大大提高页面加载速度。

  示例图:

二、代码示例(直接复制粘贴可用)

1.封装类:ColorSizeTextView.kt

package com.yw.custommutilimageadapter.widget
import android.content.Context
import android.graphics.Color
import android.text.SpannableString
import android.text.Spanned
import android.text.style.AbsoluteSizeSpan
import android.text.style.ForegroundColorSpan
import android.util.AttributeSet
import android.util.Log
import androidx.appcompat.widget.AppCompatTextView
import com.yw.custommutilimageadapter.R
import java.lang.StringBuilder
/**
 * 可改变字颜色和字体大小的TextView
 * 即一个字体中可以有不同的字体颜色和字体大小
 */
class ColorSizeTextView(context: Context, attrs: AttributeSet?) :
    AppCompatTextView(context, attrs) {
    init {
        val a = context.obtainStyledAttributes(attrs, R.styleable.ColorSizeTextView)
        val textColor1 = a.getColor(R.styleable.ColorSizeTextView_textColor1, Color.BLACK)
        val textSize1 = a.getDimension(R.styleable.ColorSizeTextView_textSize1, 12f)
        val textContent1 = a.getString(R.styleable.ColorSizeTextView_textContent1)
        val textColor2 = a.getColor(R.styleable.ColorSizeTextView_textColor2, Color.BLACK)
        val textSize2 = a.getDimension(R.styleable.ColorSizeTextView_textSize2, 12f)
        val textContent2 = a.getString(R.styleable.ColorSizeTextView_textContent2)
        val textColor3 = a.getColor(R.styleable.ColorSizeTextView_textColor3, Color.BLACK)
        val textSize3 = a.getDimension(R.styleable.ColorSizeTextView_textSize3, 12f)
        val textContent3 = a.getString(R.styleable.ColorSizeTextView_textContent3)
        val isLayout = a.getBoolean(R.styleable.ColorSizeTextView_isLayout, false)
        Log.e("ColorSizeTextView:", "$textSize1,$textSize2,$textSize3")
        if (isLayout) {
            // 创建一个SpannableString对象
            val spannableString = SpannableString("$textContent1$textContent2$textContent3")
            // 设置第一部分文本的字体大小和颜色
            spannableString.setSpan(
                AbsoluteSizeSpan(textSize1.toInt()),
                0,
                textContent1?.length!!,
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
            )
            spannableString.setSpan(
                ForegroundColorSpan(textColor1),
                0,
                textContent1?.length!!,
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
            )
            //设置第二部分文本的字体大小和颜色
            spannableString.setSpan(
                AbsoluteSizeSpan(textSize2.toInt()),
                textContent1.length,
                textContent1.length + textContent2?.length!!,
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
            )
            spannableString.setSpan(
                ForegroundColorSpan(textColor2),
                textContent1.length,
                textContent1.length + textContent2.length,
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
            )
            //设置第三部分文本的字体大小和颜色
            spannableString.setSpan(
                AbsoluteSizeSpan(textSize3.toInt()),
                textContent1.length + textContent2.length,
                spannableString.length,
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
            )
            spannableString.setSpan(
                ForegroundColorSpan(textColor3),
                textContent1.length + textContent2.length,
                spannableString.length,
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
            )
            text = spannableString
            a.recycle()
        }
    }
    fun setSizeColorData(datas: ArrayList<ColorSizeData>) {
        val sbContent = StringBuilder()
        datas.forEachIndexed { index, colorSizeData ->
            sbContent.append(colorSizeData.content)
        }
        // 创建一个SpannableString对象
        val spannableString = SpannableString(sbContent.toString())
        var startIndex = 0
        var endIndex = 0
//        for (index in 0 until datas.size) {
//            endIndex += datas[index].content?.length!!
//            if (index > 0) {
//                startIndex += datas[index - 1].content?.length!!
//            }
//            Log.e("ColorSizeTextView:", "$startIndex,$endIndex")
//        }
        for (index in 0 until datas.size) {
            endIndex += datas[index].content?.length!!
            if (index > 0) {
                startIndex += datas[index - 1].content?.length!!
            }
            Log.e("ColorSizeTextView:", "$startIndex,$endIndex")
            Log.e("ColorSizeTextView---size:", "${datas[index].textSize}")
            // 设置第一部分文本的字体大小和颜色
            spannableString.setSpan(
                AbsoluteSizeSpan(datas[index].textSize),
                startIndex,
                endIndex,
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
            )
            spannableString.setSpan(
                ForegroundColorSpan(datas[index].textColor),
                startIndex,
                endIndex,
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
            )
        }
        text = spannableString
    }
    class ColorSizeData(
        var textColor: Int,
        var textSize: Int,
        var content: String?
    )
}

2.用法

tvContent.setSizeColorData(ArrayList<ColorSizeTextView.ColorSizeData>().apply {
            add(
                ColorSizeTextView.ColorSizeData(
                    Color.parseColor("#3700B3"),
                    PxUtils.sp2px(this@TextViewDifferentColorAndSizeActivity,14f),
                    "德玛西亚啊"
                )
            )
            add(
                ColorSizeTextView.ColorSizeData(
                    Color.parseColor("#FF7201"),
                    PxUtils.sp2px(this@TextViewDifferentColorAndSizeActivity,12f),
                    "诺克萨斯33333333333333333"
                )
            )
            add(
                ColorSizeTextView.ColorSizeData(
                    Color.parseColor("#333333"),
                    PxUtils.sp2px(this@TextViewDifferentColorAndSizeActivity,10f),
                    "光辉女郎寒冰射手牛逼库拉斯"
                )
            )
        })

到此这篇关于android在一个TextView中设置不同字体大小、不同字体颜色封装的文章就介绍到这了,更多相关android TextView设置不同字体大小内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 利用Flutter制作一个会飞的菜单

    利用Flutter制作一个会飞的菜单

    flutter中自带了drawer组件,可以实现通用的菜单功能,所以本文将尝试一下通过自定义动画来实现一个会飞的菜单,感兴趣的可以了解一下
    2023-06-06
  • 详解dex优化对Arouter查找路径的影响

    详解dex优化对Arouter查找路径的影响

    dex简单说就是优化后的android版.exe。每个apk安装包里都有。相对于PC上的java虚拟机能运行.class,android上的Davlik虚拟机能运行.dex。本文将着重介绍dex优化对Arouter查找路径的影响
    2021-06-06
  • Android页面中可编辑与不可编辑切换的实现

    Android页面中可编辑与不可编辑切换的实现

    这篇文章主要给大家介绍了关于在Android页面中可编辑与不可编辑切换的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • Android中Glide实现超简单的图片下载功能

    Android中Glide实现超简单的图片下载功能

    本篇文章主要介绍了Android中Glide实现超简单的图片下载功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • 获取Android签名MD5的方式实例详解

    获取Android签名MD5的方式实例详解

    平时开发,很多第三方需要配置应用签名,比如百度,高德地图等,下面这篇文章主要给大家介绍了关于获取Android签名MD5的方式,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • Templates实战之更优雅实现自定义View构造方法详解

    Templates实战之更优雅实现自定义View构造方法详解

    本篇文章介绍如何利用Android Studio提供的Live Templates更优雅实现自定义View的构造方法,说句人话就是:简化自定义View构造参数模板代码的编写,实现自动生成,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Android Studio中导入JNI生成的.so库的实现方法

    Android Studio中导入JNI生成的.so库的实现方法

    这篇文章主要介绍了Android Studio中导入JNI生成的.so库的实现方法的相关资料,这里不仅提供实现方案并提供了实现的方法,需要的朋友可以参考下
    2017-07-07
  • Flutter应用程序实现隐私屏幕示例解析

    Flutter应用程序实现隐私屏幕示例解析

    这篇文章主要为大家介绍了Flutter应用程序实现隐私屏幕示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Android组件之BroadcastReceiver广播接收者

    Android组件之BroadcastReceiver广播接收者

    这篇文章主要为大家介绍了Android组件之BroadcastReceiver广播接收者实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Android 源码浅析RecyclerView ItemAnimator

    Android 源码浅析RecyclerView ItemAnimator

    这篇文章主要为大家介绍了Android 源码浅析RecyclerView ItemAnimator,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12

最新评论