安卓高德地图 - (多个标记Marker+自定义弹窗InfoWindow+反编码坐标转地址3)

xiaoxiao2021-02-28  19

1、效果图

目前最新jar:AMap_Search_V5.7.0_20171229.jar 可到官网下载SDK资源

2、新建个实体类,包含4个参数用来描述点信息 - MarketBean

public class MarketBean { /** * 纬度 */ private double latitude; /** * 经度 */ private double longitude; /** * 标题 */ private String title; /** * 内容 */ private String content; public double getLatitude() { return latitude; } public void setLatitude(double latitude) { this.latitude = latitude; } public double getLongitude() { return longitude; } public void setLongitude(double longitude) { this.longitude = longitude; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public MarketBean(double latitude, double longitude, String title, String content) { this.latitude = latitude; this.longitude = longitude; this.title = title; this.content = content; } }

在初始化的时候调用即可

/** * 添加多个market */ private List<MarketBean> marketList; private void addMoreMarket() { if (marketList == null) { marketList = new ArrayList<>(); } //模拟6个假数据 marketList.add(new MarketBean(22.675, 114.028, "标题1", "内容1")); marketList.add(new MarketBean(22.694, 114.099, "标题2", "内容2")); marketList.add(new MarketBean(22.667, 114.041, "标题3", "内容3")); marketList.add(new MarketBean(22.647, 114.023, "标题4", "内容4")); marketList.add(new MarketBean(22.688, 114.066, "标题5", "内容5")); marketList.add(new MarketBean(22.635, 114.077, "标题6", "内容6")); for (int i = 0; i < marketList.size(); i++) { aMap.addMarker(new MarkerOptions().anchor(1.5f, 3.5f) .position(new LatLng(marketList.get(i).getLatitude(),//设置纬度 marketList.get(i).getLongitude()))//设置经度 .title(marketList.get(i).getTitle())//设置标题 .snippet(marketList.get(i).getContent())//设置内容 // .setFlat(true) // 将Marker设置为贴地显示,可以双指下拉地图查看效果 .draggable(true) //设置Marker可拖动 .icon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher))); } //设置自定义弹窗 aMap.setInfoWindowAdapter(new WindowAdapter(this)); //绑定信息窗点击事件 aMap.setOnInfoWindowClickListener(new WindowAdapter(this)); aMap.setOnMarkerClickListener(new WindowAdapter(this)); }

自定义弹窗(自定义 InfoWindow 之后所有的内容更新都需要用户自己完成) - WindowAdapter

public class WindowAdapter implements AMap.InfoWindowAdapter, AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener{ private Context context; private static final String TAG = "WindowAdapter"; public WindowAdapter(Context context) { this.context = context; } @Override public View getInfoWindow(Marker marker) { //关联布局 View view = LayoutInflater.from(context).inflate(R.layout.layout_info_item, null); //标题 TextView title = (TextView) view.findViewById(R.id.info_title); //地址信息 TextView address = (TextView) view.findViewById(R.id.info_address); //纬度 TextView latitude = (TextView) view.findViewById(R.id.info_latitude); //经度 TextView longitude = (TextView) view.findViewById(R.id.info_longitude); title.setText(marker.getTitle()); address.setText(marker.getSnippet()); latitude.setText(marker.getPosition().latitude + ""); longitude.setText(marker.getPosition().longitude + ""); Log.e(TAG, "getInfoWindow1: "+marker.getTitle() ); Log.e(TAG, "getInfoWindow: "+marker.getSnippet() ); Log.e(TAG, "getInfoWindow: "+marker.getPosition().latitude ); Log.e(TAG, "getInfoWindow: "+marker.getPosition().longitude ); return view; } //如果用自定义的布局,不用管这个方法,返回null即可 @Override public View getInfoContents(Marker marker) { return null; } // marker 对象被点击时回调的接口 // 返回 true 则表示接口已响应事件,否则返回false @Override public boolean onMarkerClick(Marker marker) { Log.e(TAG, "Marker被点击了"); return false; } //绑定信息窗点击事件 @Override public void onInfoWindowClick(Marker marker) { Log.e(TAG, "InfoWindow被点击了"); } }

布局文件 - layout_info_item

<?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:showDividers="middle" android:padding="10dp" android:background="@drawable/info_shape" android:divider="@drawable/line_shape" android:orientation="vertical"> <TextView android:id="@+id/info_title" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/info_address" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/info_latitude" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/info_longitude" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>

注意要设置InfoWindow的背景样式(颜色、图片均可),否者会使用高德默认背景

info_shape:

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <corners android:radius="10dp"/> <stroke android:width="1dp" android:color="#666"/> <solid android:color="#fff"/> </shape>

line_shape:

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <size android:width="100dp" android:height="1dp" /> <solid android:color="#666" /> </shape>

3、反编码坐标、地址转换 - (移动地图任意一点获取当前位置信息)

地图滑动监听事件:

//滑动监听 aMap.setOnCameraChangeListener(new AMap.OnCameraChangeListener() { //滑动中的经纬度 @Override public void onCameraChange(CameraPosition cameraPosition) { //经度 double longitude = cameraPosition.target.longitude; //纬度 double latitude = cameraPosition.target.latitude; Log.e(TAG, "onCameraChange滑动中: " + longitude); Log.e(TAG, "onCameraChange滑动中: " + latitude); } //滑动结束时的经纬度 @Override public void onCameraChangeFinish(CameraPosition cameraPosition) { //经度 double longitude = cameraPosition.target.longitude; //纬度 double latitude = cameraPosition.target.latitude; //传入结束时的经纬度坐标 getAddressByLatLonPoint(new LatLonPoint(latitude, longitude)); Log.e(TAG, "onCameraChangeFinish滑动结束: " + longitude); Log.e(TAG, "onCameraChangeFinish滑动结束: " + latitude); } }); } /** * 反编码坐标转地址 * RegeocodeQuery [坐标转地址] * GeocodeQuery [地址转坐标] */ private void getAddressByLatLonPoint(final LatLonPoint latLonPoint) { GeocodeSearch geocodeSearch = new GeocodeSearch(this); //一参数表示经纬度,二参数表示范围多少米,三参数表示是地图坐标系还是GPS坐标系 RegeocodeQuery regeocodeQuery = new RegeocodeQuery(latLonPoint, 2000, GeocodeSearch.AMAP); geocodeSearch.getFromLocationAsyn(regeocodeQuery); //address表示地址,第二个参数表示查询城市,中文或者中文全拼,citycode、adcode都ok GeocodeQuery query=new GeocodeQuery("赣州市", "赣州市"); geocodeSearch.getFromLocationNameAsyn(query); //监听逆地理编码结果 geocodeSearch.setOnGeocodeSearchListener(new GeocodeSearch.OnGeocodeSearchListener() { @Override public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int i) { //i为1000为成功 if (i == 1000) { RegeocodeAddress regeocodeAddress = regeocodeResult.getRegeocodeAddress(); //当前地图中心的地点(其他信息可通过regeocodeAddress.出来) String formatAddress = regeocodeAddress.getFormatAddress(); address.setText(formatAddress); Log.e(TAG, "onCameraChange经纬度转换的地址: " + formatAddress); } else { Log.e(TAG, "暂无此地信息...: "); } } @Override public void onGeocodeSearched(GeocodeResult geocodeResult, int i) { if (i==1000){ Log.e(TAG, "onCameraChange查询的地址: " + geocodeResult.getGeocodeQuery().getLocationName()); Log.e(TAG, "onCameraChange查询的城市: " + geocodeResult.getGeocodeQuery().getCity()); Log.e(TAG, "onCameraChange查询的纬度: " + geocodeResult.getGeocodeAddressList().get(0).getLatLonPoint().getLatitude()); Log.e(TAG, "onCameraChange查询的经度: " + geocodeResult.getGeocodeAddressList().get(0).getLatLonPoint().getLongitude()); }else { Log.e(TAG, "查询失败...: "); } } }); }

其中address.setText(formatAddress); 自行在布局中添加一个TextView并初始化即可

转载请注明原文地址: https://www.6miu.com/read-2595536.html

最新回复(0)