最近开发的项目中需要使用到的功能,如下图所示:

服务器会传来一个包含项数据类型为坐标与时间的数组。

需要实现的功能有:

1.按时间顺序对每个点进行连线。

2.点击单个点会在点的上分dialog内显示时间(如下图)。

3.初始化定位至第一个点处。

代码实现:

1.按时间顺序对每个点进行连线。

思路:先服务器回传的ArrayList进行按时间排序:

  //按时间对结果集进行排序Collections.sort(msgInfo.getPageList(), new SortByTime());

然后依次画点和线:

        List<LatLng> latLngs = new ArrayList<LatLng>();for (MsgInfo.MsgBody body : msgInfo.getPageList()) {//添加点集合drawPoint(body.getLat(), body.getLng(), DateUtils.dateFormat(body.getDate().longValue() * 1000));//添加线集合latLngs.add(new LatLng(body.getLat(), body.getLng()));polyline = aMap.addPolyline(new PolylineOptions().addAll(latLngs).width(5).color(Color.argb(255, 255, 1, 1)));}

其中画点的方法为drawPoint:

  private void drawPoint(double v, double v1, String time) {MarkerOptions markerOption = new MarkerOptions();markerOption.position(new LatLng(v, v1));markerOption.title("定位时间:\n"+time);// markerOption.snippet("西安市:111");markerOption.draggable(true);markerOption.setFlat(true);aMap.addMarker(markerOption);}

2.点击单个点会在点的上分dialog内显示时间。

思路:需要让Amap实例设置OnMarkerClickListener监听。

OnMarkerClickListener监听初始化如下:

    AMap.OnMarkerClickListener onMarkerClickListener = new AMap.OnMarkerClickListener() {@Overridepublic boolean onMarkerClick(Marker arg0) {arg0.showInfoWindow();return false;}};

之后直接设置Amap的监听即可:

        aMap.setOnMarkerClickListener(onMarkerClickListener);

3.初始化定位至第一个点处。

思路: 获得数组第一个点位置并移动到该位置:
//移动到第一个位置
getAddress(msgInfo.getPageList().get(0).getLat(), msgInfo.getPageList().get(0).getLng());

定位Activity整体代码:

package com.hd.weixinandroid.ui.activity;import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.View;import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.maps.AMap;
import com.amap.api.maps.AMapOptions;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.LocationSource;
import com.amap.api.maps.MapView;
import com.amap.api.maps.UiSettings;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
import com.amap.api.maps.model.Polyline;
import com.amap.api.maps.model.PolylineOptions;
import com.amap.api.maps.model.TextOptions;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.geocoder.GeocodeAddress;
import com.amap.api.services.geocoder.GeocodeQuery;
import com.amap.api.services.geocoder.GeocodeResult;
import com.amap.api.services.geocoder.GeocodeSearch;
import com.amap.api.services.geocoder.RegeocodeQuery;
import com.amap.api.services.geocoder.RegeocodeResult;
import com.hd.weixinandroid.R;
import com.hd.weixinandroid.bean.MsgInfo;
import com.hd.weixinandroid.utils.AMapUtil;
import com.hd.weixinandroid.utils.DateUtils;
import com.ng.ngcommon.ui.activity.BaseActivity;
import com.ng.ngcommon.util.LogUtils;
import com.ng.ngcommon.util.ToastUtils;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;import butterknife.Bind;/*** Created by jiangzn on 16/12/5.*/public class LocationActivity extends BaseActivity implements LocationSource,AMapLocationListener, GeocodeSearch.OnGeocodeSearchListener {@Bind(R.id.map_location)MapView map_location;AMap aMap;private OnLocationChangedListener mListener;//mLocationClient对象public AMapLocationClient mLocationClient = null;//mLocationOption对象public AMapLocationClientOption mLocationOption = null;//比例尺组件private UiSettings mUiSettings;//搜索组件private GeocodeSearch geocoderSearch;private Marker geoMarker;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);map_location.onCreate(savedInstanceState);}@Overrideprotected int getContentViewLayoutID() {return R.layout.location_activity;}@Overrideprotected void onClick(View view) {}Polyline polyline;MsgInfo msgInfo;@Overrideprotected void initViewsAndEvents() {msgInfo = (MsgInfo) getIntent().getSerializableExtra("date");if (aMap == null) {aMap = map_location.getMap();mUiSettings = aMap.getUiSettings();mUiSettings.setLogoPosition(AMapOptions.LOGO_POSITION_BOTTOM_LEFT);// 设置地图logo显示在左下方mUiSettings.setScaleControlsEnabled(true);  //设置地图的比例尺显示setUpMap();geoMarker = aMap.addMarker(new MarkerOptions().anchor(0.5f, 0.5f).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)));}geocoderSearch = new GeocodeSearch(this);geocoderSearch.setOnGeocodeSearchListener(this);//按时间对结果集进行排序Collections.sort(msgInfo.getPageList(), new SortByTime());List<LatLng> latLngs = new ArrayList<LatLng>();for (MsgInfo.MsgBody body : msgInfo.getPageList()) {//添加点集合drawPoint(body.getLat(), body.getLng(), DateUtils.dateFormat(body.getDate().longValue() * 1000));//添加线集合latLngs.add(new LatLng(body.getLat(), body.getLng()));polyline = aMap.addPolyline(new PolylineOptions().addAll(latLngs).width(5).color(Color.argb(255, 255, 1, 1)));}//移动到第一个位置getAddress(msgInfo.getPageList().get(0).getLat(), msgInfo.getPageList().get(0).getLng());}class SortByTime implements Comparator {public int compare(Object o1, Object o2) {MsgInfo.MsgBody b1 = (MsgInfo.MsgBody) o1;MsgInfo.MsgBody b2 = (MsgInfo.MsgBody) o2;if (b1.getDate() > b2.getDate())return 1;return 0;}}private void setUpMap() {aMap.moveCamera(CameraUpdateFactory.zoomTo(0)); //设置缩放为0,则一进来就显示整个中国大陆aMap.setLocationSource(this);// 设置定位监听aMap.getUiSettings().setMyLocationButtonEnabled(true);// 设置默认定位按钮是否显示//添加标记// aMap.setMapType(AMap.MAP_TYPE_SATELLITE);// 卫星地图模式aMap.setMyLocationEnabled(true);// 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false// 设置定位的类型为定位模式 ,可以由定位、跟随或地图根据面向方向旋转几种//  aMap.setMyLocationType(AMap.LOCATION_TYPE_LOCATE);aMap.setOnMarkerClickListener(onMarkerClickListener);}@Overrideprotected View getLoadingTargetView() {return null;}@Overridepublic void onLocationChanged(AMapLocation amapLocation) {if (mListener != null && amapLocation != null) {if (amapLocation != null&& amapLocation.getErrorCode() == 0) {mListener.onLocationChanged(amapLocation);// 显示系统小蓝点} else {String errText = "定位失败," + amapLocation.getErrorCode() + ": " + amapLocation.getErrorInfo();Log.e("AmapErr", errText);}}}@Overridepublic void activate(OnLocationChangedListener listener) {mListener = listener;if (mLocationClient == null) {mLocationClient = new AMapLocationClient(this);mLocationOption = new AMapLocationClientOption();//设置定位监听mLocationClient.setLocationListener(this);//设置为高精度定位模式mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//设置定位参数mLocationClient.setLocationOption(mLocationOption);// 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,// 注意设置合适的定位时间的间隔(最小间隔支持为2000ms),并且在合适时间调用stopLocation()方法来取消定位请求// 在定位结束后,在合适的生命周期调用onDestroy()方法// 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除//这里无需一直对自己定位//mLocationClient.startLocation();}}@Overridepublic void deactivate() {mListener = null;if (mLocationClient != null) {mLocationClient.stopLocation();mLocationClient.onDestroy();}mLocationClient = null;}String addressName;LatLonPoint latLonPoint;@Overridepublic void onRegeocodeSearched(RegeocodeResult result, int rCode) {if (rCode == 1000) {if (result != null && result.getRegeocodeAddress() != null&& result.getRegeocodeAddress().getFormatAddress() != null) {addressName = result.getRegeocodeAddress().getFormatAddress()+ "附近";aMap.animateCamera(CameraUpdateFactory.newLatLngZoom(AMapUtil.convertToLatLng(latLonPoint), 15));geoMarker.setPosition(AMapUtil.convertToLatLng(latLonPoint));ToastUtils.showToast(this, "最近位置:" + addressName);} else {ToastUtils.showToast(this, "没有查询到结果");}} else {ToastUtils.showToast(this, rCode);}}@Overridepublic void onGeocodeSearched(GeocodeResult result, int rCode) {if (rCode == 1000) {if (result != null && result.getGeocodeAddressList() != null&& result.getGeocodeAddressList().size() > 0) {GeocodeAddress address = result.getGeocodeAddressList().get(0);aMap.animateCamera(CameraUpdateFactory.newLatLngZoom(AMapUtil.convertToLatLng(address.getLatLonPoint()), 15));geoMarker.setPosition(AMapUtil.convertToLatLng(address.getLatLonPoint()));addressName = "经纬度值:" + address.getLatLonPoint() + "\n位置描述:"+ address.getFormatAddress();ToastUtils.showToast(this, addressName);} else {ToastUtils.showToast(this, "没有查询到结果~!");}} else {ToastUtils.showToast(this, rCode);}}/*** 响应地理编码*/public void getLatlon(final String name) {//showDialog();GeocodeQuery query = new GeocodeQuery(name, "0086");// 第一个参数表示地址,第二个参数表示查询城市,中文或者中文全拼,citycode、adcode,geocoderSearch.getFromLocationNameAsyn(query);// 设置同步地理编码请求}private void getAddress(double v, double v1) {this.latLonPoint = new LatLonPoint(v, v1);RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 100,GeocodeSearch.AMAP);// 第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系geocoderSearch.getFromLocationAsyn(query);// 设置同步逆地理编码请求}private void drawPoint(double v, double v1, String time) {MarkerOptions markerOption = new MarkerOptions();markerOption.position(new LatLng(v, v1));markerOption.title("定位时间:\n"+time);// markerOption.snippet("西安市:111");markerOption.draggable(true);markerOption.setFlat(true);aMap.addMarker(markerOption);}AMap.OnMarkerClickListener onMarkerClickListener = new AMap.OnMarkerClickListener() {@Overridepublic boolean onMarkerClick(Marker arg0) {arg0.showInfoWindow();return false;}};}

Android——高德地图实现多点连线与点击定位监听实现相关推荐

  1. android 判断按钮是否已经有onclicklinstener,通过点击事件监听setOnClickListener彻底理解回调...

    前言 老司机们对于回调肯定熟悉得不能再熟悉了,但是新司机可能还是一脸懵逼的,我比较笨,当年懵逼了好久,看夏安明的这一篇博客地址,虽然下边的留言都是,写得好!懂了懂了!但是我当时看了三遍还是不懂好吗 - ...

  2. Android 高德地图API(详细步骤+源码)

    高德地图API使用详解 前言 正文 一.创建应用 ① 获取PackageName ② 获取调试版安全码SHA1 ③ 获取发布版安全码SHA1 二.配置Android Studio工程 ① 导入SDK ...

  3. Android 高德地图定位和导航

    1. 在高德开放平台注册帐号 2.在高德地图开发平台中下载Android平台下载地图SDK和定位SDK和导航SDK文件 3. 添加jar包,将jar包放入工程的libs目录下. (下载的三合一的SDK ...

  4. Android 高德地图中路线规划绘制界面线路

    Android 高德地图中路线规划绘制界面线路 下面代码是根据很多的经纬度的点,绘制出直线的线路.比较死板 /*** 绘制景区的路线*/private void setRouteInfo(List&l ...

  5. Android 高德地图地铁信息查询

    Android 高德地图地铁信息查询 欢迎查看本篇文章 前言 使用 结尾 欢迎查看本篇文章 首先感谢高德技术人员协助帮助我解决疑问,本文需要您花费10分钟左右. 前言 由于想在地图上描绘地铁线突出显示 ...

  6. Android高德地图自定义Markers的例子

    下文为各位重点介绍关于Android高德地图自定义Markers的例子,希望这篇文章能够让各位理解到Android高德地图自定义Markers的方法. 之前的博客里说了地图的嵌入和定位,今天就说说在地 ...

  7. android 高德地图SDK报 KEY鉴权失败

    android 高德地图SDK报 KEY鉴权失败. 一般在项目被转移,或项目使用的SDK被其他项目使用时,会发生这种情况! 解决办法 进入高德地图api控制台 点应用管理-我的应用-创建应用 - 根据 ...

  8. Android 高德地图(带有定位和点击显示经度纬度)

    Android高德地图测试,如下: 1.Android高德地图Demo地址下载:       下载android高德地图Demo 1.2 Android定位SDK 一键下载 1.3 下载好的文件zip ...

  9. android 高德地图 lbstraceclient,安卓高德地图定位篇-(1)

    安卓高德地图定位.先看效果图: STEP1: 先去高德开放平台注册账号,这个不用多说吧 网址:https://lbs.amap.com/ 之后再去控制台-应用管理找到自己的key,如下图所示 STEP ...

最新文章

  1. libgstreamer-1.0.so.0: cannot open shared object file: No such file or directory
  2. 超融合服务器品牌型号,蓝盾发布云平台!强势加入云计算IT行列
  3. 32边界的链码表示MPP算法MATLAB实现
  4. python和c++哪个好学-C++和Python哪一个更好?
  5. pb9数据窗口中显示行数据与当前行区别_Hive的窗口函数
  6. 关于我自己的三个层次
  7. Flink State 有可能代替数据库吗?
  8. SDK中利用COM打印helloworld时报错DONE pin is not high on target FPGA的一种可能的解决办法
  9. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_6_BufferedReader_字符缓冲输入流...
  10. rgba通道转rgb_image – 将RGBA颜色转换为RGB
  11. SAP ABAP 字符串替换
  12. prometheus+grafana搭建监控平台监控压测服务器mysql性能
  13. DBF文件的初步了解(一)
  14. 蓝牙盾/颈椎按摩仪/迷你充电宝/探头温度记等,段码LCD液晶显示驱动IC-VK1088B QFN32 4*4超小体积,22seg*4com且可通过指令进入省电模式
  15. 使用poi导出excel,及合并单元格边框显示问题
  16. Unity 自动化打包XCode工程
  17. PIPI1003: 最少钱币数c++
  18. 【RS】关于路由器ping不通直连的几种原因(3)
  19. QQ卡丁车:腾讯自主研发的联网对战赛车游戏
  20. a|b 到底是谁整除谁

热门文章

  1. 新型的火灾报警系统设有多个设备联动的模式,其能够服务于智能化以及化的火灾报警
  2. html 穿越星空效果,html5 canvas绚丽3d星空飞行穿梭动画特效
  3. 攻防世界 pwn forgot
  4. 【Image2Lcd X TFT_LCD】—— 图片取模软件使用
  5. 冬奥闭幕 不说再见 中国移动咪咕与王濛开启全新合作
  6. 三、HTML5之文本元素
  7. css应该写在html语言的哪个标记里,CSS布局的选择题
  8. python可视化(4)色板(mpl.colors, colormap, plt.cm, palette)
  9. MMGG热点 ▏AssangeDAO提案
  10. 【Python实战】 ---- 爬虫 爬取LOL英雄皮肤图片