高德地图Android API 长按地图显示地址信息 示例
2012-10-15 10:28
381 查看
1 长按地图某点显示位置信息开发步骤
本文主要介绍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> |
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> |
<?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> |
此文件夹是显示提示框的背景布局文件和背景图片文件。
显示效果图如下所示:
![](http://img.my.csdn.net/uploads/201210/15/1350268293_3194.png)
长按地图显示效果 |
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类继承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; } } |
弹出窗口类的示例代码如下:
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); … |
学到新知识了?快来2014高德LBS应用大赛操练起来吧!
http://2014lbs.amap.com/
相关文章推荐
- googlemap 高德地图mapabc 图吧 显示地图,标注一个或多个poi信息点,弹出气泡显示poi点的位置信息
- [置顶] 手把手叫你如何集成高德地图,实现地图显示、定位蓝点、大头针显示、获取周围地点信息等
- 百度地图点击地图,标点并显示地址信息
- 仿百度外卖3_7_1百度地图拖动定位,显示附近地址poi提示搜索
- 高德地图Web端JavaScript API开发(一)---3D地图显示
- 百度,谷歌地图显示区域多轮廓示例
- 百度地图的使用之获取数据库表中信息的坐标点显示在地图上
- ArcGIS For JavaScript API Show map properties(显示地图信息)————(十二)
- 输出pojo类的信息时,显示包名加地址的情况
- ECSHOP购物流程收货人信息详细地址显示省市区
- Android手机智能定位并在地图上显示地址
- 【angular】——高德地图结合angular4获取地图中某一点信息
- PHP连接mysql数据库,调用Google Map显示不同地方地图信息,使用Javascript弹出悬浮信息窗口展示。
- 地图网站显示实时交通路况信息的原理
- ios通过google map显示地图和乘车信息
- ArcGIS For Android 在地图上显示属性图形信息和属性文本信息
- ios通过google map显示地图和乘车信息
- iOS开发——高德地图调研之显示地图、定位与地理编码等
- Android引路蜂地图开发示例:地址反编码
- 高德地图将某个点显示在地图上(重点是居中显示)