自学内容网 自学内容网

修改Textview中第一个字的字体,避免某些机型人民币¥不显示

 在 Android 中,系统提供了三种常用的字体类型,分别是:

  1. Serif(衬线字体):

    • 这种字体有明显的衬线或笔画末端装饰,通常用于印刷品和书籍,给人一种正式和优雅的感觉。
    • 示例:Typeface.SERIF
  2. Sans Serif(无衬线字体):

    • 这种字体没有衬线,线条更简单、更干净,通常用于数字界面,因其可读性较高而被广泛使用。
    • 示例:Typeface.SANS_SERIF
  3. Monospace(等宽字体):

    • 在这种字体中,每个字符占据相同的水平空间,通常用于代码编辑器、终端窗口和计算机编程,因为它可以让对齐代码变得更加容易。
    • 示例:Typeface.MONOSPACE

默认字体通常是 Sans Serif 。部分设备默认字体无法显示人民币¥的符号(即使使用半角)

此时尝试修改字体,使得符号能够展现

val text = "¥9.0元"
if (Build.MODEL == "xxx"){
    mTv.text = TypefaceChangeUtils().getTypefaceText(text, 0, 1, Typeface.MONOSPACE)
}else{
    mTv.text = text
}


import android.graphics.Typeface
import android.text.Spannable
import android.text.SpannableStringBuilder
import android.text.TextPaint
import android.text.style.MetricAffectingSpan

class TypefaceChangeUtils {

    fun getTypefaceText(text: CharSequence, start: Int, end: Int, typeface: Typeface) : CharSequence{
        if (text.isNullOrBlank()){
            return SpannableStringBuilder("")
        }else if (start < 0 || end > text.length || start > end){
            return SpannableStringBuilder("")
        }

        // 创建 SpannableStringBuilder
        val builder = SpannableStringBuilder(text)
        // 将第一个字符设置为 Monospace 字体
        // Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 表示当改变文本时,该样式不会向前或向后扩展。
        builder.setSpan(object : MetricAffectingSpan() {
            override fun updateDrawState(tp: TextPaint) {
                tp.typeface = typeface
            }

            override fun updateMeasureState(paint: TextPaint) {
                paint.typeface = typeface
            }
        }, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

        return builder
    }

}


原文地址:https://blog.csdn.net/vistaup/article/details/144142274

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!