当前位置: 首页 > news >正文

安卓Q以下自定义文字的字体

前言:安卓系统默认的字体在显示文字时,如果文字内容中有中文符号,比如中文的双引号“”,会显示的不够醒目,如图1:

如果想将这些符号用更加醒目的字体比如“宋体”来显示,如图2:

对于安卓Q及其以上系统,直接使用原生的类即可。

而对于5.0(21 sdk)等低版本系统,就得自己想办法写代码来“曲线救国”了。

方法如下:

1. 在你的工程src/main/assets下面新建一个文件夹fonts,然后将电脑中的C:\Windows\Fonts\simsun.ttc拷贝到fonts下面。

2. 附上代码 :

import android.text.TextPaint;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.TypefaceSpan;
import android.graphics.Paint;
import android.graphics.Typeface;

	// 添加自定义TypefaceSpan类来正确处理自定义字体
	private static class CustomTypefaceSpan extends TypefaceSpan {
		private final Typeface newType;

		public CustomTypefaceSpan(Typeface type) {
			super("");
			newType = type;
		}

		@Override
		public void updateDrawState(TextPaint ds) {
			applyCustomTypeFace(ds, newType);
		}

		@Override
		public void updateMeasureState(TextPaint paint) {
			applyCustomTypeFace(paint, newType);
		}

		private static void applyCustomTypeFace(Paint paint, Typeface tf) {
			int oldStyle;
			Typeface old = paint.getTypeface();
			if (old == null) {
				oldStyle = 0;
			} else {
				oldStyle = old.getStyle();
			}

			int fake = oldStyle & ~tf.getStyle();
			if ((fake & Typeface.BOLD) != 0) {
				paint.setFakeBoldText(true);
			}

			if ((fake & Typeface.ITALIC) != 0) {
				paint.setTextSkewX(-0.25f);
			}

			paint.setTypeface(tf);
		}
	}

    private void showSongTiText(TextView tv, String text) {
        runOnUiThread(() -> {
            if (text == null) {
                tv.setText("");
                return;
            }

            // 使用 SpannableString 来处理部分字体样式
            SpannableString spannableString = new SpannableString(text);

            // 创建自定义字体
            Typeface customTypeface = null;
            try {
                // 尝试从assets加载中文字体文件(如果有的话)
                customTypeface = Typeface.createFromAsset(getAssets(), "fonts/simsun.ttc");
            } catch (Exception e) {
                LogUtil.error(TAG, "字体加载失败:" + e.getMessage());
                // 回退到系统serif字体
                customTypeface = Typeface.create(Typeface.SERIF, Typeface.NORMAL);
            }

            // 查找所有中文引号并设置样式
            if (customTypeface != null) {
                final Typeface finalTypeface = customTypeface;

                // 查找左引号
                String leftQuote = "“";
                int leftIndex = text.indexOf(leftQuote);
                while (leftIndex != -1) {
                    // 为左引号设置样式
                    spannableString.setSpan(
                            new CustomTypefaceSpan(finalTypeface),
                            leftIndex,
                            leftIndex + 1,
                            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
                    );

                    // 继续查找下一个左引号
                    leftIndex = text.indexOf(leftQuote, leftIndex + 1);
                }

                // 查找右引号
                String rightQuote = "”";
                int rightIndex = text.indexOf(rightQuote);
                while (rightIndex != -1) {
                    // 为右引号设置样式
                    spannableString.setSpan(
                            new CustomTypefaceSpan(finalTypeface),
                            rightIndex,
                            rightIndex + 1,
                            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
                    );

                    // 继续查找下一个右引号
                    rightIndex = text.indexOf(rightQuote, rightIndex + 1);
                }
            }

//            tv.setText(text);
            tv.setText(spannableString);
        });
    }

注:以上代码可能有未导入的类,你直接Alt+Enter导入一下即可。

相关文章:

  • LVGL Dropdown和Calendar详解
  • 机器学习 第一章 绪论
  • 算法 | 蜣螂优化算法(DBO)在无人机路径规划中的应用(附matlab源码)
  • 单机快速部署开源、免费的分布式任务调度系统——DolphinScheduler
  • VuePress 和 Docusaurus的对比
  • C# System.Net.IPAddress 使用详解
  • docker的与使用
  • TLC vs QLC六大关键差异【续】
  • 简单粗暴,用浏览器调试端口绕过Selenium/Playwright/Puppeteer检测
  • 数据结构【链表】
  • 冒泡排序:经典算法的深度解析与TypeScript实现
  • NullByte: 1靶场渗透
  • 时间步长的概念与选择-瞬态
  • 【Android】View动画—XML动画、帧动画
  • PQ以及有关索引的笔记Faiss: The Missing Manual
  • FPGA_AXI仿真回环(一)
  • 新专栏预告 《AI大模型应知应会短平快系列100篇》 - 整体规划设计
  • 人工智能在医疗领域的前沿应用与挑战
  • 2d rectilinear 网格点降采样算法复现
  • 文件包含绕过的小点总结(2)