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