玩转安卓字体

起因

最近公司有个需求,需要做 Widget ,内心其实是拒绝的,因为这个玩意儿特别难用,而且限制重重,但没办法,也不能不做,那就开始吧。

本来以为挺简单的东西,一个列表展示数据,然后再展示一些基本数据,两天搞定,然后拿给 UI 去看,下面是和UI的对话。

UI:你照着蓝湖做了嘛?

我:有啥问题吗?(很纳闷。。。我就是照着蓝湖做的啊!)

UI:你看你这个时间的字体和我图上的不一样啊!

我:额。。。行吧,我回去想想办法,你把字体发给我吧(内心一万只草泥马走过。。。)

原生字体

很久没搞过字体了,安卓系统一共为我们预制了四种字体,来看下吧:

  1. Normal(普通字体,系统默认使用的字体)
  2. sans(非衬线字体)
  3. serif(衬线字体)
  4. monospace(等宽字体)

来看个例子吧:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center_horizontal"android:orientation="vertical"tools:context=".MainActivity"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="10dp"android:text="Normal"android:textColor="#000"android:textSize="30sp" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="10dp"android:fontFamily="sans-serif"android:text="Sans"android:textColor="#000"android:textSize="30sp" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="10dp"android:fontFamily="serif"android:text="Serif"android:textColor="#000"android:textSize="30sp" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="10dp"android:fontFamily="monospace"android:text="Monospace"android:textColor="#000"android:textSize="30sp" /></LinearLayout>

上面例子很简单,一个线性布局包裹着上面描述的系统预制的四种字体,来看下效果图吧:

image.png

其实并不是只能像上面这样来进行使用,上面的四种还可以进行相互组合,也可以有不同的效果,大家可以自己试试:

image.png

字体并不是只能在布局文件中进行修改,在代码中同样可以进行修改:

//设置字体样式  
mainText.typeface = Typeface.SANS_SERIF
mainText.typeface = Typeface.SERIF

如果没有什么特殊要求的话,上面的这几种字体基本就能满足大部分的开发需求了,而且还都可以对字体进行加粗和斜体,就更能满足了。

使用三方字体

但UI并不认为安卓预制的几种字体好看,就想弄点不一样的字体😂,那也没办法,就来看看怎么设置吧。

引入字体

既然想使用三方字体,那第一步肯定是要引入下三方字体文件,字体文件后缀为 .ttf,需要将字体文件放到assets->fonts文件夹中,项目中没有这个文件夹不要紧,自己新建一个即可。

使用

使用很简单,通过AssetsManager就能获取到字体文件,然后直接通过setTypeFace方法将字体设置下即可:

//从asset 读取字体 根据路径得到Typeface  
val tf = Typeface.createFromAsset(assets, "fonts/你的字体名称.ttf")
//设置字体  
mainText.typeface = tf

问题

至此为止,上面的内容就是百度安卓字体能出来的内容,但是!!!没法用啊,文章开头就说到了,我现在做的是 AppWidget 啊,限制非常多,只能通过 RemoteView 的一些固定方法来设置控件的值,但 RemoteView 中并没有可以设置字体的方法,这该咋办呢???

百度了半天也没有找到结果,就想着能不能在 Application 中通过反射将 TextView 的字体中其中一个的默认字体给修改成我想要的字体,然后通过设置主题的方法给 AppWidget 中的 TextView 进行设置以来达到修改字体的结果。

先来写下 Application 中的字体替换代码:

class App : Application() {override fun onCreate() {super.onCreate()updateFont()}private fun updateFont() {val regular = Typeface.createFromAsset(assets,"fonts/你的字体名称.ttf")replaceFont(regular)}@SuppressLint("DiscouragedPrivateApi")private fun replaceFont(newTypeface: Typeface) {val newMap: MutableMap<String?, Typeface> = HashMap()newMap["MONOSPACE"] = newTypefacetry {val staticField = Typeface::class.java.getDeclaredField("sSystemFontMap")staticField.isAccessible = truestaticField[null] = newMap} catch (e: Exception) {e.printStackTrace()}}}

下面来在主题中设置下:

<!-- 字体 theme. -->
<style name="FontAppTheme" parent="Theme.AppCompat"><item name="android:typeface">monospace</item>
</style>

之后就可以在 TextView 中进行设置了:

<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="10dp"android:text="12:34"android:textColor="#000"android:textSize="30sp"android:theme="@style/FontAppTheme" />

解决方案

上面的这种方法太麻烦,而且还使用了反射,太不友好了。就想着去看看官方文档吧,没准有什么好用的方法呢。

果然。。。。进入官方文档的第一句话就给我整笑了。。。

image.png

What?只需要像放图片一样在 res 中建一个 font 文件夹,然后将字体放进去,就可以像使用图片一样来使用字体了???

那我搞上面一堆干啥??

嗯。。。。遇到问题还是尽量少百度,多看官方文档吧。。

而且动态设置字体的时候也没必要像之前那样通过 AssetsManager 来获取字体了,只需要通过 Resources 就可以获取到了:

val tf = resources.getFont(R.font.myfont)
mainText.typeface = tf

这是字体官方文档的地址:https://developer.android.google.cn/guide/topics/ui/look-and-feel/fonts-in-xml

总结

哎,其实很简单的一个东西,而且在 Android 8.0 的时候就已经实现的东西,现在马上都 Android 12 了我竟然都不知道,惭愧啊!!!

好了,就这样吧,大家以后遇到问题还是多看文档吧。。。千万不要学我。

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

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

相关文章

iPadPro看电影之MKV转MP4视频格式教程

拥有了苹果iPadPro如果不看高清电影那就有点可惜了&#xff0c;虽说在线看电影也不错&#xff0c;但就目前这种网络环境&#xff0c;还别说很多时候没有Wifi网络&#xff0c;即使能上网很多时候网速也无法支持流畅的在线播放普清电影&#xff0c;更不用说高清电影了。怎么办&am…

如何向ipad上传视频(使用iTunes)

1.先对iTunes做个简单介绍&#xff1a; iTunes是一款媒体播放器的应用程序&#xff0c;2001年1月10日由苹果电脑在旧金山的Macworld Expo推出&#xff0c;用来播放以及管理数字音乐和与视频文件。iTunes能连接到iTunes Store&#xff0c;以便下载购买的数字音乐、音乐影片、电视…

Mac电脑使用:通过Mac电脑导出iPhone手机里面的视频(不是iTunes导出视频的方法)

分享一个通过Mac电脑导出iPhone手机里面的视频的方法,这个方法和通过iTunes导出手机视频的方法是并行关系。 方法很简单,就是通过Mac电脑系统里面自带的图像捕捉工具来操作。 具体步骤如下所示: 1.把iPhone手机连接到你的Mac电脑上面,然后打开Launchpad; 2.在Launchpad中找…

苹果手机iphone如何播放电脑中的视频

用手机看视频已经是人们习以为常的事情了&#xff0c;随着手机容量的增大&#xff0c;很多人选择把视频下载到手机本地观看&#xff0c;但是有些视频我们存放在电脑上&#xff0c;想用手机看怎么办呢&#xff1f;很多人选择把视频用数据线传输到手机上&#xff0c;但是这样略显…

如何在IPad上优雅地看移动硬盘中的视频

这里用到的是SMB协议&#xff0c;Win10自带 文章目录 如何开启SMB如何共享文件如何在IPad上访问共享文件如何在IPad上看视频呢&#xff1f; 如何开启SMB 众所周知&#xff0c;windows的SMB默认是关闭的&#xff0c;下文首先介绍如何开启首先&#xff0c;进入控制面板-程序&…

ipad 共享 计算机,ipad与电脑怎么共享视频

有了Ipad以后&#xff0c;天天就想着怎么玩Ipad&#xff0c;那么大家知道ipad与电脑怎么共享视频吗?下面学习啦小编就为大家带来了ipad与电脑共享视频实现在iPad上看电脑里的电影的方法。 ipad与电脑共享视频方法 1.首先需要在电脑上先打开 “家庭共享”功能。 在PC上选择 文件…

平板可以看html文档吗,iPad如何看电脑里的视频 如何使用Ipad看电脑里的电影

电脑上的视频怎么在iPad上观看&#xff1f; 如何在ipad播放电脑中的视频 首先&#xff0c;看你的视频格式。如果是mp4&#xff0c;就可以直接放入ipad自带浏览器或者通过itunes直接传。其他格式的需要下载第三方播放器&#xff0c;目前使用较多的支持高清播放的有Oplayer&#…

windows10 共享视频到 Ipad

windows10 共享视频到 Ipad(iphone) 写作初衷前期准备教程开始共享文件夹设置控制面板设置Windows Media Player 设置共享内容图片分享 后来的话 写作初衷 受限于Ipad系统的封闭性&#xff0c;向其传输数据需要下载超级难用的Itunes&#xff0c;使用过程非常糟心。而使用Ipad下…

如何通过电脑向ipad传电影视频(不用越狱)

前言 为了能在ipad上看电脑上已下载的电影&#xff0c;我可是试了各种方法&#xff0c;心好累&#xff0c;还好终于解决了。不得不说&#xff0c;网上没一个靠谱的答案&#xff01; 方法一 如果电影本身的格式是 mp4&#xff0c;mov&#xff0c;m4a格式&#xff0c;通过官方的i…

【Apple】用iphone,ipad看电脑上的视频

之前因为想要躺床上看视频&#xff0c;稍微钻研了一下这方面的东东&#xff0c;大概是这么几种 前提&#xff0c;要在同一局域网下~ 1.FTP工具带FTP功能的播放器APP FTP工具&#xff1a;FileZilla、Serv-U、Quick Easy FTP 等等 APP&#xff1a;nplayer、oplayer 等等 个人用…

ipad查看本地文件html文件,ipad如何观看本地视频 怎么用iPad观看电脑上的影片

很多人喜欢用iPad通过网络看电影电视&#xff0c;也有人把转好格式的电影传到iPad中观看&#xff0c;那么我们有没有办法不转换格式就直接观看电脑上的影片呢&#xff1f;相信Air Video(空中视频)可以帮助我们实现&#xff01; Air Video使用的使用条件&#xff1a; 首先&#…

android ipad 传视频播放器,三种将本地视频导入到iPad中的方法

首先&#xff0c;前往苹果官网下载安装对应版本的 iTunes 客户端。 打开 iTunes&#xff0c;用数据线连接手机和电脑。 按照提示连接成功之后&#xff0c;依次点击「工具栏的文件>将文件添加到资料库」&#xff0c;选择你想导入的视频&#xff0c;这个视频就添加到 iTunes 资…

微信小程序,微信开放平台,申请wx.chooseLocation,wx.getLocation 通用话术 定位,位置

申请地址理由 wx.chooseLocation 因当前业务涉及到业务员需上门安装门窗&#xff0c;当用户定制门窗下单时&#xff0c;需获取用户当前实时地理位置以便业务员上门服务&#xff0c;减少因地址不清楚而发生不愉快的事&#xff0c;故申请 wx.chooseLocation 接口&#xff0c;望通…

pdf怎么转换成word?一分钟解决

PDF文件是一种广泛使用的电子文档格式&#xff0c;因为它们可以保留文档的完整性和格式。但是&#xff0c;有时候我们需要对PDF文件进行编辑和修改&#xff0c;这时候就需要将其转换成Word格式。在本篇文章中&#xff0c;我们将讨论PDF转换Word的方法及其优缺点。 有很多在线工…

第2章:SpringMVC的@RequestMapping注解

一、SpringMVC搭建框架 1.创建一个Maven程序的步骤 ①在pom.xml导入maven依赖 <!--打包方式是war--> <!--war 包通常用于网站&#xff0c;它是一个可以直接运行的 web 模块--> <packaging>war</packaging> <dependencies><!-- SpringMVC --…

安装windows server2008虚拟机

第一步&#xff1a;新建虚拟机 第二步&#xff1a;选择想安装的虚拟机版本 第三步&#xff1a;选择下载路径 第四步&#xff1a;分配虚拟机内存 第五步&#xff1a;编辑虚拟机设置并选择CD 第六步&#xff1a;选择虚拟机镜像 第七步&#xff1a;选择中文语言并继续安装 第八步&…

在VMware中安装虚拟机Windows server 2008

1、新建虚拟机&#xff08;使用自定义方式&#xff09;&#xff0c;点击“下一步”&#xff0c;然后选择自己所安装的虚拟机版本&#xff0c;再点击“下一步”&#xff1b; 2、选择“稍后安装操作系统”&#xff0c;点击“下一步”&#xff0c;选择虚拟机可支持的Linux版本&…

VMware安装windows server2008R2x64

1、准备 VMware-Workstation-12.0.0 Pro cn_windows_server_2008_r2_standard_enterprise_datacenter_and_web_with_sp1_x64_dvd_617598.iso 2、安装虚拟机裸机 安装方式建议选择稍后安装操作系统&#xff0c;这种安装方式跟使用真实机器安装最为接近。 操作系统版本必须跟安…

用VMware安装Windows 8.x虚拟机镜像系统详细流程

一、前言 虚拟机&#xff08;Virtual Machine&#xff09;指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整的计算机系统。所以&#xff0c;你可以将它理解为基于你的一台电脑“生出”好几台一样&#xff08;操作系统&#xff09;或者相异&#xff08…

VMware安装window8系统

VMware需要安装window系统 一、win系统下载 1、打开MSDN网站&#xff08;http://msdn.itellyou.cn &#xff09;&#xff0c;下载相应系统 2、 点开左边的操作系统&#xff0c;我在这里以下载win8系统为例&#xff0c;在操作系统下找到Windows 8.1&#xff0c;点击。在中间偏左…