1、前言
问题:在部分Android机型中使用ArcGIS for Android 10.1.1 API 中文标注导致程序异常崩溃。
说明:手里有两台机器一台是Nexus4,原生系统,版本4.4.4,使用10.1.1API中的TextSymbol标注中英文显示无任何异常。另一台机器是Note3,系统版本三星定制系统4.4.2,使用该机器在未升级前使用TextSymbol标注中英文显示正常,但是系统升级到4.4.2时,英文标注正常,中文标注导致程序卡死异常崩溃。什么原因产生的暂时还没有搞清楚,初步想法是用文字生成图片然后用PictureMarkerSymbol进行标注。
以下文本生成图片的解决方案主要参考牧羊的专栏中ArcGIS For Android 中文标注不显示解决方案实现,考虑到不同分辨率及DPI下图片的显示效果不同,特此对不同dpi的手机做了显示区分,这里我以dpi400为界分了两级,使得note3和nexus4显示效果统一。
//DPI获取核心代码
DisplayMetrics metric = new DisplayMetrics(); viewerActivity.getWindowManager().getDefaultDisplay().getMetrics(metric); int densityDpi = metric.densityDpi; // 屏幕密度DPI if(densityDpi>400){ return 2; }else{ return 1;
}
2、解决方案
/** * 文字转换BitMap * @param text * @return */ public static Drawable createMapBitMap(String text) {
//默认字体大小个高度 int size = 50; int height = 60;
//根据dpi级别设置自己大小和高度,是nexus4、note3中显示效果统一 if(CommonValue.dpilevel==1){ size = 22; height = 30; }else if(CommonValue.dpilevel==2){ size = 50; height = 60; } Paint paint = new Paint(); paint.setColor(Color.BLUE); paint.setTextSize(size); paint.setAntiAlias(true); paint.setTextAlign(Align.LEFT);//位置 float textLength = paint.measureText(text); int width = (int) textLength; Bitmap newb = Bitmap.createBitmap(width*2, height*2, Config.ARGB_8888); Canvas cv = new Canvas(newb); cv.drawColor(Color.parseColor("#00000000")); cv.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG)); cv.drawText(text, width, size, paint); cv.save(Canvas.ALL_SAVE_FLAG);// 保存 cv.restore();// 存储 return new BitmapDrawable(newb); }
使用方法
PictureMarkerSymbol markerSymbol = new PictureMarkerSymbol( CacheData.createMapBitMap("test"));
Graphic graphic2 = new Graphic(env.getCenter(), markerSymbol);
标注显示效果