zoukankan      html  css  js  c++  java
  • 利用百度地图Android sdk高仿微信发送位置功能

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

    假设须要完整demo。请评论留下邮箱

    (眼下源代码已经不发送,假设须要源代码。加qq316701116,不喜勿扰)

     

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


    1、在微信发送功能中,无论用户怎样拖拽地图。总有个覆盖物固定了MapView中央,怎么实现?

        事实上这非常easy实现。仅仅要MapView的布局文件里。将一个ImageView覆盖在MapView的中央,就行实现无论用户怎样拖拽地图。覆盖物(ImageView)总固定总MapView中央


    2、怎样获取MapView中央的地理坐标。也即是屏幕覆盖物处的坐标?

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

       能够通过

    [java] view plaincopy
    1. <mCenterPoint = mBaiduMap.getMapStatus().targetScreen;//mBaiduMap是BaiduMap类的实例  
    来获取物理坐标,这个物理坐标是不变的,而物理坐标相应的地理坐标却是随着用户拖拽地图而改变。所以。当我们须要地理坐标时,能够通过

    [java] view plaincopy
    1. currentLatLng = mBaiduMap.getProjection().fromScreenLocation(  
    2.                         mCenterPoint); 
    获取。


    3、怎样获取该地理坐标周围的全部poi信息(也就是周围建筑物的信息),而不仅仅是某个类型的兴趣点?

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


    4、当用户拖拽地图,怎样让列表更新到眼下中心地理位置的周边信息?

    这个困难事实上也不难实现。仅仅是重写mBaiduMap.setOnMapTouchListener(touchListener);触摸事件,在触摸监听器的回调函数中

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


    5、当点击listview某一项时。怎样将项地理位置显示在MapView也就是屏幕中央?

    非常easy,通过listview的适配器获取item的位置信息,包含经纬度。然后用动画跳转到屏幕中央位置就可以。


    我觉得上面5个问题是实现这个功能的关键所在,以下是效果图(假设须要完整demo,请评论留下邮箱


    上面是一个MapVIew。覆盖物固定在当中央,地图左下角的白色正方形是回到定位点的button。由于没找到好看的图片,就留着空白了

    以下是一个listView。显示地图指示地点周围的一些位置信息


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

    Activity类

    [java] view plaincopy
    1. package com.vr.souhuodong.UI.Sou;  
    2.   
    3. import java.util.ArrayList;  
    4. import java.util.List;  
    5.   
    6. import android.app.Activity;  
    7. import android.content.Intent;  
    8. import android.graphics.Point;  
    9. import android.net.Uri;  
    10. import android.os.Bundle;  
    11. import android.view.MotionEvent;  
    12. import android.view.View;  
    13. import android.widget.AdapterView;  
    14. import android.widget.AdapterView.OnItemClickListener;  
    15. import android.widget.ImageView;  
    16. import android.widget.ListView;  
    17. import android.widget.ProgressBar;  
    18.   
    19. import com.baidu.location.BDLocation;  
    20. import com.baidu.location.BDLocationListener;  
    21. import com.baidu.location.LocationClient;  
    22. import com.baidu.location.LocationClientOption;  
    23. import com.baidu.mapapi.map.BaiduMap;  
    24. import com.baidu.mapapi.map.BaiduMap.OnMapTouchListener;  
    25. import com.baidu.mapapi.map.BitmapDescriptor;  
    26. import com.baidu.mapapi.map.BitmapDescriptorFactory;  
    27. import com.baidu.mapapi.map.MapStatusUpdate;  
    28. import com.baidu.mapapi.map.MapStatusUpdateFactory;  
    29. import com.baidu.mapapi.map.MapView;  
    30. import com.baidu.mapapi.map.MarkerOptions;  
    31. import com.baidu.mapapi.map.MyLocationConfiguration;  
    32. import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode;  
    33. import com.baidu.mapapi.map.MyLocationData;  
    34. import com.baidu.mapapi.map.OverlayOptions;  
    35. import com.baidu.mapapi.model.LatLng;  
    36. import com.baidu.mapapi.search.core.PoiInfo;  
    37. import com.baidu.mapapi.search.core.SearchResult;  
    38. import com.baidu.mapapi.search.geocode.GeoCodeResult;  
    39. import com.baidu.mapapi.search.geocode.GeoCoder;  
    40. import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;  
    41. import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;  
    42. import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;  
    43. import com.vr.souhuodong.R;  
    44. import com.vr.souhuodong.UI.Adapter.PlaceListAdapter;  
    45.   
    46. public class ChoosePlaceActivity extends Activity {  
    47.   
    48.     MapView mMapView;  
    49.     BaiduMap mBaiduMap;  
    50.     ProgressBar mLoadBar;  
    51.     ImageView mSelectImg;  
    52.   
    53.     // 定位  
    54.     LocationClient mLocationClient = null;  
    55.     MyBDLocationListner mListner = null;  
    56.     BitmapDescriptor mCurrentMarker = null;  
    57.   
    58.     // 当前经纬度  
    59.     double mLantitude;  
    60.     double mLongtitude;  
    61.     LatLng mLoactionLatLng;  
    62.   
    63.     // 设置第一次定位标志  
    64.     boolean isFirstLoc = true;  
    65.   
    66.     // MapView中央对于的屏幕坐标  
    67.     Point mCenterPoint = null;  
    68.   
    69.     // 地理编码  
    70.     GeoCoder mGeoCoder = null;  
    71.   
    72.     // 位置列表  
    73.     ListView mListView;  
    74.     PlaceListAdapter mAdapter;  
    75.     List<PoiInfo> mInfoList;  
    76.     PoiInfo mCurentInfo;  
    77.   
    78.     @Override  
    79.     protected void onCreate(Bundle savedInstanceState) {  
    80.         // TODO Auto-generated method stub  
    81.         super.onCreate(savedInstanceState);  
    82.         setContentView(R.layout.activity_chooseplace);  
    83.   
    84.         initView();  
    85.     }  
    86.   
    87.     /** 
    88.      * 初始化界面 
    89.      */  
    90.     private void initView() {  
    91.         // TODO Auto-generated method stub  
    92.         // 初始化地图  
    93.         mMapView = (MapView) findViewById(R.id.chooseplace_bmapView);  
    94.         mMapView.showZoomControls(false);  
    95.         mBaiduMap = mMapView.getMap();  
    96.         MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(17.0f);  
    97.         mBaiduMap.setMapStatus(msu);  
    98.         mBaiduMap.setOnMapTouchListener(touchListener);  
    99.   
    100.         // 初始化POI信息列表  
    101.         mInfoList = new ArrayList<PoiInfo>();  
    102.   
    103.         // 初始化当前MapView中心屏幕坐标,初始化当前地理坐标  
    104.         mCenterPoint = mBaiduMap.getMapStatus().targetScreen;  
    105.         mLoactionLatLng = mBaiduMap.getMapStatus().target;  
    106.   
    107.         // 定位  
    108.         mBaiduMap.setMyLocationEnabled(true);  
    109.         mLocationClient = new LocationClient(this);  
    110.         mListner = new MyBDLocationListner();  
    111.         mLocationClient.registerLocationListener(mListner);  
    112.         LocationClientOption option = new LocationClientOption();  
    113.         option.setOpenGps(true);// 打开gps  
    114.         option.setCoorType("bd09ll"); // 设置坐标类型  
    115.         option.setScanSpan(1000);  
    116.         mLocationClient.setLocOption(option);  
    117.         mLocationClient.start();  
    118.   
    119.         // 地理编码  
    120.         mGeoCoder = GeoCoder.newInstance();  
    121.         mGeoCoder.setOnGetGeoCodeResultListener(GeoListener);  
    122.   
    123.         // 周边位置列表  
    124.         mListView = (ListView) findViewById(R.id.place_list);  
    125.         mLoadBar = (ProgressBar) findViewById(R.id.place_progressBar);  
    126.         mListView.setOnItemClickListener(itemClickListener);  
    127.         mAdapter = new PlaceListAdapter(getLayoutInflater(), mInfoList);  
    128.         mListView.setAdapter(mAdapter);  
    129.   
    130.         mSelectImg = new ImageView(this);  
    131.     }  
    132.   
    133.     public void turnBack(View view) {  
    134.         // 实现动画跳转  
    135.         MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(mLoactionLatLng);  
    136.         mBaiduMap.animateMapStatus(u);  
    137.   
    138.         mBaiduMap.clear();  
    139.         // 发起反地理编码检索  
    140.         mGeoCoder.reverseGeoCode((new ReverseGeoCodeOption())  
    141.                 .location(mLoactionLatLng));  
    142.   
    143.     }  
    144.   
    145.     @Override  
    146.     protected void onDestroy() {  
    147.         // TODO Auto-generated method stub  
    148.         super.onDestroy();  
    149.         mLocationClient.stop();  
    150.         mGeoCoder.destroy();  
    151.     }  
    152.   
    153.     // 定位监听器  
    154.     private class MyBDLocationListner implements BDLocationListener {  
    155.   
    156.         @Override  
    157.         public void onReceiveLocation(BDLocation location) {  
    158.             // TODO Auto-generated method stub  
    159.             // map view 销毁后不在处理新接收的位置  
    160.             if (location == null || mMapView == null)  
    161.                 return;  
    162.             MyLocationData data = new MyLocationData.Builder()//  
    163.                     // .direction(mCurrentX)//  
    164.                     .accuracy(location.getRadius())//  
    165.                     .latitude(location.getLatitude())//  
    166.                     .longitude(location.getLongitude())//  
    167.                     .build();  
    168.             mBaiduMap.setMyLocationData(data);  
    169.             // 设置自己定义图标  
    170.             MyLocationConfiguration config = new MyLocationConfiguration(  
    171.                     LocationMode.NORMAL, truenull);  
    172.             mBaiduMap.setMyLocationConfigeration(config);  
    173.   
    174.             mLantitude = location.getLatitude();  
    175.             mLongtitude = location.getLongitude();  
    176.   
    177.             LatLng currentLatLng = new LatLng(mLantitude, mLongtitude);  
    178.             mLoactionLatLng = new LatLng(mLantitude, mLongtitude);  
    179.   
    180.             // 是否第一次定位  
    181.             if (isFirstLoc) {  
    182.                 isFirstLoc = false;  
    183.                 // 实现动画跳转  
    184.                 MapStatusUpdate u = MapStatusUpdateFactory  
    185.                         .newLatLng(currentLatLng);  
    186.                 mBaiduMap.animateMapStatus(u);  
    187.   
    188.                 mGeoCoder.reverseGeoCode((new ReverseGeoCodeOption())  
    189.                         .location(currentLatLng));  
    190.                 return;  
    191.             }  
    192.   
    193.         }  
    194.   
    195.     }  
    196.   
    197.     // 地理编码监听器  
    198.     OnGetGeoCoderResultListener GeoListener = new OnGetGeoCoderResultListener() {  
    199.         public void onGetGeoCodeResult(GeoCodeResult result) {  
    200.             if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {  
    201.                 // 没有检索到结果  
    202.             }  
    203.             // 获取地理编码结果  
    204.         }  
    205.   
    206.         @Override  
    207.         public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {  
    208.             if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {  
    209.                 // 没有找到检索结果  
    210.             }  
    211.             // 获取反向地理编码结果  
    212.             else {  
    213.                 // 当前位置信息  
    214.                 mCurentInfo = new PoiInfo();  
    215.                 mCurentInfo.address = result.getAddress();  
    216.                 mCurentInfo.location = result.getLocation();  
    217.                 mCurentInfo.name = "[位置]";  
    218.                 mInfoList.clear();  
    219.                 mInfoList.add(mCurentInfo);  
    220.   
    221.                 // 将周边信息增加表  
    222.                 if (result.getPoiList() != null) {  
    223.                     mInfoList.addAll(result.getPoiList());  
    224.                 }  
    225.                 // 通知适配数据已改变  
    226.                 mAdapter.notifyDataSetChanged();  
    227.                 mLoadBar.setVisibility(View.GONE);  
    228.   
    229.             }  
    230.         }  
    231.     };  
    232.   
    233.     // 地图触摸事件监听器  
    234.     OnMapTouchListener touchListener = new OnMapTouchListener() {  
    235.         @Override  
    236.         public void onTouch(MotionEvent event) {  
    237.             // TODO Auto-generated method stub  
    238.             if (event.getAction() == MotionEvent.ACTION_UP) {  
    239.   
    240.                 if (mCenterPoint == null) {  
    241.                     return;  
    242.                 }  
    243.   
    244.                 // 获取当前MapView中心屏幕坐标相应的地理坐标  
    245.                 LatLng currentLatLng;  
    246.                 currentLatLng = mBaiduMap.getProjection().fromScreenLocation(  
    247.                         mCenterPoint);  
    248.                 System.out.println("----" + mCenterPoint.x);  
    249.                 System.out.println("----" + currentLatLng.latitude);  
    250.                 // 发起反地理编码检索  
    251.                 mGeoCoder.reverseGeoCode((new ReverseGeoCodeOption())  
    252.                         .location(currentLatLng));  
    253.                 mLoadBar.setVisibility(View.VISIBLE);  
    254.   
    255.             }  
    256.         }  
    257.     };  
    258.   
    259.     // listView选项点击事件监听器  
    260.     OnItemClickListener itemClickListener = new OnItemClickListener() {  
    261.   
    262.         @Override  
    263.         public void onItemClick(AdapterView<?

      > parent, View view, int position,  

    264.                 long id) {  
    265.             // TODO Auto-generated method stub  
    266.   
    267.             // 通知是适配器第position个item被选择了  
    268.             mAdapter.setNotifyTip(position);  
    269.   
    270.             BitmapDescriptor mSelectIco = BitmapDescriptorFactory  
    271.                     .fromResource(R.drawable.icon_geo);  
    272.             mBaiduMap.clear();  
    273.             PoiInfo info = (PoiInfo) mAdapter.getItem(position);  
    274.             LatLng la = info.location;  
    275.   
    276.             // 动画跳转  
    277.             MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(la);  
    278.             mBaiduMap.animateMapStatus(u);  
    279.   
    280.             // 加入覆盖物  
    281.             OverlayOptions ooA = new MarkerOptions().position(la)  
    282.                     .icon(mSelectIco).anchor(0.5f, 0.5f);  
    283.             mBaiduMap.addOverlay(ooA);  
    284.   
    285.             // 选中项打勾  
    286.             mSelectImg.setBackgroundResource(R.drawable.greywhite);  
    287.             mSelectImg = (ImageView) view.findViewById(R.id.place_select);  
    288.             mSelectImg.setBackgroundResource(R.drawable.ic_select);  
    289.               
    290. //          Uri mUri = Uri.parse("geo:39.940409,116.355257");  
    291. //          Intent mIntent = new Intent(Intent.ACTION_VIEW,mUri);  
    292. //          startActivity(mIntent);  
    293.   
    294.         }  
    295.   
    296.     };  
    297. }  


    自己定义的listView适配器

    [java] view plaincopy
    1. package com.vr.souhuodong.UI.Adapter;  
    2.   
    3. import java.util.List;  
    4.   
    5. import android.R.integer;  
    6. import android.view.LayoutInflater;  
    7. import android.view.View;  
    8. import android.view.View.OnClickListener;  
    9. import android.view.ViewGroup;  
    10. import android.widget.BaseAdapter;  
    11. import android.widget.ImageView;  
    12. import android.widget.TextView;  
    13.   
    14. import com.baidu.mapapi.search.core.PoiInfo;  
    15. import com.vr.souhuodong.R;  
    16.   
    17. public class PlaceListAdapter extends BaseAdapter {  
    18.       
    19.     List<PoiInfo> mList;  
    20.     LayoutInflater mInflater;  
    21.     int notifyTip ;  
    22.       
    23.     private class MyViewHolder {  
    24.         TextView placeName;  
    25.         TextView placeAddree;  
    26.         ImageView placeSelected;  
    27.     }  
    28.   
    29.     public PlaceListAdapter(LayoutInflater mInflater , List<PoiInfo> mList) {  
    30.         super();  
    31.         this.mList = mList;  
    32.         this.mInflater = mInflater;  
    33.         notifyTip = -1 ;  
    34.     }  
    35.       
    36.       
    37.     /** 
    38.      * 设置第几个item被选择 
    39.      * @param notifyTip 
    40.      */  
    41.     public void setNotifyTip(int notifyTip) {  
    42.         this.notifyTip = notifyTip;  
    43.     }  
    44.       
    45.     @Override  
    46.     public int getCount() {  
    47.         // TODO Auto-generated method stub  
    48.         return mList.size();  
    49.     }  
    50.   
    51.     @Override  
    52.     public Object getItem(int position) {  
    53.         // TODO Auto-generated method stub  
    54.         return mList.get(position);  
    55.     }  
    56.   
    57.     @Override  
    58.     public long getItemId(int position) {  
    59.         // TODO Auto-generated method stub  
    60.         return position;  
    61.     }  
    62.   
    63.     @Override  
    64.     public View getView(int position, View convertView, ViewGroup parent) {  
    65.         // TODO Auto-generated method stub  
    66.         MyViewHolder holder;  
    67.         if (convertView == null) {  
    68.             System.out.println("----aa-");  
    69.             convertView = mInflater.inflate(com.vr.souhuodong.R.layout.listitem_place, parent, false);        
    70.             holder = new MyViewHolder();  
    71.             holder.placeName = (TextView) convertView  
    72.                     .findViewById(com.vr.souhuodong.R.id.place_name);  
    73.             holder.placeAddree = (TextView) convertView  
    74.                     .findViewById(com.vr.souhuodong.R.id.place_adress);  
    75.             holder.placeSelected = (ImageView) convertView  
    76.                     .findViewById(com.vr.souhuodong.R.id.place_select);  
    77.             holder.placeName.setText(mList.get(position).name);  
    78.             holder.placeAddree.setText(mList.get(position).address);  
    79.             holder.placeSelected.setBackgroundResource(R.drawable.greywhite);  
    80.             convertView.setTag(holder);  
    81.         } else {  
    82.             holder = (MyViewHolder) convertView.getTag();             
    83.         }  
    84.         holder.placeName.setText(mList.get(position).name);  
    85.         holder.placeAddree.setText(mList.get(position).address);  
    86.         //依据又一次载入的时候第position条item是否是当前所选择的,选择载入不同的图片  
    87.         if(notifyTip == position ){           
    88.             holder.placeSelected.setBackgroundResource(R.drawable.ic_select);  
    89.         }             
    90.         else {  
    91.             holder.placeSelected.setBackgroundResource(R.drawable.greywhite);  
    92.         }  
    93.   
    94.         return convertView;  
    95.     }  
    96.       
    97.       
    98. //  class MyItemClickListener implements OnClickListener {  
    99. //  
    100. //      ImageView mImg;  
    101. //      public MyItemClickListener(ImageView mImg) {  
    102. //          this.mImg = mImg;   
    103. //      }  
    104. //      @Override  
    105. //      public void onClick(View v) {  
    106. //          // TODO Auto-generated method stub  
    107. //          mImg.setBackgroundResource(R.drawable.ic_select);  
    108. //      }  
    109. //        
    110. //  }  
    111.       
    112.   


  • 相关阅读:
    js数组元素的添加和删除
    jquery中prop()方法和attr()方法的区别浅析
    jquery选择器 之 获取父级元素、同级元素、子元素
    jQuery 序列化表单数据 serialize() serializeArray()
    Awesome Python,Python的框架集合
    关于树莓派HDMI转VGA线接显示器黑屏
    python爬虫xpath的语法
    爬虫下载百度贴吧图片
    项目经理的磨练(2) 科学的安排项目日程安排
    项目经理的磨练
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/6877087.html
Copyright © 2011-2022 走看看