利用百度地图Android sdk高仿微信发送位置功能
接触了百度地图开发平台半个月了,这2天试着模仿了微信给好友发送位置功能,对百度地图的操作能力又上了一个台阶
(假设须要完整demo。请评论留下邮箱)
(眼下源代码已经不发送,假设须要源代码。加qq316701116,不喜勿扰)
我在实现这个功能的时候,遇到一些困难,可能也是别人将会遇到的困难,特在此列出
1、在微信发送功能中,无论用户怎样拖拽地图。总有个覆盖物固定了MapView中央,怎么实现?
事实上这非常easy实现。仅仅要MapView的布局文件里。将一个ImageView覆盖在MapView的中央,就行实现无论用户怎样拖拽地图。覆盖物(ImageView)总固定总MapView中央
2、怎样获取MapView中央的地理坐标。也即是屏幕覆盖物处的坐标?
要获取MapView中央的地理坐标,首先先获取覆盖物在屏幕上的物理坐标。这里得差别一下地理坐标(经纬度)和物理坐标(xy轴);
能够通过
- <mCenterPoint = mBaiduMap.getMapStatus().targetScreen;//mBaiduMap是BaiduMap类的实例
来获取物理坐标,这个物理坐标是不变的,而物理坐标相应的地理坐标却是随着用户拖拽地图而改变。所以。当我们须要地理坐标时,能够通过
- currentLatLng = mBaiduMap.getProjection().fromScreenLocation(
- mCenterPoint);
获取。
3、怎样获取该地理坐标周围的全部poi信息(也就是周围建筑物的信息),而不仅仅是某个类型的兴趣点?
为了实现这个功能,真是费了我好大劲,由于我之前一直以为用POI周边搜索实现的,有人提示我能够通过循环轴线搜索实现不同keyword搜索,但这样子确实非常难实现跟微信那样的效果。通过查看API,发现能够通过反地理编码解决问题,至于什么事反地理编码,能够到百度地图官网了解,通过调用它。能够返回一个该地理坐标附近建筑信息的一个列表
4、当用户拖拽地图,怎样让列表更新到眼下中心地理位置的周边信息?
这个困难事实上也不难实现。仅仅是重写mBaiduMap.setOnMapTouchListener(touchListener);触摸事件,在触摸监听器的回调函数中
将MapView中央的物理坐标转换成相应的地理坐标,再通过反地理编码获取周边信息。道理同问题3
5、当点击listview某一项时。怎样将项地理位置显示在MapView也就是屏幕中央?
非常easy,通过listview的适配器获取item的位置信息,包含经纬度。然后用动画跳转到屏幕中央位置就可以。
我觉得上面5个问题是实现这个功能的关键所在,以下是效果图(假设须要完整demo,请评论留下邮箱)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDU3MTMxNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" style="border:none; max-width:100%">
上面是一个MapVIew。覆盖物固定在当中央,地图左下角的白色正方形是回到定位点的button。由于没找到好看的图片,就留着空白了
以下是一个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 - 检索功能使用的简单演示样例
百度地图 SDK 不仅为广大开发人员提供了炫酷的地图展示效果.丰富的覆盖物图层,更为广大开发人员提供了多种 LBS 检索的能力. 通过这些接口,开发人员能够轻松的訪问百度的 LBS 数据,丰富自己的移 ...
- 百度地图 Android SDK - 标注(Marker)的基本使用
标注(Marker)是开发人员最常使用的地图覆盖物志一.今天就来向大家介绍一些标注(Marker)的最基本用法! 实现目标: 1.构建基础地图页面: 2.在地图的中心点处加入 Marker: 3.实现 ...
- 百度地图 Android SDK - Hello Baidu Map
例如,给广大以下主要开发者介绍了如何使用百度地图Android SDK构造的主应用程序的地图! 第一步.创建Androidproject,将百度地图Android SDK的开发包导入到project对 ...
- Android学习-- 基于位置的服务 LBS(基于百度地图Android SDK)--定位SDK
原文:Android学习-- 基于位置的服务 LBS(基于百度地图Android SDK)--定位SDK 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.ne ...
- 百度地图 Android SDK - 新的版本号(v3.2.0)正式上线
百度地图 Android SDK v3.2.0 在版本号 2014 年 11 月 07 日本正式推出工作完成! watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQ ...
- 百度地图 Android SDK - 个性化地图
什么是百度个性化地图Android SDK? 百度个性化地图Android SDK是一套基于Android 2.2及以上版本号设备的应用程序接口,您能够通过该套接口实现主要的地图功能,而且能够定制地图 ...
- 利用百度地图开源sdk获取地址信息。
注册百度开发者帐号,下载相关sdk 添加权限: 添加百度注册访问应用(AK)码 添加源代码文件到libs文件: 代码如下: package com.lixu.baidu_gps; import com ...
- Android 之高仿微信主界面
源码下载: http://files.cnblogs.com/aibuli/WeChatSample.zip 主界面主要使用ActionBar来完成. 要实现这个效果,第一步当然是编辑menu目录 ...
- Android 高仿微信头像截取 打造不一样的自定义控件
转载请表明出处:http://blog.csdn.net/lmj623565791/article/details/39761281,本文出自:[张鸿洋的博客] 1.概述 前面已经写了关于检测手势识别 ...
随机推荐
- cyclic swapping algorithm
原文见:https://leetcode.com/problems/couples-holding-hands/discuss/113362/JavaC%2B%2B-O(N)-solution-usi ...
- Bug的定义和分类
什么是BUG 使用人工或自动手段,来运行或测试某个系统的过程.其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别 BUG分类 完全没有实现的功能 基本实现了用户需要的功能,但是运行时 ...
- isEqual ,判断两个对象或变量是否相等
function isEqual(a, b) { //如果a和b本来就全等 if (a === b) { //判断是否为0和-0 return a !== 0 || 1 / a === 1 / b; ...
- es6(三set和map数据结构)
es6中提供了一个新的数据结构Set,他有点类似数组,但和数组不同的是,在里面你如果写入重复的值的话,他不会显示重复值. const s =new Set(); [2,3,4,5,6,6,6,7,8, ...
- 【Linux】Centos6的iptables防火墙设置
1,查看防火墙状态 # service iptables status //或 # /etc/init.d/iptables status 2,防火墙的启动.重启,关闭 # service iptab ...
- mysql启动问题
/usr/local/mysql/bin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13 - Permission denied) - ...
- CS academy Growing Trees【模板】DP求树的直径
[题意概述] 给出一棵树,树上的边有两个值a和b,你可以在[0,limit]范围内选择一个整数delta,树上的边的权值为a+b*delta,现在问当delta为多少的时候树的直径最小.最小直径是多少 ...
- zzuli 1905 小火山的跳子游戏
Description 小火山和火山火山在一块玩跳子游戏.规则如下: 1:跳子的起始位置为0,棋盘大小从1到N 2:每次跳子跳k步. 例如当前位置为i, 那么下一步为i + k 3:跳 ...
- 【HIHOCODER 1605】小Hi的生成树计数
描述 小Hi最近对生成树(包含所有顶点的联通无环子图.)非常的感兴趣,他想知道对于特定的简单平面无向图是不是存在求生成树个数的简单方法. 小Hi定义了这样的图:一个以{0,1,2--n}为顶点的图,顶 ...
- LeetCode 467. Unique Substrings in Wraparound String
Consider the string s to be the infinite wraparound string of "abcdefghijklmnopqrstuvwxyz" ...