高德地图Android API 长按地图显示地址信息 示例
![]() | ![]() | |
![]() | 长按地图某点显示位置信息开发步骤 本文主要介绍Android 手势操作长按地图某点显示该点地理位置信息的功能。通过构造一个locationSelectOverlay类来定义该功能,在地图上对长按手势进行监听,一旦有这个事件发生就调用getAddressFromServer()方法来显示地址信息。 步骤如下: (1) 右键点击工程,在Build Path>Configure Build Path…>libraries 中选择“Add Externel JARs…”,选定MapApi.jar,点击OK,这样就可以将高德地图Android API 库文件引入。 (2) 在工程的AndroidManifest.xml 中设置网络相关权限。
<uses-permission android:name="android.permission.interNET"></uses-permission> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> <uses-permission android:name="android.permission.CHANGE_wifi_STATE"></uses-permission> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
(3) 在工程的res/layout 文件夹下新建页面布局文件。此处需要的文件为activity_long_press_map.xml,geocoder.xml和drawable 文件夹显示提示框背景。 geocoder.xml 设置地图显示布局,显示id为geocode_MapView的地图视图。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <com.amap.mapapi.map.MapView android:id="@+id/geocode_MapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" > </com.amap.mapapi.map.MapView> </LinearLayout>
activity_long_press_map.xml 设置弹出框的背景图片和文字布局。 <?xml version="1.0" encoding="UTF-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/GeoLinearLayoutPopup" android:layout_width="wrap_content" android:layout_height="wrap_content" //设置背景为drawable文件夹下的tip_pointer_button.xml文件 android:background="@drawable/tip_pointer_button" android:baselineAligned="_baseline" android:clickable="true" android:focusable="true" android:orientation="horizontal" > //文本框id为GeoName <LinearLayout android:layout_gravity="center_vertical" android:orientation="vertical" android:id="@+id/LinearLayoutPoi" android:paddingLeft="5.0dip" android:paddingRight="5.0dip" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:textSize="16.0sp" android:textColor="#ff000000" android:id="@+id/GeoName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" android:singleLine="true" /> </LinearLayout> </LinearLayout>
drawable 文件夹 此文件夹是显示提示框的背景布局文件和背景图片文件。 显示效果图如下所示: 图片:20121015112610771.png
长按地图显示效果
(4) 在该工程中分别定义4个类longPressMap.java,locationSelectOverlay.java,popUpPanel.java,Constants.java。 l longPressMap.java 为显示一个地图类,通过实例化一个locationSelectOverlay类实现长按地图显示地理位置信息功能。 LongPressMap类示例代码如下: //longPressMap 类继承MapActivity对mapview资源进行管理 public class longPressMap extends MapActivity {
private MapView mMapView; locationSelectOverlay mSelectLay; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //使用setContentView方法调用R.layout.activity_regeocoder布局文件,显示地图 setContentView(R.layout.geocoder); //获取地图视图的id,赋值给mMapView mMapView = ((MapView) findViewById(R.id.geocode_MapView)); // 设置启用内置的缩放控件 mMapView.setBuiltInZoomControls(true); //实例化一个locationSelectOverlay类 mSelectLay = new locationSelectOverlay(this, mMapView, new popUpPanel(this, mMapView)); //将该功能加载到此地图上,启用长按地图显示该点地址信息的功能 mMapView.getOverlays().add(mSelectLay); } }
locationSelectOverlay类示例代码如下:
//locationSelectOverlay类继承Overlay接口,实现OnGestureListener手势监听 public class locationSelectOverlay extends Overlay implements OnGestureListener { public popUpPanel mTipPanel; //声明一个弹出框对象 GeoPoint mSelectPoint; //声明一个地理坐标点对象 MapView mMapView; //声明一个地图视图对象 Context mContext; //活动对象 TextView mTipText=null; //声明一个文本对象 private static String nearbystr=""; private GestureDetector gestureScanner; //声明一个手势监听对象 private Geocoder coder; //声明一个逆地理编码对象 private String addressName=""; //声明一个地址名称字符串
//长按地图某点获取信息的构造函数。 public locationSelectOverlay(Activity context,MapView mapView,popUpPanel panel) { this.mContext=context; this.mMapView=mapView; this.mTipPanel=panel; gestureScanner = new GestureDetector(this); //声明一个手势监听对象 coder = new Geocoder(context); //声明一个逆地理编码对象 } //用Handler函数处理传递来的地址信息,显示在文本框中 private Handler mGeocoderHandler = new Handler() { public void handleMessage(Message msg) { //如果有地址信息的消息发送过来,将文本框中设置为该地址信息 if(msg.what == Constants.REOCODER_RESULT) { if(mTipText!=null) mTipText.setText(addressName); } //如果显示错误,则文本框中设置报错信息 else if(msg.what == Constants.ERROR) { Toast.makeText(mContext, "获取地址失败,请重试", Toast.LENGTH_SHORT).show(); removeTipPanel(); } } }; //显示弹出窗口 public boolean showTap(GeoPoint p) { View view = mTipPanel.getView(); mMapView.removeView(view); //布局参数设置 MapView.LayoutParams geoLP = new MapView.LayoutParams( MapView.LayoutParams.WRAP_CONTENT, MapView.LayoutParams.WRAP_CONTENT, p, MapView.LayoutParams.BOTTOM_CENTER); //弹出窗口的文本显示 mTipText = (TextView) view.findViewById(R.id.GeoName); mTipText.setText("正在加载地址..."); mTipText.setOnClickListener(new OnClickListener() { public void onClick(View v) { } }); //在地图视图上添加该弹出窗口视图 mMapView.addView(view, geoLP); return false; } //从经纬度坐标点获取对应的地址信息 public void getAddressFromServer(final GeoPoint point,final Handler handler) { //声明一个线程 new Thread(){ public void run() { try { // 逆地理编码getFromLocation()函数获取该点对应的前3个地址信息 List<Address> address = coder.getFromLocation((double)point.getLatitudeE6()/1E6, (double)point.getLongitudeE6()/1E6, 3); if (address != null) { //获取第一个地址信息 Address addres = address.get(0); addressName = ""; if(addres.getAdminArea()!=null) addressName+=addres.getAdminArea(); if(addres.getSubLocality()!=null) addressName += addres.getSubLocality(); if(addres.getFeatureName()!=null) addressName += addres.getFeatureName(); addressName += "附近"; handler.sendMessage(Message .obtain(handler, Constants.REOCODER_RESULT));
} } catch (AMapException e) { // TODO Auto-generated catch block handler.sendMessage(Message .obtain(handler, Constants.ERROR)); } } }.start(); //线程启动 } //移走弹出窗口 public void removeTipPanel() { View view = mTipPanel.getView(); mMapView.removeView(view); } //获取手势操作 public boolean onTouchEvent(MotionEvent event, MapView mapView) { return gestureScanner.onTouchEvent(event); }
@Override public boolean onDown(MotionEvent e) { // TODO Auto-generated method stub return false; }
@Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { // TODO Auto-generated method stub
return false; } //长按地图,弹出提示框,显示该点地址信息 @Override public void onLongPress(MotionEvent e) { // TODO Auto-generated method stub int x = (int)e.getX(); int y = (int)e.getY(); mSelectPoint = mMapView.getProjection().fromPixels(x, y); //调用显示提示框函数 showTap(mSelectPoint); //调用从经纬度点获取地址信息函数 getAddressFromServer(mSelectPoint,mGeocoderHandler); }
@Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // TODO Auto-generated method stub return false; }
@Override public void onShowPress(MotionEvent e) { // TODO Auto-generated method stub
}
@Override public boolean onSingleTapUp(MotionEvent e) { // TODO Auto-generated method stub
return false; }
}
pouUpPanel定义了弹出窗口类 弹出窗口类的示例代码如下: public class popUpPanel { private boolean isVisible = false; private MapView mMapView; private View popup;
public popUpPanel(Activity paramActivity, MapView paramMapView) { this.mMapView = paramMapView; ViewGroup localViewGroup = (ViewGroup)this.mMapView.getParent(); //设置弹出的视图是id为R.layout.activity_long_press_map的视图 this.popup = paramActivity.getLayoutInflater().inflate(R.layout.activity_long_press_map, localViewGroup, false); …
l Constants 定义了传递的常量对应的值,如public static finalint REOCODER_RESULT=3000; 表示逆地理编码结果常量,public staticfinal int ERROR=1001; 表示出现错误常量。 | |
![]() | ![]() |