《ArcGIS Runtime SDK for Android开发笔记》——问题集:使用TextSymbol做标注显示乱码

 1、前言

在14年的时候写过一篇博客关于ArcGIS for Android 10.1.1API 中文标注导致程序异常崩溃问题,但是当时并没有很好的解决这样一个问题,也并没有深入研究分析这样的一个异常的产生原因,或者中文标注乱码、不显示、异常显示是什么原因造成的。而是使用了一种折中的解决方案:对于要使用TextSymbol的情况,先将文本信息转化成为图片,然后利用PictureSymbol显示。这样虽然能够避免异常的产生,但是总觉得现有的解决方案并非正解。加上群里的朋友也刚好研究到了这一块,并提供了对应的解决方案,只要在显示文本信息时,设置字体即可。

核心代码如下所示:

TextSymbol ts = new TextSymbol(18, "中文标注显示测试,English Test", Color.RED); ts.setFontFamily("DroidSansFallback.ttf");//设置字体 ts.setOffsetX(0); ts.setOffsetY(-30); Graphic gText = new Graphic(point,ts); graphicsLayer.addGraphic(gText);

但是在笔者的机器上运行了一下就产生了如下的效果。(LG Nexus 4 ,Android版本5.0.1 原生系统)

于是换了个设备并作测试,然后奇迹的发现显示又是正常的。(三星GT-P7510,Android版本4.1.2 CM版)

转载请注明出处:http://www.cnblogs.com/gis-luq/p/4833361.html

 

2、问题产生原因

针对上面的问题是如何产生的呢?通过查阅资料我在网上看到以下这样一段话。

Android系统中一般中英文字体包,主要是DroidSansFallback.ttf(中文字体)、DroidSans.ttf(英文字体)、 DroidSans-Bold.ttf(英文加粗字体)这三种,因为这三种字体是Andorid系统中几乎每一个显示界面都要使用到的字体,是默认的系统字体,所以只要你是Android手机,一般系统就内置有这三款字体。

但是估计也有例外,因为对于定制的Android系统有没有这个字体,这个字体是不是默认的就真的不好说了,比如MIUI。还有就是我们测试时候采用原生Android 5.01系统的Nexus4显示也是异常的,那这又是为什么?  这里我尝试打开Android Device Monitor工具并检查字体。

在Android Device Monitor工具下找到File Explorer,字体库的位置是在:/system/fonts文件夹下。

通过仔细检查,发现Android 5.01系统的Nexus4的字体库中并没有DroidSansFallback.ttf字体文件,然后我又用同样的方式查看了三星GT-P7510,Android版本4.1.2系统的字体库,在字体库里我们如期发现了DroidSansFallback.ttf字体,到这里也就能够解释,为什么在Nexus4中字体显示异常,在GT-P7510显示正常的原因。

网上有很多教大家替换Android字体的文章,在这些文章里我们发现这样一个问题:Android 5.0系统默认的简体中文字体替换为了NotoSansHans-Regular.otf,通过上面的检查我们也知道了Android 5.01的系统里没有DroidSansFallback.ttf字体。我想这样就是问题的关键点所在了。

接下来我们做进一步的测试,将字体替换为NotoSansHans-Regular.otf。然后示例代码如下:

TextSymbol ts = new TextSymbol(18, "中文标注显示测试,English Test", Color.RED); ts.setFontFamily("NotoSansHans-Regular.otf"); ts.setOffsetX(0); ts.setOffsetY(-30); Graphic gText = new Graphic(point,ts); graphicsLayer.addGraphic(gText);

结果在Nexus4 上依旧中文显示乱码,有可能是otf的字体文件就没有被识别到。

为了让字体显示正常。我又做了以下操作,先把Nexus4给Root了,然后将DroidSansFallback.ttf字体文件拷贝到手机系统字体文件夹下(/system/fonts),最后终于是成功了。结果如下图:

 

 

3、问题处理方案

 其实在剖析产生原因的时候已经介绍了处理方案,这里简单的再总结下。

1)、Android 5.0以下版本,检查手机字体库内是否包含DroidSansFallback.ttf字体,若包含则在使用TextSymbol时设置使用的字体。(设置其他字体也是可以的,但是该字体要支持中文)

2)、Android 5.0以上版本,由于默认的otf格式字体不被识别,所以先将DroidSansFallback.ttf字体文件拷贝到手机系统字体文件夹下,然后设置使用。(对于用到的手机每个都Root并设置也不是很现实)

3)、对于网上提到的加载自定义本地字体解决方案,关键代码如下所示,其中字体类是Typeface,我并没有在TextSymbol中找到对应的设置接口,所以这条路暂时也没有走通。欢迎大家拍砖补充。

Typeface customFont = Typeface.createFromAsset(this.getAssets(), "fonts/YourCustomFont.ttf");
TextView view = (TextView) findViewById(R.id.activity_main_header);
view.setTypeface(customFont);

 其他说明:ArcGIS Runtime SDK for Android 版本为10.2.6-u2

 

4、参考资料

http://www.68idc.cn/help/buildlang/ask/20150102153583.html

http://www.zhihu.com/question/26202765

http://jingyan.baidu.com/article/8275fc86b80c6d46a03cf6f9.html

http://my.oschina.net/ryanhoo/blog/260945?p=1

同步博客:http://www.cnblogs.com/gis-luq​
作者:gis-luq 
邮箱:luqiang.gis@foxmail.com

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值