http://blog.sina.com.cn/s/blog_dbc528b10101hppg.html
做Android开的同学经常会纠结怎么能使用一些漂亮的字体获取用户的芳心,如果你想实现这个目的,那么TTF字库就是必不可少的了。什么是TTF字库呢?可能许多不熟悉TTF字库的同学一看这么生疏的名字就被吓到了,不要担心,其实他并不可怕。所谓的TTF其实就是一种格式,就是类似这样,如“123.ttf”和 “123.txt”是一样的,“.txt”文档是保存文字的,而TTF就是保存字体的,就相当于Hiero生成的".fnt"文件一样。但是中文常用3500字,你总不能用hiero自己做吧,那怎么办呢?这其实微软早就解决这个问题了,它给我们提供了这个TTF字库,保存汉字字,方便我们使用。
Libgdx游戏引擎(1群):187378034
Libgdx游戏引擎(2群):148848483
1. 你不知道的FreeType !
大家可能奇怪为什么土豆会用这个标题,如果打包好的类我怎么可能找不到。很抱歉,API里面你找不到这个类,因为他是一个外加的扩展的包,如果你通过step-ui建立项目,默认是不加入这个包的,如果我们想使用的话,就需要手动导入,下面土豆就给大家介绍下导入的方法。
(1)打开解压好的0.9.8版的包,找到里面的extensions文件夹,打开后,进入gdx-freetype文件夹下面,找到 gdx-freetype.jar 和 gdx-freetype-natives.jar。
如图:
(2)扩展包导入
首先,核心代码项目,将 gdx-freetype.jar 复制并粘贴到核心代码项目的lib文件夹,然后将其添加到Referenced Libraries 库中。
其次,安卓项目,将 gdx-freetype.jar 复制并粘贴到 -android 项目的lib文件夹,然后将其添加到Referenced Libraries 库中。
最后,桌面项目,将 gdx-freetype-natives.jar 复制、粘贴到 -desktop 项目的lib文件夹中,然后加入到Referenced Libraries中。
如图:(步骤如下,因为加入方法相同,这里我就只贴一个图了)
(3)将 gdx-freetype 文件夹中,armeabi 和 armeabi-v7a 两个文件夹复制到 -android 项目中,替换掉原有的armeabi和armeabi-v7a文件夹。
如图:
PS:可能大家会好奇这个libgdx.so是什么文件,为什么有Android设备就可以运行.TTF的文件了呢?而没有他就一直报错呢?下面土豆来简单解释下.so文件是怎么回事。
答:一般来说.so文件就是常说的动态链接库, 是C或C++编译出来的,在可执行文件装载时或运行时,由Android操作系统的程序来加载库。作为加载过程的一部分它负责解析外部引用(比如库)。在不同的系统上,可执行文件包含一个叫做import directory的表,该表的每一项包含一个库的名字。根据表中记录的名字,装载程序所需要的库,然后将其加载到内存中,之后根据加载库后确定的库的地址更新可执行程序,更新后调用库中的函数或引用库中的数据。这就是.so文件的原理作用。
2.FreeTypeFontGenerator 类
API定义:TTF字体的发生器(生产者) ------ 由于这个类在API里面没有写,其实 FreeTypeFontGenerator 和 Texture 是一样的,都只是一个容器,负责盛装“.ttf”的文件然后备用。
功能用途:负责保存和解析“.ttf”格式文件。 -------- 这个和 Texture 类是一样的。
使用方法:FreeTypeFontGenerator 一般都配合 FreeTypeBitmapFontData 来使用。如下图:
PS:这里特别声明一下,如果你是用上面土豆给的链接下载的TTF字体文件的话,使用的时候一定要将文件名改成"英文名.ttf",比图土豆使用的是“华文娃娃体.TTF”就需要将它改名为“Baby.TTF”,这是因为LibGdx读取文件的时候并不支持中文文件名,所以千万别拿来就用,否则这个报错就不应该了。
3.FreeTypeBitmapFontData 类
API定义:负责处理FreeTypeBitmapFontData的数据的 (加工者) ------ 这个类在API里面也没有写
功能用途:负责处理FreeTypeGenerator的数据 ----------- 和 BitmapFontData 类似
使用方法:FreeTypeBitmapFontData fontData = freetypeGenerator.generateData( int Size, some Chinese String, false);
这里我简单介绍下上面这个类的几个参数和重要的成员变量,第一个是字号的大小,第二个是中文的字符串(即汉字,需要加引号),第三个翻转状态。
FreeTypeBitmapFontData 有一个重要成员变量 DEFAULT_CHARS , 它是作者Mario给我们封装好的基本英文字符打开FreeTypeBitmapFontData 你会看见如下图的变量赋值,这样即使".TTF"字库中没有英文字符,我们也可以输出英文字符的,因为作者已经给我们打包了。
如图:
4.简单的实例
这里土豆简单的写了一个例子,给大家做一下演示,例子比较简单,基本一看就懂,估计大家也是能学会的。
PS:关于 Key with name '****' is already in map 错误的原因,可能大家会碰见这个问题,这也是常见的问题,他是由于freetypeGenerator.generateData( int Size, some Chinese String, false);中” “some Chinese String ”参数不允许有重复字符出现,比如这句话“长的帅的人告白才叫告白”中“告白”2个字出现了2次,这是不允许的,generateData是不允许同样字符重复加载的,希望大家注意。
代码如下:
package com.potato;
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.Texture.TextureFilter;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator.FreeTypeBitmapFontData;
import com.badlogic.gdx.graphics.g2d.tiled.TileAtlas;
import com.badlogic.gdx.graphics.g2d.tiled.TileMapRenderer;
import com.badlogic.gdx.graphics.g2d.tiled.TiledLoader;
import com.badlogic.gdx.graphics.g2d.tiled.TiledMap;
public class Map implements ApplicationListener {
private BitmapFont Font;
private FreeTypeFontGenerator Generator;
FreeTypeBitmapFontData fontData;
private SpriteBatch batch;
@Override
public void create() {
Generator = new FreeTypeFontGenerator(
Gdx.files.internal("data/Baby.TTF"));
fontData = Generator.generateData(25, Generator.DEFAULT_CHARS
+ "长的帅人告白才叫,丑男那性骚扰。奋斗小土豆手机工作游戏室", false);// 这里需要把你要输出的字,全部写上,前提是不能有重复的字。
Font = new BitmapFont(fontData, fontData.getTextureRegion(), false);
Font.setColor(Color.RED);
batch = new SpriteBatch();
}
@Override
public void dispose() {
}
@Override
public void render() {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
batch.begin();
Font.drawMultiLine(batch,"hello Fighting Potato: 长的帅的人告白才叫告白, 长的丑的 男人告白那叫性骚扰。", 50, 220);
Font.draw(batch, "--------Var3D手机工作游戏室", 150, 90);
batch.end();
}
@Override
public void resize(int width, int height) {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
}
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.Texture.TextureFilter;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator.FreeTypeBitmapFontData;
import com.badlogic.gdx.graphics.g2d.tiled.TileAtlas;
import com.badlogic.gdx.graphics.g2d.tiled.TileMapRenderer;
import com.badlogic.gdx.graphics.g2d.tiled.TiledLoader;
import com.badlogic.gdx.graphics.g2d.tiled.TiledMap;
public class Map implements ApplicationListener {
private BitmapFont Font;
private FreeTypeFontGenerator Generator;
FreeTypeBitmapFontData fontData;
private SpriteBatch batch;
@Override
public void create() {
Generator = new FreeTypeFontGenerator(
Gdx.files.internal("data/Baby.TTF"));
fontData = Generator.generateData(25, Generator.DEFAULT_CHARS
+ "长的帅人告白才叫,丑男那性骚扰。奋斗小土豆手机工作游戏室", false);// 这里需要把你要输出的字,全部写上,前提是不能有重复的字。
Font = new BitmapFont(fontData, fontData.getTextureRegion(), false);
Font.setColor(Color.RED);
batch = new SpriteBatch();
}
@Override
public void dispose() {
}
@Override
public void render() {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
batch.begin();
Font.drawMultiLine(batch,"hello Fighting Potato: 长的帅的人告白才叫告白, 长的丑的 男人告白那叫性骚扰。", 50, 220);
Font.draw(batch, "--------Var3D手机工作游戏室", 150, 90);
batch.end();
}
@Override
public void resize(int width, int height) {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
}
效果截图:(Var3D手机工作游戏室这个不是土豆的工作室,是交流群里面一个朋友的ID,不过这句话确实是他说的)
5.关于被喷
不过总有一些奇葩,有一个QQ叫“思念你的鱼”的2货,直接加我QQ骂我,第一句就带父带母骂,然后就说写的垃圾,接着就是说没有技术含量,都是不痛不痒的例子。
我想说我写个博客只是出于帮助学习libgdx的朋友,而且只是针对初学者,只是提供交流而已,你觉得我写的垃圾,那你可以来写,就像猫总说的“要饭的还嫌钱少”。
如果你有意见可以和我交流,提我爸妈做什么,你说例子粗浅,我不信你刚学libgdx的时候上来就先来个BOX2D 然后就直接 IOS开发,一些基础的例子写的难了,初学者怎么看懂,本来新知识就不是很好接受,例子难了就更难学了,每个例子土豆都写的简单知识讲解新知识,不关联别的,而且附上图文,就是让大家能看懂。
土豆写教程,很大一部分原因就是土豆当年学libgdx的时候没有什么像样的教程,都是从官方给的tests和Demo看过来的,其中艰辛不言而喻,当时我就特别希望有一个简单的教程,只讲方法实现,同时例子的代码能运行起来,这样才有兴趣学下去,可是当时没有,后来夜明孤星灯前辈出了教程给了土豆很多帮助,所以土豆一直也想写一个博客也做一下这样一件好事。和群里朋友聊了一下,大家都希望有一个新版本(0.9.8)的教程,毕竟新版本改了好多东西,以前的好多接口都废弃掉了,许多方法实现都改了,所以土豆才决定每天抽2个小时的时间写博客的。
这里,我想对大家说,土豆的博客只给初学者和libgdx入门的同学看的,如果你技术高,请自行忽视,土豆也没花钱请你看吧,虽然被喷,但是请大家相信,作为一个从东北来的小伙,我的心还是挺大的,一定会坚持写下去的,就群里像Var3D哥说的“你不是人民币,不可能人人都喜欢你”。
感谢群里面支持我的朋友:Var3D哥 、猫总、小Z、萝卜、菜鸟、影子、许集贤大神、成都-315大神等朋友的支持,是你们告诉土豆,这世界上还是正常人多,2B少。
TTF字库下载地址:http://www.cr173.com/soft/36990.html
TTF字库详细介绍地址:http://baike.baidu.com/view/1361555.htm
源码下载:http://pan.baidu.com/s/1EGkt2
写在最后,有关于《优美字体的使用》的基本方法今天就介绍到这里了,下一篇是是关于libgdx框架中《动画类Animation》博文,我会介绍下Animation的使用。如果大家有什么问题可以加我QQ:316344618,一起讨论下。。PS:今天写的比较晚,已经凌晨3.00了,希望大家能多给予指点,帮助修改完善。