从arcgis api for android 10.2开始,中文注记乱码的问题就一直困扰我。有文章中指出,是因为android手机fonts目录中默认字体库不支持中文导致的。可以通过设置textsymbol的字体解决,经测试部分机型可以正常显示,但是不同的android手机字体库是不同的,因此该方法不能从根本上解决问题。
个人感觉还是将注记转换成图片以picturesymbol的方式显示注记的方法靠谱。
label.xml文件,用于设置注记的显示样式
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/labellayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/txtView"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_marginTop="2dp"
android:layout_marginBottom="2dp"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text=""
android:textColor="#00ffff"
android:textSize="10sp"
android:maxLines="10"
android:gravity="center"
/>
</LinearLayout>
ArcGISUtils类,提供方法将view转换为bitmap
public class ArcGISUtils
{
public static Bitmap convertViewToBitmap(View view)
{
view.measure(View.MeasureSpec.makeMeasureSpec(0, 0), View.MeasureSpec.makeMeasureSpec(0, 0));
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
view.buildDrawingCache();
Bitmap bitmap = view.getDrawingCache();
return bitmap;
}
}
SymbolUtils类,用于生成PictureMarkerSymbol
public class SymbolUtils
{
public static PictureMarkerSymbol pictureSymobel(Context context, int layoutID)
{
LayoutInflater inflater = LayoutInflater.from(context);
View vw = inflater.inflate(layoutID, null);
Bitmap bt = ArcGISUtils.convertViewToBitmap(vw);
BitmapDrawable temp = new BitmapDrawable(context.getResources(), bt);
return new PictureMarkerSymbol(temp);
}
public static PictureMarkerSymbol pictureSymobel(Context context, View view)
{
Bitmap bt = ArcGISUtils.convertViewToBitmap(view);
BitmapDrawable temp = new BitmapDrawable(context.getResources(), bt);
return new PictureMarkerSymbol(temp);
}
public static PictureMarkerSymbol TextPicSymobel(Context context, String label)
{
LayoutInflater inflater = LayoutInflater.from(context);
View measurebiaozhuView = inflater.inflate(R.layout.label, null);
LinearLayout layout = (LinearLayout)measurebiaozhuView.findViewById(R.id.labellayout);
TextView txtView = (TextView)measurebiaozhuView.findViewById(R.id.txtView);
txtView.setText(label);
Bitmap bt = ArcGISUtils.convertViewToBitmap(layout);
BitmapDrawable temp = new BitmapDrawable(context.getResources(), bt);
return new PictureMarkerSymbol(temp);
}
public static enum MODE
{
RIGHT,
LEFT,
TOP,
BOTTOM;
}
}
PictureMarkerSymbol pictureMarkerSymbol = SymbolUtils.TextPicSymobel(context, text);
text即为标注的文字,将symbol设置给graphic即可显示。