本文介绍Android实现全局设置自定义字体和局部设置自定义字体即单个TextView设置字体,同时也提供了一些优秀的三方字体框架,基本可以满足开发者对字体设置的全部要求。
首先需要了解Android之assets
简而言之,你的图片、svg文件放在工程的res/drawabe下,则设置字体用到的字体文件则位于assets下面。
如何创建assets目录、点击进入
代码如下(示例):
//用以设置App全局字体
implementation 'uk.co.chrisjenx:calligraphy:2.2.0'
代码如下(示例):
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种字体文件,下面是字体文件截图
重写下面这个方法
//不重写的Activity还是安卓默认字体
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}
如果你的项目升级了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'
ViewPump.init(ViewPump.builder()
.addInterceptor(new CalligraphyInterceptor(
new CalligraphyConfig.Builder()
.setDefaultFontPath("你的字体")
.setFontAttrId(R.attr.fontPath)
.build()))
.build());
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(ViewPumpContextWrapper.wrap(newBase));
}
和设置全局字体不同的是无需配置Application,无需引入依赖库calligraphy,仍需配置字体路径,使用下面的方法完成字体设置
protected Typeface tfRegular;//定义字体
{
tfRegular = Typeface.createFromAsset(getActivity().getAssets(), "fonts/OpenSans-Regular.ttf");//初始化字体
textView.setTypeface(tfRegular);
}
noraml (普通字体,系统默认使用的字体)
sans(非衬线字体)
serif (衬线字体)
monospace(等宽字体)
<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"/>
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);
通过xml实现自定义设置字体的还包括RoBoto,Android4.0后默认字体就使用了Roboto,下面介绍一下使用方法:
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"
字体 | 属性特征 |
---|---|
Regular | 标准字体 |
Italic | 字体倾斜 |
Bold | 字体加粗 |
Bold-italic | 加粗和倾斜 |
Light | 无衬线体字体 |
Light-italic | 无衬线斜体 |
Thin | 细体 |
Thin-italic | 细斜体 |
Condensed regular | 用于文本装潢、信息展示、网页设计、篆刻制模[cr] |
Condensed italic | 斜体版cr |
Condensed bold | 粗体版cr |
Condensed bold-italic | 粗斜体版cr |
BabushkaText ★659 -
UnderLineLinkTextView ★327 -
PinchZoomTextView ★272 -
ColorTextView ★214 -