ArcGIS for Android 的callout会实现的功能就是当你单击地图上一个标注的时候,会弹出一个衔套在MapView之上的弹窗,里面可以显示该标注的一些信息和属性。
今天,我将在这里总结我这些天对callout的皮毛研究,能力有限,如有错误之处请回复提出。
首先是要在res文件夹下创建一个xml文件夹,里面新建文件calloutstyle.xml,然后用代码对该callout的样式进行设置。根据英文API中的介绍,做了一些简单的翻译:
<?xml version="1.0" encoding="utf-8"?> <resources> <calloutViewStyle titleTextColor="#000000" <!-- some RGB color or a reference to a color /> titleTextSize = 10; <!-- size of the title text in scaled pixels /> titleTextStyle = 0; <!—字体样式/> titleTextTypeFace = 0; <!—字体设置0-4/> backgroundColor="#ffffff" <!—信息框的整个内在的背景颜色 /> backgroundAlpha="255" <!-- 0(透明) to 255(不透明) />设置透明度参数 frameColor="#000000" <!—框架的颜色(就是整个信息框的四周边缘颜色) /> flat="true" <!-- draws a 3D frame(平面的还是3D的,这里true是代表平面的) /> style.getCornerCurve()="0" <!--窗口角落的半径曲率(max=40) /> anchor="5" /> <!-- anchor的位置(0-8,根据ANCHOR_POSITION_XXX常量的选择)/> </resources>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/callTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="1dp" android:text="武夷山" android:textSize="15sp" android:textStyle="bold" > </TextView> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="180dp" android:orientation="horizontal" > <Button android:id="@+id/callcollect" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/callcollect" /> <Button android:id="@+id/callshare" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/callshare" /> <Button android:id="@+id/callexit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/callexit" /> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/calladdre" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="地址:福建省南平市武夷山市" /> <TextView android:id="@+id/calltype" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="类型:旅游风景区" /> <TextView android:id="@+id/callcontent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="详情:大众点评网述" /> <TextView android:id="@+id/callnumb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="电话:0599-5250580" /> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" > <ImageView android:id="@+id/calloutimg" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginLeft="5dp" android:src="@drawable/mm11" > </ImageView> </LinearLayout> </LinearLayout> </LinearLayout>
那么,接下来就是java代码的实现了,我的思路是,在地图上创建一个临时的point,然后当单击该point后,弹窗callout。
final GraphicsLayer graphicsLayer = new GraphicsLayer(); com.esri.core.geometry.Point pt1 = new com.esri.core.geometry.Point( 1.2905771616285184E7, 3035967.556712447); Graphic g1 = new Graphic(pt1, new SimpleMarkerSymbol(Color.BLACK, 10, STYLE.CIRCLE)); graphicsLayer.addGraphic(g1); mMapView.addLayer(graphicsLayer); mMapView.setOnSingleTapListener(new OnSingleTapListener() { public void onSingleTap(float x, float y) { // TODO Auto-generated method stub int[] graphicIDs = graphicsLayer.getGraphicIDs(x, y, 25); if (graphicIDs != null && graphicIDs.length > 0) { LayoutInflater inflater = LayoutInflater .from(HelloWorldActivity.this); View view = inflater.inflate(R.layout.callout, null); Graphic gr = graphicsLayer.getGraphic(graphicIDs[0]); com.esri.core.geometry.Point location = new com.esri.core.geometry.Point( 1.2905771616285184E7, 3035967.556712447); Callout callout = mMapView.getCallout(); callout.setStyle(R.xml.calloutstyle); callout.setOffset(0, -15); callout.show(location, view); } Log.v(TAG, "OnSingleTapLinstener is running !"); } });
那么,接下来看看实现的效果: