利用百度地图Android sdk高仿微信发送位置功能及遇到的问题

利用百度地图Android sdk高仿微信发送位置功能及遇到的问题,第1张

概述接触了百度地图开发平台半个月了,这2天试着模仿了微信给好友发送位置功能,对百度地图的 *** 作能力又上了一个台阶

接触了百度地图开发平台半个月了,这2天试着模仿了微信给好友发送位置功能,对百度地图的 *** 作能力又上了一个台阶

 我在实现这个功能的时候,遇到一些困难,可能也是别人将会遇到的困难,特在此列出

1、在微信发送功能中,不管用户如何拖拽地图,总有个覆盖物固定了MapVIEw中央,怎么实现?

    其实这很容易实现,只要MapVIEw的布局文件中,将一个ImageVIEw覆盖在MapVIEw的中央,就能够实现不管用户如何拖拽地图,覆盖物(ImageVIEw)总固定总MapVIEw中央

2、如何获取MapVIEw中央的地理坐标,也即是屏幕覆盖物处的坐标?

    要获取MapVIEw中央的地理坐标,首先先获取覆盖物在屏幕上的物理坐标,这里得区别一下地理坐标(经纬度)和物理坐标(xy轴);

   可以通过

<mCenterPoint = mBaIDuMap.getMapStatus().targetScreen;//mBaIDuMap是BaIDuMap类的实例 

来获取物理坐标,这个物理坐标是不变的,而物理坐标对应的地理坐标却是随着用户拖拽地图而改变,所以,当我们需要地理坐标时,可以通过

currentLatLng = mBaIDuMap.getProjection().fromScreenLocation(       mCenterPoint);</strong></span> 

获取。

3、如何获取该地理坐标周围的所有poi信息(也就是周围建筑物的信息),而不只是某个类型的兴趣点?

为了实现这个功能,真是费了我好大劲,因为我之前一直以为用POI周边搜索实现的,有人提示我可以通过循环轴线搜索实现不同关键字搜索,但这样子确实很难实现跟微信那样的效果。通过查看API,发现可以通过反地理编码解决这个问题,至于什么事反地理编码,可以到百度地图官网了解,通过调用它,可以返回一个该地理坐标附近建筑信息的一个列表

4、当用户拖拽地图,如何让列表更新到目前中心地理位置的周边信息?

这个困难其实也不难实现,只是重写mBaIDuMap.setonMaptouchListener(touchListener);触摸事件,在触摸监听器的回调函数中

将MapVIEw中央的物理坐标转换成对应的地理坐标,再通过反地理编码获取周边信息,道理同问题3

5、当点击ListvIEw某一项时,如何将项地理位置显示在MapVIEw也就是屏幕中央?

很简单,通过ListvIEw的适配器获取item的位置信息,包括经纬度,然后用动画跳转到屏幕中央位置即可。

我认为上面5个问题是实现这个功能的关键所在,下面是效果图

上面是一个MapVIEw,覆盖物固定在其中央,地图左下角的白色正方形是回到定位点的按钮,因为没找到好看的图片,就留着空白了

下面是一个ListVIEw,显示地图指示地点周围的一些位置信息

贴一下实现该功能的核心代码

Activity类

package com.vr.souhuodong.UI.sou; import java.util.ArrayList; import java.util.List; import androID.app.Activity; import androID.content.Intent; import androID.graphics.Point; import androID.net.Uri; import androID.os.Bundle; import androID.vIEw.MotionEvent; import androID.vIEw.VIEw; import androID.Widget.AdapterVIEw; import androID.Widget.AdapterVIEw.OnItemClickListener; import androID.Widget.ImageVIEw; import androID.Widget.ListVIEw; import androID.Widget.Progressbar; import com.baIDu.location.BDLocation; import com.baIDu.location.BDLocationListener; import com.baIDu.location.LocationClIEnt; import com.baIDu.location.LocationClIEntoption; import com.baIDu.mapAPI.map.BaIDuMap; import com.baIDu.mapAPI.map.BaIDuMap.OnMaptouchListener; import com.baIDu.mapAPI.map.BitmapDescriptor; import com.baIDu.mapAPI.map.BitmapDescriptorFactory; import com.baIDu.mapAPI.map.MapStatusUpdate; import com.baIDu.mapAPI.map.MapStatusUpdateFactory; import com.baIDu.mapAPI.map.MapVIEw; import com.baIDu.mapAPI.map.MarkerOptions; import com.baIDu.mapAPI.map.MyLocationConfiguration; import com.baIDu.mapAPI.map.MyLocationConfiguration.LocationMode; import com.baIDu.mapAPI.map.MyLocationData; import com.baIDu.mapAPI.map.OverlayOptions; import com.baIDu.mapAPI.model.LatLng; import com.baIDu.mapAPI.search.core.PoiInfo; import com.baIDu.mapAPI.search.core.SearchResult; import com.baIDu.mapAPI.search.geocode.GeoCodeResult; import com.baIDu.mapAPI.search.geocode.GeoCoder; import com.baIDu.mapAPI.search.geocode.OnGetGeoCoderResultListener; import com.baIDu.mapAPI.search.geocode.ReverseGeoCodeOption; import com.baIDu.mapAPI.search.geocode.ReverseGeoCodeResult; import com.vr.souhuodong.R; import com.vr.souhuodong.UI.Adapter.Placelistadapter; public class ChoosePlaceActivity extends Activity {  MapVIEw mMapVIEw;  BaIDuMap mBaIDuMap;  Progressbar mloadbar;  ImageVIEw mSelectimg;  // 定位  LocationClIEnt mLocationClIEnt = null;  MyBDLocationListner mListner = null;  BitmapDescriptor mCurrentMarker = null;  // 当前经纬度  double mLantitude;  double mLongtitude;  LatLng mLoactionLatLng;  // 设置第一次定位标志  boolean isFirstLoc = true;  // MapVIEw中央对于的屏幕坐标  Point mCenterPoint = null;  // 地理编码  GeoCoder mGeoCoder = null;  // 位置列表  ListVIEw mListVIEw;  Placelistadapter mAdapter;  List<PoiInfo> mInfoList;  PoiInfo mCurentInfo;  @OverrIDe  protected voID onCreate(Bundle savedInstanceState) {   // Todo auto-generated method stub   super.onCreate(savedInstanceState);   setContentVIEw(R.layout.activity_chooseplace);   initVIEw();  }  /**   * 初始化界面   */  private voID initVIEw() {   // Todo auto-generated method stub   // 初始化地图   mMapVIEw = (MapVIEw) findVIEwByID(R.ID.chooseplace_bmapVIEw);   mMapVIEw.showZoomControls(false);   mBaIDuMap = mMapVIEw.getMap();   MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(17.0f);   mBaIDuMap.setMapStatus(msu);   mBaIDuMap.setonMaptouchListener(touchListener);   // 初始化POI信息列表   mInfoList = new ArrayList<PoiInfo>();   // 初始化当前MapVIEw中心屏幕坐标,初始化当前地理坐标   mCenterPoint = mBaIDuMap.getMapStatus().targetScreen;   mLoactionLatLng = mBaIDuMap.getMapStatus().target;   // 定位   mBaIDuMap.setMyLocationEnabled(true);   mLocationClIEnt = new LocationClIEnt(this);   mListner = new MyBDLocationListner();   mLocationClIEnt.registerLocationListener(mListner);   LocationClIEntoption option = new LocationClIEntoption();   option.setopenGps(true);// 打开gps   option.setCoorType("bd09ll"); // 设置坐标类型   option.setScanSpan(1000);   mLocationClIEnt.setLocoption(option);   mLocationClIEnt.start();   // 地理编码   mGeoCoder = GeoCoder.newInstance();   mGeoCoder.setonGetGeoCodeResultListener(GeoListener);   // 周边位置列表   mListVIEw = (ListVIEw) findVIEwByID(R.ID.place_List);   mloadbar = (Progressbar) findVIEwByID(R.ID.place_progressbar);   mListVIEw.setonItemClickListener(itemClickListener);   mAdapter = new Placelistadapter(getLayoutInflater(),mInfoList);   mListVIEw.setAdapter(mAdapter);   mSelectimg = new ImageVIEw(this);  }  public voID turnBack(VIEw vIEw) {   // 实现动画跳转   MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(mLoactionLatLng);   mBaIDuMap.animateMapStatus(u);   mBaIDuMap.clear();   // 发起反地理编码检索   mGeoCoder.reverseGeoCode((new ReverseGeoCodeOption())     .location(mLoactionLatLng));  }  @OverrIDe  protected voID onDestroy() {   // Todo auto-generated method stub   super.onDestroy();   mLocationClIEnt.stop();   mGeoCoder.destroy();  }  // 定位监听器  private class MyBDLocationListner implements BDLocationListener {   @OverrIDe   public voID onReceiveLocation(BDLocation location) {    // Todo auto-generated method stub    // map vIEw 销毁后不在处理新接收的位置    if (location == null || mMapVIEw == null)     return;    MyLocationData data = new MyLocationData.Builder()//      // .direction(mCurrentX)//      .accuracy(location.geTradius())//      .latitude(location.getLatitude())//      .longitude(location.getLongitude())//      .build();    mBaIDuMap.setMyLocationData(data);    // 设置自定义图标    MyLocationConfiguration config = new MyLocationConfiguration(      LocationMode.norMAL,true,null);    mBaIDuMap.setMyLocationConfigeration(config);    mLantitude = location.getLatitude();    mLongtitude = location.getLongitude();    LatLng currentLatLng = new LatLng(mLantitude,mLongtitude);    mLoactionLatLng = new LatLng(mLantitude,mLongtitude);    // 是否第一次定位    if (isFirstLoc) {     isFirstLoc = false;     // 实现动画跳转     MapStatusUpdate u = MapStatusUpdateFactory       .newLatLng(currentLatLng);     mBaIDuMap.animateMapStatus(u);     mGeoCoder.reverseGeoCode((new ReverseGeoCodeOption())       .location(currentLatLng));     return;    }   }  }  // 地理编码监听器  OnGetGeoCoderResultListener GeoListener = new OnGetGeoCoderResultListener() {   public voID onGetGeoCodeResult(GeoCodeResult result) {    if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {     // 没有检索到结果    }    // 获取地理编码结果   }   @OverrIDe   public voID onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {    if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {     // 没有找到检索结果    }    // 获取反向地理编码结果    else {     // 当前位置信息     mCurentInfo = new PoiInfo();     mCurentInfo.address = result.getAddress();     mCurentInfo.location = result.getLocation();     mCurentInfo.name = "[位置]";     mInfoList.clear();     mInfoList.add(mCurentInfo);     // 将周边信息加入表     if (result.getPoiList() != null) {      mInfoList.addAll(result.getPoiList());     }     // 通知适配数据已改变     mAdapter.notifyDataSetChanged();     mloadbar.setVisibility(VIEw.GONE);    }   }  };  // 地图触摸事件监听器  OnMaptouchListener touchListener = new OnMaptouchListener() {   @OverrIDe   public voID ontouch(MotionEvent event) {    // Todo auto-generated method stub    if (event.getAction() == MotionEvent.ACTION_UP) {     if (mCenterPoint == null) {      return;     }     // 获取当前MapVIEw中心屏幕坐标对应的地理坐标     LatLng currentLatLng;     currentLatLng = mBaIDuMap.getProjection().fromScreenLocation(       mCenterPoint);     System.out.println("----" + mCenterPoint.x);     System.out.println("----" + currentLatLng.latitude);     // 发起反地理编码检索     mGeoCoder.reverseGeoCode((new ReverseGeoCodeOption())       .location(currentLatLng));     mloadbar.setVisibility(VIEw.VISIBLE);    }   }  };  // ListVIEw选项点击事件监听器  OnItemClickListener itemClickListener = new OnItemClickListener() {   @OverrIDe   public voID onItemClick(AdapterVIEw<?> parent,VIEw vIEw,int position,long ID) {    // Todo auto-generated method stub    // 通知是适配器第position个item被选择了    mAdapter.setNotifyTip(position);    BitmapDescriptor mSelectIco = BitmapDescriptorFactory      .fromresource(R.drawable.icon_geo);    mBaIDuMap.clear();    PoiInfo info = (PoiInfo) mAdapter.getItem(position);    LatLng la = info.location;    // 动画跳转    MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(la);    mBaIDuMap.animateMapStatus(u);    // 添加覆盖物    OverlayOptions ooA = new MarkerOptions().position(la)      .icon(mSelectIco).anchor(0.5f,0.5f);    mBaIDuMap.addOverlay(ooA);    // 选中项打勾    mSelectimg.setBackgroundResource(R.drawable.greywhite);    mSelectimg = (ImageVIEw) vIEw.findVIEwByID(R.ID.place_select);    mSelectimg.setBackgroundResource(R.drawable.ic_select); //   Uri mUri = Uri.parse("geo:39.940409,116.355257"); //   Intent mIntent = new Intent(Intent.ACTION_VIEW,mUri); //   startActivity(mIntent);   }  }; } 

自定义的ListVIEw适配器

package com.vr.souhuodong.UI.Adapter; import java.util.List; import androID.R.integer; import androID.vIEw.LayoutInflater; import androID.vIEw.VIEw; import androID.vIEw.VIEw.OnClickListener; import androID.vIEw.VIEwGroup; import androID.Widget.BaseAdapter; import androID.Widget.ImageVIEw; import androID.Widget.TextVIEw; import com.baIDu.mapAPI.search.core.PoiInfo; import com.vr.souhuodong.R; public class Placelistadapter extends BaseAdapter {  List<PoiInfo> mList;  LayoutInflater mInflater;  int notifyTip ;  private class MyVIEwHolder {   TextVIEw placename;   TextVIEw placeAddree;   ImageVIEw placeSelected;  }  public Placelistadapter(LayoutInflater mInflater,List<PoiInfo> mList) {   super();   this.mList = mList;   this.mInflater = mInflater;   notifyTip = -1 ;  }  /**   * 设置第几个item被选择   * @param notifyTip   */  public voID setNotifyTip(int notifyTip) {   this.notifyTip = notifyTip;  }  @OverrIDe  public int getCount() {   // Todo auto-generated method stub   return mList.size();  }  @OverrIDe  public Object getItem(int position) {   // Todo auto-generated method stub   return mList.get(position);  }  @OverrIDe  public long getItemID(int position) {   // Todo auto-generated method stub   return position;  }  @OverrIDe  public VIEw getVIEw(int position,VIEw convertVIEw,VIEwGroup parent) {   // Todo auto-generated method stub   MyVIEwHolder holder;   if (convertVIEw == null) {    System.out.println("----aa-");    convertVIEw = mInflater.inflate(com.vr.souhuodong.R.layout.Listitem_place,parent,false);     holder = new MyVIEwHolder();    holder.placename = (TextVIEw) convertVIEw      .findVIEwByID(com.vr.souhuodong.R.ID.place_name);    holder.placeAddree = (TextVIEw) convertVIEw      .findVIEwByID(com.vr.souhuodong.R.ID.place_adress);    holder.placeSelected = (ImageVIEw) convertVIEw      .findVIEwByID(com.vr.souhuodong.R.ID.place_select);    holder.placename.setText(mList.get(position).name);    holder.placeAddree.setText(mList.get(position).address);    holder.placeSelected.setBackgroundResource(R.drawable.greywhite);    convertVIEw.setTag(holder);   } else {    holder = (MyVIEwHolder) convertVIEw.getTag();      }   holder.placename.setText(mList.get(position).name);   holder.placeAddree.setText(mList.get(position).address);   //根据重新加载的时候第position条item是否是当前所选择的,选择加载不同的图片   if(notifyTip == position ){      holder.placeSelected.setBackgroundResource(R.drawable.ic_select);   }      else {    holder.placeSelected.setBackgroundResource(R.drawable.greywhite);   }   return convertVIEw;  } // class MyItemClickListener implements OnClickListener { // //  ImageVIEw mimg; //  public MyItemClickListener(ImageVIEw mimg) { //   this.mimg = mimg; //  } //  @OverrIDe //  public voID onClick(VIEw v) { //   // Todo auto-generated method stub //   mimg.setBackgroundResource(R.drawable.ic_select); //  } //  // } } 

总结

以上所述是小编给大家介绍的利用百度地图AndroID sdk高仿微信发送位置功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持!

总结

以上是内存溢出为你收集整理的利用百度地图Android sdk高仿微信发送位置功能及遇到的问题全部内容,希望文章能够帮你解决利用百度地图Android sdk高仿微信发送位置功能及遇到的问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1143210.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存