zoukankan      html  css  js  c++  java
  • 《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
  • 相关阅读:
    线段树的区间更新---A Simple Problem with Integers
    划分树---Feed the dogs
    划分树基础知识
    Treap树的基础知识
    平衡二叉树---Shaolin
    KMA & ex_KMP---Revolving Digits
    DP---Mahjong tree
    《程序员代码面试指南》第一章 栈和队列 最大值减去最小值小于或等于num的数量
    《程序员代码面试指南》第一章 栈和队列 求最大子矩阵大小
    《程序员代码面试指南》第一章 栈和队列 构造数组的MaxTree
  • 原文地址:https://www.cnblogs.com/telwanggs/p/6434129.html
Copyright © 2011-2022 走看看