android 字体文件压缩,Android 字体使用踩坑指南
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 字体使用踩坑指南相关推荐
- Egg整合antd文件上传以及防踩坑指南
Egg整合antd文件上传以及防踩坑指南 前言 一. 项目编写 二. 注意事项 2.1 清理缓存 2.2 antd的Upload组件得到的事件对象问题 2.3 关于onChange事件的注意 前言 最 ...
- android 字体文件压缩,Android创建assets文件夹并使用字体图标(Icon Font)
首先我们要知道如何在AS中新建引用assets文件 1.将项目切换到Project模式 Project.png 2.要注意assets文件夹要跟Java文件在同一目录下,都包含在main的文件下面. ...
- Android XML文件中设置字体
Android提供三种字体:"Sans","serif"和"monospace". 1.在Android XML文件中设置字体 可以采用an ...
- win7使用android字体文件,[转载]win7字体安装方法
文章来源:三联教程 Windows 7不仅能提供变换的Win7桌面和绚丽的Win7主题,还支持字体安装功能.但是一般用户并不懂得如何添加Win7字体,下面我们就将为读者详解Win7字体的安装过程和安装 ...
- 字体文件压缩 - font-spider (字蛛)
优化加载速度, 压缩字体文件 安装: npm install font-spider -g 查看版本: font-spider -v 1. 新建一个fonts文件 2. fonts下新建index. ...
- Android applink 踩坑指南
Android applink 踩坑指南 原理 接入步骤 将链接与activity关联起来 加入meta data 生成身份验证JSON 真机测试 结论 官方文档 原理 与url scheme不同的地 ...
- 【问题解决】Android JDK版本不匹配导致崩溃踩坑记录
[问题解决]Android JDK版本不匹配导致崩溃踩坑记录 部分机型反馈崩溃问题 谷歌回复与解决方案 Android打包脱糖操作 对比与排查 总结 前几天同事遇到一个非常诡异的报错,紧急处理后,趁着 ...
- Android 解决XXX Layout leaked 使用Navigation 踩坑 XML内存泄漏
Android 解决XXX Layout leaked 使用Navigation 踩坑 XML内存泄漏 报错日志 排查过程 泄漏原因 解决方案 最近维护一个项目,一个内存泄漏的的原因查了很久,这里记录 ...
- Android获取不到运动步数(踩坑)
Android获取不到运动步数(踩坑) 获取运动步数 某些手机获取不到步数 获取运动步数 使用SensorManager,也就是手机内置的传感器获取运动步数,通过该方法可获取到当前运动步数.开机后总运 ...
最新文章
- 魔尺变机器人_百变魔尺——创意生活
- 笔记本电脑可以做网站服务器,个人笔记本能做网站服务器吗
- php 之 post json 数据
- elasticsearch索引结构和配置优化
- 根本不值得一提的乒乓球国手王浩
- 实战课堂:一则CPU 100%的故障分析处理知识和警示
- mac上解决中文乱码, arara实现LaTex多命令执行, LaTeXiT法文界面转英文
- PCL——2.kd-tree
- java B2B2C springmvc mybatis多租户电子商城系统 (七)springboot开启声明式事务
- opencv 修改 读取路径_opencv中读取图像的绝对路径问题
- 中国生物医药产业集群产业战略布局及运营管理模式分析报告2021-2027年
- Typora 下载及使用简介
- 前端加载shapefile数据
- html页面ie不显示图片,IE浏览器网页不显示图片如何解决?解决方法介绍
- Dzz Desktop1.2 Demo
- python xlsxwriter生成图片保存_Python Excel操作模块XlsxWriter之插入图片worksheet.insert_image()...
- 厨房里的ERP(MRP)
- 【Latex】记录写毕业论文时用到的操作
- MATEBOOK E 2019 安装linux
- CSDN博客——从失望到希望
热门文章
- 知识图谱构建实验笔记(二):知识图谱搭建过程与总结
- 如何买到最便宜的机票
- nginx反向代理打印日志_nginx反向代理笔记
- 算法导论-van Emde Boas树
- 在数据库访问项目中使用微软企业库Enterprise Library,实现多种数据库的支持
- flage的值作为全局变量进行传递
- java向窗口添加菜单_Java基础之创建窗口——向窗口中添加菜单(Sketcher)
- iPhone 摄像头并非完美:6个地方需改进
- [FPGA] FPGA设计EtherCAT主站的方法和常见问题
- Android基础入门教程——2.4.3 BaseAdapter优化