最近接手公司先前的项目,各种坑等待我去填呀,当然,填坑的过程也是成长的过程!
不废话,直接说问题,在开发Arcgis地图时,需要在图层上添加文字,可是本来在测试机上文字好好的显示,我换了个手机跑了下程序,发现图层上所有的文字都乱码了。。。
首先看添加图层文字代码
public static Symbol getLayerTextSymbolById(int id, String text, double scale) {
int textSize = MapUtil.getLayerTextSizeById(id, scale);
if (0 != textSize) {
TextSymbol textSymbol = new TextSymbol("这里写字体大小", text,"这里写字体颜色");
textSymbol.setFontFamily("DroidSansFallback.ttf");
textSymbol.setVerticalAlignment(TextSymbol.VerticalAlignment.MIDDLE);
textSymbol.setHorizontalAlignment(TextSymbol.HorizontalAlignment.CENTER);
return textSymbol;
}
return null;
}
其中 textSymbol.setFontFamily("DroidSansFallback.ttf");就是设置添加的文字字体,可是对于字体DroidSansFallback.ttf,并不是每个手机系统都是默认是它,如果我手机里的默认字体不是它,那么显示的图层文字就会出现乱码的情况,这也是为什么本人当前开发的项目在测试手机上正常,换个手机就不行的原因。
问题解决:
首先进行各种百度,发现很多人跟我一样遇到这个问题,但就是没说明解决办法。其中大多数就是说需要把手机root一下,然后下载字体文件解压到font字体目录下,然后就可以了,我的天!我怎么可能让使用app的用户去root手机呢,还下载文件。。。。。。不说了。。。
然后就法现了一个博客http://www.2cto.com/kf/201706/645991.html ,说是把字体文件放到内存卡,然后引用textSymbol.setFontFamily("现在这里放字体文件子啊内存卡中的绝对路径");,我就下载了一个DroidSansFallback.ttf文件,放到内存卡目录中,亲测可用。
我的第一想法就是把这个字体文件DroidSansFallback.ttf扔到我们自己的服务器上,然后用户第一次进入APP就悄悄地把这个文件下载下来,然后供APP使用。但是还没实行,我又想,为什么不能把这个文件扔到assert文件夹下呢?然后我就开始测试,但是发现怎么搞都不行,又准备放弃的时候又想起来我可以把这个字体文件从assert中复制到手机内存中呀,然后又搞了下,问题解决~
复制文件工具类
public class CopyFontFile {
private static final String PHONE_PATH = "data/data/com.youta.wisdomport/databases/";
public static final String FONT_PATH = PHONE_PATH + "DroidSansFallback.ttf";
private Context mContext;
public CopyFontFile(Context context){
this.mContext = context;
}
public void DoCopy(){
try{
File dataFile = new File(FONT_PATH);
if(dataFile.exists()){
Log.i("CopyFontFile","qwer---> 文件已存在");
return;
}else{
Log.i("CopyFontFile","qwer---> 文件不存在");
}
File file = new File(PHONE_PATH);
if(!file.exists()){
file.mkdir();
}
if(!(new File(FONT_PATH).exists())){
InputStream mips = this.mContext.getResources().getAssets().open("DroidSansFallback.ttf");
FileOutputStream mos = new FileOutputStream(FONT_PATH);
byte[] buffer = new byte[1024*1024];
int count = 0;
while((count = mips.read(buffer)) >0){
mos.write(buffer,0,count);
}
mos.close();
mips.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
在Activity中调用:
CopyFontFile mCopyData_File = new CopyFontFile(this);
mCopyData_File.DoCopy();
字体重新设置
public static Symbol getLayerTextSymbolById(int id, String text, double scale) {
int textSize = MapUtil.getLayerTextSizeById(id, scale);
if (0 != textSize) {
TextSymbol textSymbol = new TextSymbol(MapUtil.getLayerTextSizeById(id, scale), text,
MapUtil.getLayerTextColorById(id));
String fontFamily = new File(CopyFontFile.FONT_PATH).getPath();
textSymbol.setFontFamily(fontFamily);
textSymbol.setVerticalAlignment(TextSymbol.VerticalAlignment.MIDDLE);
textSymbol.setHorizontalAlignment(TextSymbol.HorizontalAlignment.CENTER);
return textSymbol;
}
return null;
}
!!! 2017年12月18日补充
在后来的又一次开发中,我再一次需要解决这个问题,可是日了狗了,同样的代码,无论怎么搞都是乱码。。。。。
最后这个问题困扰了我3天,终于解决,有点莫名奇妙,但问题解决就好
不明原因,加上v7a包和x86包就乱码,去掉就好了。。。
有问题欢迎留言讨论
版权声明:个人原创,若转载,请注明出处