Android 分别使用Java和Kotlin给Textview设置第三方字体、APP全局字体、 Android X字体设置

news2024/10/6 12:35:55

前言

本文介绍Android实现全局设置自定义字体和局部设置自定义字体即单个TextView设置字体,同时也提供了一些优秀的三方字体框架,基本可以满足开发者对字体设置的全部要求。


使用自定义字体前后效果图 在这里插入图片描述

一、assets是什么?

首先需要了解Android之assets 简而言之,你的图片、svg文件放在工程的res/drawabe下,则设置字体用到的字体文件则位于assets下面。 如何创建assets目录、点击进入

二、APP全局字体

2.1.引入库

代码如下(示例):

//用以设置App全局字体
implementation 'uk.co.chrisjenx:calligraphy:2.2.0'

2.2.在Application中初始化calligraphy

代码如下(示例):

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
        //app字体
        CalligraphyConfig.initDefault(
                new CalligraphyConfig.Builder()
                        .setDefaultFontPath("fonts/OpenSans-Regular.ttf")
                        .setFontAttrId(R.attr.fontPath)
                        .build()
        );
​
    }
    public static LightMeterApplication getInstance() {
        return instance;
    }
}

在AndroidManifest.xml配置自定义MyApplication以替代默认Application

    <application
        android:name=".MyApplication"
        android:allowBackup="false"
        android:hardwareAccelerated="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">

下面是我的字体目录

在这里插入图片描述

下载字体,点击进入提取码:2555 你也可以导入Windows自带字体, 字体路径:C:\Windows\Fonts 我的Win10自带263种字体文件,下面是字体文件截图

字体

2.3.让指定的Activity配置自定义字体

重写attachBaseContext

2.3.1 Java设置

    //不重写的Activity还是安卓默认字体
    @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
    }

2.3.2 kotlin设置

override fun attachBaseContext(newBase: Context) {
    super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase))
}

2.4 Android Q 以及 Android X 开发环境报错

如果你的项目升级了AndroidX环境以及 android Q 上调试时则会报以下错误

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.bigcat.edulearnaid, PID: 21204
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.bigcat.edulearnaid/com.bigcat.edulearnaid.ui.StartActivity}: android.view.InflateException: Binary XML file line #17 in com.bigcat.edulearnaid:layout/abc_screen_simple: Binary XML file line #17 in com.bigcat.edulearnaid:layout/abc_screen_simple: Error inflating class androidx.appcompat.widget.FitWindowsLinearLayout
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3895)

解决方法:

在项目build.gradle中添加如下依赖替代 uk.co.chrisjenx:calligraphy:2.2.0

implementation 'io.github.inflationx:calligraphy3:3.1.1'
implementation 'io.github.inflationx:viewpump:2.0.3'

Application的onCreate()中初始化:

2.4.1 java设置

ViewPump.init(ViewPump.builder()
            .addInterceptor(new CalligraphyInterceptor(
                new CalligraphyConfig.Builder()
                    .setDefaultFontPath("你的字体")
                    .setFontAttrId(R.attr.fontPath)
                    .build()))
                .build());

2.4.2 Kotlin设置

ViewPump.init(
    ViewPump.builder()
        .addInterceptor(
            CalligraphyInterceptor(
                CalligraphyConfig.Builder()
                    .setDefaultFontPath("你的字体")
                    .setFontAttrId(R.attr.fontPath)
                    .build()
            )
        )
        .build()
)

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(ViewPumpContextWrapper.wrap(newBase));
}

2.5 利用主题修改全局字体

在 application 中,通过 android:theme 来配置一个 App 的主题。一般新创建的项目,都是 @style/AppTheme 。在其中追加关于字体的属性 android:fontFamily,它就可以完成对全局设置一个系统字体。

77e134250ffbee8855a9fd6677ca6217

三、单个TextView设置字体

和设置全局字体不同的是无需配置Application,无需引入依赖库calligraphy,仍需配置字体路径,使用下面的方法完成字体设置

3.1 使用Typeface + .ttf实现

3.1.1 java

protected Typeface tfRegular;//定义字体
{
    tfRegular = Typeface.createFromAsset(getActivity().getAssets(), "fonts/OpenSans-Regular.ttf");//初始化字体
    textView.setTypeface(tfRegular);
}

3.1.2 kotlin

protected var tfRegular: Typeface? = null // 定义字体
    get() = field ?: Typeface.createFromAsset(requireActivity().assets, "fonts/OpenSans-Regular.ttf") // 初始化字体
​
textView.typeface = tfRegular // 设置字体

3.2 使用SDK自带字体

noraml (普通字体,系统默认使用的字体) sans(非衬线字体) serif (衬线字体) monospace(等宽字体)

3.2.1 通过xml实现

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="580.6Ix"
    android:gravity="center"
    android:textStyle="bold"   
    android:textSize="20sp"
    android:typeface="serif"
    android:textColor="@color/white"/>
    <!--  android:textStyle="bold"字体加粗   -->
    <!--  android:letterSpacing="0.2" 字体增加间距   -->
    <!--  android:typeface="serif" 设置SDK自带字体   -->

3.2.2 通过Java逻辑代码实现

    vSansText = (TextView) findViewById(R.id.sans);
    vSerifText = (TextView) findViewById(R.id.serif);
    vMonospaceText = (TextView) findViewById(R.id.monospace);
 
    //设置字体样式
    vSansText.setTypeface(Typeface.SANS_SERIF);
    vSerifText.setTypeface(Typeface.SERIF);
    vMonospaceText.setTypeface(Typeface.MONOSPACE);

3.2.3 通过kotlin逻辑代码实现

vSansText = findViewById(R.id.sans)
vSerifText = findViewById(R.id.serif)
vMonospaceText = findViewById(R.id.monospace)
​
// 设置字体样式
vSansText.typeface = Typeface.SANS_SERIF
vSerifText.typeface = Typeface.SERIF
vMonospaceText.typeface = Typeface.MONOSPACE

3.3 使用RoBoto在xml设置字体

通过xml实现自定义设置字体的还包括RoBoto,Android4.0后默认字体就使用了Roboto,想要了解更多关于 Robote 的内容,可以去 Google 的网站上查看。下面介绍一下使用方法:

3.3.1 xml中使用 android:fontFamily

android:fontFamily="sans-serif" // roboto regular  
android:fontFamily="sans-serif-light" // roboto light  
android:fontFamily="sans-serif-condensed" // roboto condensed  
android:fontFamily="sans-serif-thin" // roboto thin (android 4.2)  
//in combination with  
android:textStyle="normal|bold|italic"

normal 和 sans 的字体其实是一样的,serif 是一个带衬线的字体,而 nonospace 是等宽字体。

serif 在默认的字体上,增加了衬线。而 nonospace 限制了每个字符的宽度,让它们达到一个等宽的效果。

7daad603fc351616025e805bf7038ef5

3.3.2 fontFamily参数属性

字体属性特征
Regular标准字体
Italic字体倾斜
Bold字体加粗
Bold-italic加粗和倾斜
Light无衬线体字体
Light-italic无衬线斜体
Thin细体
Thin-italic细斜体
Condensed regular用于文本装潢、信息展示、网页设计、篆刻制模[cr]
Condensed italic斜体版cr
Condensed bold粗体版cr
Condensed bold-italic粗斜体版cr

3.3.3 fontFamily加载font资源包下的字体

1.将下载好的字体放到如下文件中

img

2.在xml中引用

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fontFamily="@font/anyeguihuapiaoxiang"
    android:text="设置单个TextView的字体-通过font资源文件" />

需要注意的是,如果同时配置了 typefacefontFamily ,将使用 fontFamily 配置的字体。

3.4 textStyle

textStyle 主要用于设定一些字体的样式,它是对所有的字体都生效的。也就是说哪怕你替换了字体,依然可以使用 textStyle 来修饰它的样式。textStyle 本身支持的可选项有 normal|bold|italic,它们也非常的好理解,就是普通|粗体|斜体

3.4.1 xml中使用

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="设置单个TextView的字体-textStyle"
    android:textStyle="bold|italic" />

3.5 Andorid 8.0+ 在资源中定义使用字体

1.右键单击res文件夹,然后转到“新建”>“Android资源目录”。此时会出现“新建资源目录”窗口。

2.在“资源类型”列表中,选择字体,然后单击“确定”。

3.将字体文件添加到字体文件夹中。

4.双击字体文件可以在编辑器中预览文件的字体。

这四步就是创建一个font资源文件,把下载好的字体放到文件中

3.5.1 创建字体

1.右键单击字体文件夹,然后转到“New”>“Font resource文件”。此时将显示“新建资源文件”窗口。

2.输入文件名,然后单击“确定”。新的字体资源XML将在编辑器中打开。

3.将每个字体文件、样式和权重属性封装在<font>元素中。以下XML说明了在字体资源XML中添加与字体相关的属性:

<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android">
    <font
        android:fontStyle="normal"
        android:fontWeight="400"
        android:font="@font/lobster_regular" />
    <font
        android:fontStyle="italic"
        android:fontWeight="400"
        android:font="@font/lobster_italic" />
</font-family>

3.5.2 在TextView中使用

在布局XML文件中,将fontFamily属性设置为要访问的字体文件。

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:fontFamily="@font/lobster"/>

3.5.3 动态调用

Typeface typeface = ResourcesCompat.getFont(context, R.font.lobster);

更多

四、优秀的个性化字体功能框架

4.1 通过Spannables设置文本样式

BabushkaText ★659 -

4.2 使关键词带有可点击的下划线TextView

UnderLineLinkTextView ★327 -

4.3 用手势缩放字体大小

PinchZoomTextView ★272 -

4.4 用颜色标记一些短语

ColorTextView ★214 -

五、参考

参考1

参考2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/768753.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【11】STM32·HAL库开发-STM32CubeMX简介、安装 | 新建STM32CubeMX工程步骤

目录 1.STM32CubeMX简介&#xff08;了解&#xff09;2.STM32CubeMX安装&#xff08;了解&#xff09;2.1STM32CubeMX软件获取2.1.1获取Java软件2.1.2获取STM32CubeMX软件 2.2搭建Java运行环境2.3安装STM32CubeMX软件&#xff08;必须先2.2再2.3&#xff09;2.4下载和关联STM32…

若依cloud(RuoYi-Cloud)新增业务模块和功能模块增删改查演示

前言 看了几篇文章感觉都不太满意&#xff0c;索性自己来写一篇。 一、后端 后端新建业务模块流程大致如下&#xff1a; 1、后端新建一个&#xff08;在ruoyi-module模块下&#xff09;业务模块&#xff0c;仿照已有的模块将此模块配置好&#xff0c;例如仿照系统模块&…

6、PHP语法要点(1)

PHP的语法跟C语言还是类似的。 1、变量不用定义即可直接使用。 2、函数外定义的变量为全局变量。global 关键字用于函数内访问全局变量。 3、static 用于保持函数内局部变量的值。但在函数外依然不能访问。 4、PHP 将所有全局变量存储在一个名为 $GLOBALS[index] 的数组中。…

GptFu0k——ChatGpt连接源爬取器

最近ChatGPT的热度下去了&#xff0c;但是我相信&#xff0c;很多真正需要的人还是一直在用的&#xff0c;为了解决ChatGPT账号的问题还有网络连接问题&#xff0c;通常会花费大量时间去寻找&#xff0c;为了解决这个棘手的问题&#xff0c;GptFu0k横空出世&#xff0c;全网爬取…

提高LLaMA-7B的数学推理能力

概述 这篇文章探讨了利用多视角微调方法提高数学推理的泛化能力。数学推理在相对较小的语言模型中仍然是一个挑战&#xff0c;许多现有方法倾向于依赖庞大但效率低下的大语言模型进行知识蒸馏。研究人员提出了一种避免过度依赖大语言模型的新方法&#xff0c;该方法通过有效利…

Ctfshow Crypto全

目录 各种各样的编码 crypto0(凯撒) crypto2(jsfuck) crypto3(aaencode) crypto4(知p q e求d) crypto5(知p q e c求d) crypto6(Rabbit) crypto7(Ook!) crypto8(BrainFuck) crypto9(serpent) crypto10(quoted-printable) crypto11(md5) crypto12(埃特巴什码) cryp…

AI Chat 设计模式:8. 门面(外观)模式

本文是该系列的第八篇&#xff0c;采用问答式的方式展开&#xff0c;问题由我提出&#xff0c;答案由 Chat AI 作出&#xff0c;灰色背景的文字则主要是我的一些思考和补充。 问题列表 Q.1 请介绍一下门面模式A.1Q.2 该模式由哪些角色组成呢A.2Q.3 举一个门面模式的例子A.3Q.4…

vue的computed复习

1.复杂 data 的处理方式 三个案例&#xff1a;  案例一&#xff1a;我们有两个变量&#xff1a; firstName 和 lastName &#xff0c;希望它们拼接之后在界面上显示&#xff1b;  案例二&#xff1a;我们有一个分数&#xff1a; score  当 score 大于 60 的时候&#xf…

云拨测全面升级丨单次拨测低至 0.001 元

作者&#xff1a;少焉 随着云原生、微服务技术的发展&#xff0c;可观测需求变得越来越强烈&#xff0c;作为可观测技术的重要能力之一&#xff0c;云拨测&#xff08;Synthetics Monitor&#xff09;由于其零侵入、开箱即用、主动式监测手段&#xff0c;也受到很多用户的青睐…

arcgis建筑物平均高度

主要用到相交和属性表的汇总功能。 路网 建筑物栋 相交结果 右键&#xff0c;bh列汇总 原始块有392&#xff0c;这里只有389&#xff0c;说明有的地块没有建筑&#xff0c;所以应该将表连接到原始街区上检查是否合理&#xff0c;以及随机验证一个结果是否正确。 连接结果&…

【问题总结】基于docker-compose实现nginx转发redis

目录&#xff1a; 文章目录 需求简介&#xff1a;Q1: nginx的http模块和http模块有什么不同Q2: 可以都使用stream模块进行配置吗 Docker环境下如何转发1 修改docker-compose2 修改nginx.conf3 测试连接 需求简介&#xff1a; 需要在192.168.3.11的ngnix上&#xff0c;转发192.…

wordpress 导入数据后 为什么总是跳转到安装页面

在WordPress导入数据后跳转到安装页面的问题可能由以下原因引起&#xff1a; 数据库连接问题&#xff1a;在导入数据之前&#xff0c;确保您的WordPress配置文件中的数据库连接信息正确且完整。打开 wp-config.php 文件&#xff0c;确保数据库的名称、用户名、密码和主机信息是…

springboot整合spring security的简单入门案例

一 工程结构 二 配置操作 2.1 pom文件配置 <!-- Spring Security依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency> 2.2 config配置 Config…

vue中预览pdf

情况一 如果后端返回的pdf地址&#xff0c;粘贴到浏览器的url框中&#xff0c;可以在浏览器中直接进行预览的&#xff0c;那么我们就用window.open&#xff0c;或 a标签&#xff0c;或iframe标签通过设置src进行预览即可 法1&#xff1a;可以直接使用window.open&#xff08;…

css学习知识总结

一、css与html连接&#xff1a; 可以将css语句放在html内部&#xff0c;一般放在<head>之下&#xff0c;定义在<style>中&#xff0c;格式一般是一个“.”然后加上一个“名称”再加上一个“{}”&#xff0c;再在“{}”内部定义具体的语句。 二、调整元素 2.1 字体…

网络 socket

文章目录 概念和 TCP、UDP 区别和 HTTP 区别 概念 为网络通信提供的接口&#xff0c;定义了应用程序如何访问网络资源、如何发送和接收数据等&#xff0c;Socket 是一个包含了IP地址和端口号的组合&#xff0c;当一个应用程序想要与另一个应用程序通信时&#xff0c;它会向特定…

6.3.5 利用Wireshark进行协议分析(五)----捕获并分析ICMP报文

6.3.5 利用Wireshark进行协议分析&#xff08;五&#xff09;----捕获并分析ICMP报文 一、捕获ICMP报文 打开Wireshark&#xff0c;选择网络接口并点击开始按钮。分组列表面板不断刷新抓渠道的数据包&#xff0c;为了过滤出我们所要分析的ICMP报文&#xff0c;我们在过滤框中输…

线程池学习(六)线程池状态转化

线程池状态定义 // runState is stored in the high-order bits // 线程池创建之后的初始状态&#xff0c;这种状态下可以执行任务private static final int RUNNING -1 << COUNT_BITS; // 线程池不再接收新的任务&#xff0c;但是会将队列中的任务执行完 private s…

Go-新手速成-流程语句

1if Go的if不建议写&#xff08;&#xff09;&#xff0c;over //if条件判断age : 16if age < 18 {fmt.Println("未成年")} 2for循环 Go摈弃了while和do while 循环&#xff0c;因为他做到了极简(也不要括号) 这么写可以 total : 0for i : 0; i < 100; i {…

41:canvas - 下

一、转换 转换 在canvas内&#xff0c;也可以像css一样有一些类似于css2D转换的效果 位移 语法&#xff1a;ctx.translate(x, y)注意&#xff1a;一定要在绘制&#xff08;描边或填充&#xff09;之前&#xff0c;进行位移 缩放 语法&#xff1a;ctx.scale(x, y)注意&…