Android高德地图poi检索仿微信发送位置实例代码

最近项目需求把发送定位模块改成类似微信发送位置给好友的效果,我使用了高德地图实现了一个demo,效果图如下:

从主界面中我们可以看到中心标记上面显示的就是我们定位的地址,下面是一个listview列表,第一条item的数据就是我们定位得到的地址,下面其余的都是我们根据定位得到的经纬度通过poi周边搜索得到的地址。我们进行了如下操作:

  1. 我们点击列表的item,中心标记会移动到该item对象的地址上面去。
  2. 我们手动移动地图的时候,中心标记的地址会发生相应的变化并且下面的列表也会发生相应的变化。
  3. 根据关键字poi搜索得到的列表,然后点击item主界面立马进行更新操作。

这里贴出主要代码,首先我们进行地图地位初始化操作:

@Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_map);
    mapView.onCreate(savedInstanceState);// 此方法必须重写
    if (aMap == null) {
      aMap = mapView.getMap();
      // 自定义系统定位小蓝点
      MyLocationStyle myLocationStyle = new MyLocationStyle();
      // 设置小蓝点的图标
      myLocationStyle.myLocationIcon(BitmapDescriptorFactory.
      fromResource(R.mipmap.ic_location_marker));// 设置小蓝点的图标
      myLocationStyle.strokeColor(0x7F0070D9);// 设置圆形的边框颜色
      myLocationStyle.radiusFillColor(0x130070D9);// 设置圆形的填充颜色
//       myLocationStyle.anchor(int,int)//设置小蓝点的锚点
      myLocationStyle.strokeWidth(1.0f);// 设置圆形的边框粗细
      aMap.setMyLocationStyle(myLocationStyle);
      aMap.setLocationSource(this);// 设置定位监听(1)
      aMap.setOnCameraChangeListener(this);//手动移动地图监听 (2)
      aMap.getUiSettings().setMyLocationButtonEnabled(true);// 设置默认定位按钮是否显示
      //设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false
      aMap.setMyLocationEnabled(true);
      aMap.moveCamera(CameraUpdateFactory.zoomTo(17.5f));
    }
    //------------------------------------------添加中心标记
    mMarkerOptions = new MarkerOptions();
    mMarkerOptions.draggable(false);//可拖放性
    mMarkerOptions.icon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_tips_nearby));
    mCenterMarker = aMap.addMarker(mMarkerOptions);
    ViewTreeObserver vto = mapView.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
      @Override
      public void onGlobalLayout() {
        mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        mCenterMarker.setPositionByPixels(mapView.getWidth() >> 1, mapView.getHeight() >> 1);
        mCenterMarker.showInfoWindow();
      }
    });
    //---------------------------------------------初始化正反编码类 (3)
    mGeocoderSearch = new GeocodeSearch(this);
    mGeocoderSearch.setOnGeocodeSearchListener(this);

  }

我们注意重点关注在上面的三个监听回调,1处是定位监听,有以下两个回调方法:

    //-----------------地图定位回调
  //激活定位
  @Override
  public void activate(OnLocationChangedListener onLocationChangedListener) {
    mListener = onLocationChangedListener;
    if (mlocationClient == null) {
      mlocationClient = new AMapLocationClient(this);
      mLocationOption = new AMapLocationClientOption();
      //设置定位监听
      mlocationClient.setLocationListener(this);(4)
      //设置为高精度定位模式
      mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
      //设置定位参数
      mlocationClient.setLocationOption(mLocationOption);
      // 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,
      // 注意设置合适的定位时间的间隔(最小间隔支持为2000ms),并且在合适时间调用stopLocation()
      // 方法来取消定位请求
      // 在定位结束后,在合适的生命周期调用onDestroy()方法
      // 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除
      mlocationClient.startLocation();
    }
  }

  //停止定位
  @Override
  public void deactivate() {
    mListener = null;
    if (mlocationClient != null) {
      mlocationClient.stopLocation();
      mlocationClient.onDestroy();
    }
    mlocationClient = null;
  }

4处的监听定位成功后会回调onLocationChanged这个方法,在这个方法里面我们可以获得定位到的经纬读,地址,显示出上面我们设置的自定义系统定位小蓝点出来等等,

  @Override
  public void onLocationChanged(AMapLocation aMapLocation) {
     //这个方法会循环执行
     mLongitude = aMapLocation.getLongitude();//经度
     mLatitude = aMapLocation.getLatitude();//纬度
     cityCode = aMapLocation.getCityCode();//citycode
  }

我们再来分析2处地图位置改变时回调:

  @Override
  public void onCameraChange(CameraPosition cameraPosition) {
  }

  @Override
  public void onCameraChangeFinish(CameraPosition cameraPosition) {
    /**这个方法很重要,虽然在上述的onLocationChanged方法我们也能获得坐标点的信息但是我们
      通常在这里获得定位坐标的经纬度,获得了经纬度后我们并不能知道该坐标点的具体坐标信息,所以
      需要把对应的坐标点转化为具体地址,这就是所谓的同步逆地理编码请求,和定位是黄金搭档
     */
       mCurrentPoint = new LatLonPoint(cameraPosition.target.
       latitude, cameraPosition.target.longitude);
      // 第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系
      RegeocodeQuery query = new RegeocodeQuery(mCurrentPoint, 200, GeocodeSearch.AMAP);
      mGeocoderSearch.getFromLocationAsyn(query);// 设置同步逆地理编码请求
  }

3处我们做的地理正反编码回调如下:

  //----------------逆地址编码回调:坐标->地址
  @Override
  public void onRegeocodeSearched(RegeocodeResult result, int rCode) {
    if (rCode == 0) {
      if (result != null && result.getRegeocodeAddress() != null &&
        result.getRegeocodeAddress().getFormatAddress() != null) {
     /**
     * 汽车服务|汽车销售|汽车维修|摩托车服务|餐饮服务|购物服务|生活服务|
     * 体育休闲服务|医疗保健服务|住宿服务|风景名胜|商务住宅|政府机构及社会团体
     * |科教文化服务|交通设施服务|金融保险服务|公司企业|道路附属设施|地名地址信息|公共设施
     */
        mPoiQuery = new PoiSearch.Query("", "住宿服务|公司企业",
        result.getRegeocodeAddress().getCityCode());
        mPoiQuery.setPageSize(10);// 设置每页最多返回多少条poiitem
        mPoiQuery.setPageNum(0);//设置查第一页
        PoiSearch poiSearch = new PoiSearch(this, mPoiQuery);
        poiSearch.setOnPoiSearchListener(this);//设置数据返回的监听器 (5)
        //设置周边搜索的中心点以及区域
        poiSearch.setBound(new PoiSearch.SearchBound(mCurrentPoint, 1500, true));
        poiSearch.searchPOIAsyn();//开始搜索
      } else {
        ToastUtil.show(mContext, R.string.no_result);
      }
    } else {
      ToastUtil.show(mContexts, rCode);
    }

  }

  //----------------地址编码回调:地址->坐标
  @Override
  public void onGeocodeSearched(GeocodeResult geocodeResult, int rCode) {

  }

我们在这儿进行了poi周边搜索操作,回调方法

  @Override
  public void onPoiSearched(PoiResult result, int rcode) {
    if (rcode == 0) {
      if (result != null && result.getQuery() != null) {// 搜索poi的结果
        if (result.getQuery().equals(query)) {// 是否是同一条
          poiItems = poiResult.getPois();// 取得第一页的poiitem数据,页数从数字0开始
          // 当搜索不到poiitem数据时,会返回含有搜索关键字的城市信息
          List<SuggestionCity> suggestionCities = poiResult
              .getSearchSuggestionCitys();
          /**
          * listviw具体操作逻辑
          */
        }
      } else if (suggestionCities != null
              && suggestionCities.size() > 0) {
            showSuggestCity(suggestionCities);
          }else {
        ToastUtil.show(mContexts, "对不起,没有搜索到相关数据!");
      }
    }
  }

  @Override
  public void onPoiItemSearched(PoiItem poiitem, int rcode) {

  }
  /**
   * poi没有搜索到数据,返回一些推荐城市的信息
   */
  private void showSuggestCity(List<SuggestionCity> cities) {
    String infomation = "推荐城市\n";
    for (int i = 0; i < cities.size(); i++) {
      infomation += "城市名称:" + cities.get(i).getCityName() + "城市区号:"
          + cities.get(i).getCityCode() + "城市编码:"
          + cities.get(i).getAdCode() + "\n";
    }
    ToastUtil.show(this, infomation);
  }

类似的含关键字的poi搜索也是类似的:

    // 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
    mPoiQuery = new PoiSearch.Query(key, "", cityCode);
    mPoiSearch = new PoiSearch(this, mPoiQuery);
    mPoiQuery.setPageSize(15);// 设置每页最多返回多少条poiitem
    mPoiQuery.setPageNum(0);//设置查第一页
    mPoiSearch.setOnPoiSearchListener(this);
    // 设置搜索区域为以lp点为圆心,其周围5000米范围
    LatLonPoint lp=new LatLonPoint(latitude,longitude);
    mPoiSearch.setBound(new PoiSearch.SearchBound(lp, 5000, true));
    mPoiSearch.searchPOIAsyn();//开始搜索

最后还有一个知识点就是我们点击item的时候地图自动去移动的实现,其实就是aMap.moveCamera方法去实现的,它会自动调用onCameraChangeFinish方法走的流程还是和我们手动拖动地图一样的。

复制代码 代码如下:

aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(poiItem.getLatLonPoint().getLatitude(), poiItem.getLatLonPoint().getLongitude()), 20));

基本上就是这样了,至于一些细节方面自己去调节和优化吧,哪些问题都不大。以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2017-04-11

[Android] 通过GridView仿微信动态添加本地图片示例代码

前面文章讲述的都是"随手拍"中图像处理的操作,此篇文章主要讲述GridView控件实现添加本地图片并显示.主要是关于GridView控件的基本操作,通常可以通过自定义继承BaseAdapter的适配器加载图片,而下面讲述的不是自定义的适配器,而是调用SimpleAdapter实现的.至于上传发布与网络交互此处不讲述,后面文章会讲! 一. 实现效果 主要是通过点击+从本地相册中添加图片,同时显示图片至GridView.点击图片可以进行删除操作,同时界面中的发布EditView控件也很好看

Android仿微信调用第三方地图应用导航(高德、百度、腾讯)

实现目标 先来一张微信功能截图看看要做什么 其实就是有一个目的地,点击目的地的时候弹出可选择的应用进行导航. 大脑动一下,要实现这个功能应该大体分成两步: 底部弹出可选的地图菜单进行展示 点击具体菜单某一项的时候调用对应地图的api进行导航就ok啦 底部菜单这里用PopupWindow来做. 实现 1.菜单显示 PopupWindow支持传入view进行弹出展示,所有我们直接写一个菜单布局,高德.百度.腾讯 再加一个取消. map_navagation_sheet.xml <?xml versi

Android仿微信之界面导航篇(1)

微信是现在比较流行的应用了,在各大安卓市场几乎都是名列前茅了. 说实话不得不羡慕腾讯庞大的用户群体,只要腾讯敢做,就会有很多人去用. 废话不多说,下面就开始说一下如何实现微信的第一次启动程序的用户导航,ViewPager相信大家都不陌生了,是google放出的一个安卓低版本的兼容包android-support-v4.jar,里面有很多类我们可以去使用.那这个导航就是使用这个类来辅助完成的,在每一个View里放置一个图片,当我们使用ViewPager滑动界面的时候,就会看到一张张图片,从而实现这

Android实现简单底部导航栏 Android仿微信滑动切换效果

Android仿微信滑动切换最终实现效果: 大体思路: 1. 主要使用两个自定义View配合实现; 底部图标加文字为一个自定义view,底部导航栏为一个载体,根据需要来添加底部图标; 2. 底部导航栏的设置方法类似于TabLayout的关联,View需要创建关联方法,用来关联VIewPager; 3. 通过关联方法获取ViewPager实例后,根据ViewPager页面数创建底部导航栏的图标按钮; 代码实现: 1. 新建第一个自定义View, 图标 + 文字 的底部按钮; /** * 自定义控件

Android仿微信5实现滑动导航条

本文实例为大家分享了Android 仿微信5滑动导航效果,供大家参考,具体内容如下 ViewPageAdapter.java package com.rong; import java.util.ArrayList; import java.util.List; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.view.View; publi

Android仿微信页面底部导航效果代码实现

大家在参考本地代码的时候要根据需要适当的修改,里面有冗余代码小编没有删除.好了,废话不多说了,一切让代码说话吧! 关键代码如下所示: .java里面的主要代码 public class MainActivity extends BaseActivity implements TabChangeListener { private Fragment[] fragments; private FragZaiXianYuYue fragZaiXianYuYue; private FragDaoLuJi

Android 仿微信底部渐变Tab效果

先来看一下效果图 除了第三个的发现Tab有所差别外,其他的基本还原了微信的底部Tab渐变效果 每个Tab都是一个自定义View,根据ImageView的tint属性来实现颜色渐变效果,tint属性的使用可以看我的上一篇文章 我将自定义View命名为ShadeView,包含四个自定义属性 意思分别为图标.背景色.底部文本.底部文本大小 <declare-styleable name="ShadeView"> <attr name="icon" for

Android仿微信底部菜单栏功能显示未读消息数量

底部菜单栏很重要,我看了一下很多应用软件都是用了底部菜单栏,这里使用了tabhost做了一种通用的(就是可以像微信那样显示未读消息数量的,虽然之前也做过但是layout下的xml写的太臃肿,这里去掉了很多不必要的层,个人看起来还是不错的,所以贴出来方便以后使用). 先看一下做出来之后的效果: 以后使用的时候就可以换成自己项目的图片和字体了,主框架不用变哈哈, 首先是要布局layout下xml文件 main.xml: <?xml version="1.0" encoding=&qu

Android仿微信图片点击全屏效果

废话不多说,先看下效果: 先是微信的 再是模仿的 先说下实现原理,再一步步分析 这里总共有2个Activity一个就是主页,一个就是显示我们图片效果的页面,参数通过Intent传送,素材内容均来自网络,(感谢聪明的蘑菇) 图片都是Glide异步下的,下的,下的重要的事情说三次,然后就是用动画做放大操作然后显示出来了(并没有做下载原图的实现,反正也是一样 下载下来Set上去而且动画都不需要更简便). OK,我们来看分析下 obj,目录下分别创建了2个对象,一个用来使用来处理显示页面的图片尺寸信息以

Android仿微信底部按钮滑动变色

Android仿微信底部按钮滑动变色,这里只针对使用Fragment为Tab页的滑动操作,进行简单的变色讲解. 首先说下OnPageChangeListener这个监听 //这个监听有三个方法 public abstract void onPageScrollStateChanged (int state) public abstract void onPageScrolled (int position, float positionOffset, int positionOffsetPixe

Android仿微信QQ设置图形头像裁剪功能

最近在做毕业设计,想有一个功能和QQ一样可以裁剪头像并设置圆形头像,额,这是设计狮的一种潮流. 而纵观现在主流的APP,只要有用户系统这个功能,这个需求一般都是在(bu)劫(de)难(bu)逃(xue)! 图片裁剪实现方式有两种,一种是利用系统自带的裁剪工具,一种是使用开源工具Cropper.本节就为大家带来如何使用系统自带的裁剪工具进行图片裁剪~ 还是先来个简单的运行图. 额,简单说下,我待会会把代码写成小demo分享给大家,在文章末尾会附上github链接,需要的可以自行下载~ 下面来简单分