接触了百度地图开发平台半个月了,这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高仿微信发送位置功能及遇到的问题所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)