Android 字体使用踩坑指南

最近项目改版,根据ui的设计,需要使用到三字体。在使用过程中遇到一些坑,于是有了这个避坑指南!

字体压缩

第一个坑!字体库的体积太大。

字体压缩的前提是要使用的内容是可控的,换句话说,使用字体的文本时一些固定的内容,比如说金额,姓氏,颜色之类的!压缩的原理是只提取要显示的文本内容,然后打包成字体包!这里我用到的是一个工具包,附上现在链接下载链接。具体的使用步骤见上面链接,可以有效的减少字体库的体积!

使用字体库方法一

准备好的要用的字体放在如下目录

放置目录

加载字体库

TextView textView= (TextView) findViewById(R.id.text_view);

Typeface typeface=Typeface.createFromAsset(getAssets(),"fonts/orange.ttf");

textView.setTypeface(typeface);

第二个坑,assets 目录加载不到!

这是最常见的用法,但是由于某些特殊的原因,assets 目录加载不到,那就用到另外一种方式

使用字体库方法二

放置字体库

在 res 目录下新建一个 font 的目录

放置目录二

然后将字体库文件放进新建的font 文件下。

加载字体库

TextView textView = (TextView) findViewById(R.id.text_view);

Typeface typeface = ResourcesCompat.getFont(this, R.font.orange);

textView.setTypeface(typeface);

第三个坑,v4包的版本太低,切不能升级!

这种方式也又一个缺陷,就是 ResourcesCompat.getFont 这个函数是在android-support-v4这个包的版本是26+,才可以使用!这个就是遇到的第二个坑!这两种方式的都失败了,于是采用第三种方法!

使用字体库方法三

由于前两种方法都失败了,所以有了这种方法!办法总比空难多。先说原理查看 Typeface 这个类有一个函数

/**

* Create a new typeface from the specified font file.

*

* @param path The full path to the font data.

* @return The new typeface.

*/

public static Typeface createFromFile(String path) {

if (sFallbackFonts != null) {

FontFamily fontFamily = new FontFamily();

if (fontFamily.addFont(path, 0 /* ttcIndex */)) {

FontFamily[] families = { fontFamily };

return createFromFamiliesWithDefault(families);

}

}

throw new RuntimeException("Font not found " + path);

}

这个函数允许从一个文件路径加载字体库,于是采用这种方法!我们在res目录下新建一个 raw目录,然后把字体文件放进去!我们需要被这个文件写入手机的内存中,然后从内存再加载这个文件!写入文件的路径选择这个 /data/data/packagename/files/目录下,目的就是为了避开权限sdcard 的读写权限检查!

写入文件

private Typeface copyTextTypeToFile() {

File filesDir = mContext.getFilesDir();

File puhuitiMiniPath = new File(filesDir, "orange.ttf");

//判断该文件存不存在

if (!puhuitiMiniPath.exists()) {

//如果不存在,开始写入文件

copyFilesFromRaw(mContext, R.raw.orange, "orange.ttf", mContext.getFilesDir().getAbsolutePath());

}

return Typeface.createFromFile(puhuitiMiniPath);

}

...

void copyFilesFromRaw(Context context, int id, String fileName,String storagePath){

InputStream inputStream=context.getResources().openRawResource(id);

File file = new File(storagePath);

//如果文件夹不存在,则创建新的文件夹

if (!file.exists()) {

file.mkdirs();

}

String storagePath = storagePath + SEPARATOR + fileName;

File file = new File(storagePath);

try {

if (!file.exists()) {

// 1.建立通道对象

FileOutputStream fos = new FileOutputStream(file);

// 2.定义存储空间

byte[] buffer = new byte[inputStream.available()];

// 3.开始读文件

int lenght = 0;

while ((lenght = inputStream.read(buffer)) != -1) {// 循环从输入流读取buffer字节

// 将Buffer中的数据写到outputStream对象中

fos.write(buffer, 0, lenght);

}

fos.flush();// 刷新缓冲区

// 4.关闭流

fos.close();

inputStream.close();

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

将文件写入之后加载

textView.setTypeface(typeface)

这里只是说明一下主要的实现思路,具体实现需要结合实际的场景!

android 字体文件压缩,Android 字体使用踩坑指南相关推荐

  1. Egg整合antd文件上传以及防踩坑指南

    Egg整合antd文件上传以及防踩坑指南 前言 一. 项目编写 二. 注意事项 2.1 清理缓存 2.2 antd的Upload组件得到的事件对象问题 2.3 关于onChange事件的注意 前言 最 ...

  2. android 字体文件压缩,Android创建assets文件夹并使用字体图标(Icon Font)

    首先我们要知道如何在AS中新建引用assets文件 1.将项目切换到Project模式 Project.png 2.要注意assets文件夹要跟Java文件在同一目录下,都包含在main的文件下面. ...

  3. Android XML文件中设置字体

    Android提供三种字体:"Sans","serif"和"monospace". 1.在Android XML文件中设置字体 可以采用an ...

  4. win7使用android字体文件,[转载]win7字体安装方法

    文章来源:三联教程 Windows 7不仅能提供变换的Win7桌面和绚丽的Win7主题,还支持字体安装功能.但是一般用户并不懂得如何添加Win7字体,下面我们就将为读者详解Win7字体的安装过程和安装 ...

  5. 字体文件压缩 - font-spider (字蛛)

    优化加载速度, 压缩字体文件 安装: npm install font-spider -g 查看版本: font-spider  -v 1. 新建一个fonts文件 2. fonts下新建index. ...

  6. Android applink 踩坑指南

    Android applink 踩坑指南 原理 接入步骤 将链接与activity关联起来 加入meta data 生成身份验证JSON 真机测试 结论 官方文档 原理 与url scheme不同的地 ...

  7. 【问题解决】Android JDK版本不匹配导致崩溃踩坑记录

    [问题解决]Android JDK版本不匹配导致崩溃踩坑记录 部分机型反馈崩溃问题 谷歌回复与解决方案 Android打包脱糖操作 对比与排查 总结 前几天同事遇到一个非常诡异的报错,紧急处理后,趁着 ...

  8. Android 解决XXX Layout leaked 使用Navigation 踩坑 XML内存泄漏

    Android 解决XXX Layout leaked 使用Navigation 踩坑 XML内存泄漏 报错日志 排查过程 泄漏原因 解决方案 最近维护一个项目,一个内存泄漏的的原因查了很久,这里记录 ...

  9. Android获取不到运动步数(踩坑)

    Android获取不到运动步数(踩坑) 获取运动步数 某些手机获取不到步数 获取运动步数 使用SensorManager,也就是手机内置的传感器获取运动步数,通过该方法可获取到当前运动步数.开机后总运 ...

最新文章

  1. 使用html测试数据库连接与操作(含界面) 第二步 功能实现
  2. Anchor-free目标检测 | 工业应用更友好的新网络(附大量相关论文下载)
  3. matlab-代数方程
  4. 算法62---最长回文子序列长度(子串)、回文子序列总共个数(子串)【动态规划】...
  5. python扩展库丰富吗_python扩展库
  6. AWS DataPipline 的一次尝试。
  7. php 分页类使用,php 分页 分页类 简单实用
  8. iOS-MVVM架构优化
  9. 标准梯度—lhMorpGradient
  10. Oracle C#处理时间类型的Insert
  11. linux dhcpd 设置 关于 subnet
  12. android 跨进程点击方式总结
  13. C/C++[codeup 1808]字符串查找删除
  14. Mysql官网下载教程
  15. qq不加好友实现网页在线聊天(qq在线客服)
  16. 新手小白做短视频自媒体,入门级教程分享,抓紧收藏
  17. 织梦CMS模板安装教程详细图文
  18. [JZOJ4058]【JSOI2015】子集选取
  19. mysql修改初始密码....
  20. 热门光学软件之初体验网络课程系列大纲5

热门文章

  1. 解决AttributeError in NetworkX, module has no k_clique_communities
  2. mysql进阶:optimize table 优化表命令 Table does not support optimize, doing recreate + analyze instead
  3. stm32休眠 以及休眠中如何喂狗
  4. 庆科EWM3080 v2.1.3(默认固件)AT指令配置方法
  5. mac下Homebrew安装Fetching /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask failed报错解决方法
  6. 4-1、matplotlib绘制两个系列的簇状柱形图(参数详解)
  7. bzoj 3685 普通van Emde Boas树(坑)
  8. 王桐:永洪科技致力于提供AI+BI+BIG DATA一站式数据智能解决方案
  9. c语言 值传递与引用传递
  10. NTlite给window瘦身+定制程序员专属环境