前言

本文介绍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));
}

三、单个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);
}

2.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,下面介绍一下使用方法:

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"

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

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

4.1 通过Spannables设置文本样式

BabushkaText ★659 -

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

UnderLineLinkTextView ★327 -

4.3 用手势缩放字体大小

PinchZoomTextView ★272 -

4.4 用颜色标记一些短语

ColorTextView ★214 -

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐