(一):基本介绍:

百度地图可以直接提供定位功能,并且把位置信息以图层的形式标注在地图上面(PopupView),同时还支持自定义设置图标,这样便于用户直接查看位置信息。要实现以上的方法,我们主要需要用到MyLocationOverlay(在地图上面显示当前位置的一个覆盖物(图层)),PopupOverlay弹出的pop信息类似于Popupwindow。还有以下一些有关定位的类:LocationClient(),LocationData(用户的位置信息)。

(二):主要类与方法介绍:

1:MyLocationOverlay:一个显示用户当前位置的Overlay。该相当于一个覆盖物图层,用来在地图上面绘制用户当前的位置,同时我们可以在子类进行覆盖dispatchTap()来处理点击事件。主要有以下一些方法。

①:protected boolean dispatcheTap():在位置图标上面处理点击事件,默认返回false

②:public LocationData getMyLocation(): 获取定位图层当前的定位数据

③:public void setData(LocationData locData): 设置位置参数 [注]设置数据之后必须刷新mapview来使得设置生效,

④:public void setMarker(Drawable marker):设置定位的图标,[注]设置图标之后必须刷新mapview来时的设置生效.

⑤:public vois setLocationMode(MyLocationOverlay.LocationMode mode):来进行设置图层显示的位模式

2:LocationData():表示用户的一些位置信息:例如:定位精度(accurac,GPS定位时方向角度(direction),纬度坐标(latitude),经度坐标(longtiude),GPS定位时卫星数量(satekkitesNum),GPS定位时速度(speed)。

3:PopupOverlay:该类可以用来生成一个位置信息的pop弹窗.主要有以下一些方法:

1:public void showPopup(Bitmap pop,GeoPoint,int yOffset):显示pop弹窗。

2:public void hidePop(): 收起pop弹窗

(三)例子实现(主要来看以下百度sdk中的例子,注释已经重新添加了一下,很详细了)

1:定位信息监听:BDLoactionListener:

/**

* 定位SDK监听函数

*/

public class MyLocationListenner implements BDLocationListener {

@Override

public void onReceiveLocation(BDLocation location) {

if (location == null)

return ;

locData.latitude = location.getLatitude();

locData.longitude = location.getLongitude();

//如果不显示定位精度圈,将accuracy赋值为0即可

locData.accuracy = location.getRadius();

// 此处可以设置 locData的方向信息, 如果定位 SDK 未返回方向信息,用户可以自己实现罗盘功能添加方向信息。

locData.direction = location.getDerect();

//更新定位数据

myLocationOverlay.setData(locData);

//更新图层数据执行刷新后生效

mMapView.refresh();

//是手动触发请求或首次定位时,移动到定位点

Log.d("zttjiangqq", "locData:latitude:"+locData.latitude+",longitude:"+locData.longitude);

if (isRequest || isFirstLoc){

//移动地图到定位点

Log.d("LocationOverlay", "receive location, animate to it");

mMapController.animateTo(new GeoPoint((int)(locData.latitude* 1e6), (int)(locData.longitude * 1e6)));

isRequest = false;

myLocationOverlay.setLocationMode(LocationMode.FOLLOWING);

requestLocButton.setText("跟随");

mCurBtnType = E_BUTTON_TYPE.FOLLOW;

}

//首次定位完成

isFirstLoc = false;

}

public void onReceivePoi(BDLocation poiLocation) {

if (poiLocation == null){

return ;

}

}

}

2:创建Pop弹窗方法:

/**

* 创建弹出泡泡图层

*/

public void createPaopao(){

viewCache = getLayoutInflater().inflate(R.layout.custom_text_view, null);

popupText =(TextView) viewCache.findViewById(R.id.textcache);

//泡泡点击响应回调

PopupClickListener popListener = new PopupClickListener(){

@Override

public void onClickedPopup(int index) {

Log.v("click", "clickapoapo");

}

};

//创建初始化显示的pop 图层

pop = new PopupOverlay(mMapView,popListener);

// 传入pop图层到自定义地图定位视图中

MyLocationMapView.pop = pop;

}

具体代码实现如下:

package com.ztt.baidumap.ui;

import android.app.Activity;

import android.content.Context;

import android.graphics.drawable.Drawable;

import android.os.Bundle;

import android.util.AttributeSet;

import android.util.Log;

import android.view.Menu;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.RadioGroup;

import android.widget.RadioGroup.OnCheckedChangeListener;

import android.widget.TextView;

import android.widget.Toast;

import com.baidu.location.BDLocation;

import com.baidu.location.BDLocationListener;

import com.baidu.location.LocationClient;

import com.baidu.location.LocationClientOption;

import com.baidu.mapapi.BMapManager;

import com.baidu.mapapi.map.LocationData;

import com.baidu.mapapi.map.MapController;

import com.baidu.mapapi.map.MapView;

import com.baidu.mapapi.map.MyLocationOverlay;

import com.baidu.mapapi.map.MyLocationOverlay.LocationMode;

import com.baidu.mapapi.map.PopupClickListener;

import com.baidu.mapapi.map.PopupOverlay;

import com.baidu.platform.comapi.basestruct.GeoPoint;

/**

* 此demo用来展示如何结合定位SDK实现定位,并使用MyLocationOverlay绘制定位位置

* 同时展示如何使用自定义图标绘制并点击时弹出泡泡

*

*/

public class LocationOverlayDemo extends Activity {

private enum E_BUTTON_TYPE {

LOC,

COMPASS,

FOLLOW

}

private E_BUTTON_TYPE mCurBtnType;

// 定位相关

LocationClient mLocClient;

LocationData locData = null;

public MyLocationListenner myListener = new MyLocationListenner();

//定位图层

locationOverlay myLocationOverlay = null;

//弹出泡泡图层

private PopupOverlay pop = null;//弹出泡泡图层,浏览节点时使用

private TextView popupText = null;//泡泡view

private View viewCache = null;

//地图相关,使用继承MapView的MyLocationMapView目的是重写touch事件实现泡泡处理

//如果不处理touch事件,则无需继承,直接使用MapView即可

MyLocationMapView mMapView = null;// 地图View

private MapController mMapController = null;

//UI相关

OnCheckedChangeListener radioButtonListener = null;

Button requestLocButton = null;

boolean isRequest = false;//是否手动触发请求定位

boolean isFirstLoc = true;//是否首次定位

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

/**

* 使用地图sdk前需先初始化BMapManager.

* BMapManager是全局的,可为多个MapView共用,它需要地图模块创建前创建,

* 并在地图地图模块销毁后销毁,只要还有地图模块在使用,BMapManager就不应该销毁

*/

MyApplication app = (MyApplication)this.getApplication();

if (app.mBMapManager == null) {

app.mBMapManager = new BMapManager(getApplicationContext());

/**

* 如果BMapManager没有初始化则初始化BMapManager

*/

app.mBMapManager.init(MyApplication.strKey,new MyApplication.MyGeneralListener());

}

setContentView(R.layout.activity_locationoverlay);

CharSequence titleLable="定位功能";

setTitle(titleLable);

requestLocButton = (Button)findViewById(R.id.button1);

mCurBtnType = E_BUTTON_TYPE.LOC;

OnClickListener btnClickListener = new OnClickListener() {

public void onClick(View v) {

switch (mCurBtnType) {

case LOC:

//手动定位请求

requestLocClick();

break;

case COMPASS:

myLocationOverlay.setLocationMode(LocationMode.NORMAL);

requestLocButton.setText("定位");

mCurBtnType = E_BUTTON_TYPE.LOC;

break;

case FOLLOW:

myLocationOverlay.setLocationMode(LocationMode.COMPASS);

requestLocButton.setText("罗盘");

mCurBtnType = E_BUTTON_TYPE.COMPASS;

break;

}

}

};

requestLocButton.setOnClickListener(btnClickListener);

RadioGroup group = (RadioGroup)this.findViewById(R.id.radioGroup);

radioButtonListener = new OnCheckedChangeListener() {

@Override

public void onCheckedChanged(RadioGroup group, int checkedId) {

if (checkedId == R.id.defaulticon){

//传入null则,恢复默认图标

modifyLocationOverlayIcon(null);

}

if (checkedId == R.id.customicon){

//修改为自定义marker //使用自定义的图标 来设置图层位置图标

modifyLocationOverlayIcon(getResources().getDrawable(R.drawable.icon_geo));

}

}

};

group.setOnCheckedChangeListener(radioButtonListener);

//地图初始化

mMapView = (MyLocationMapView)findViewById(R.id.bmapView);

mMapController = mMapView.getController();

mMapView.getController().setZoom(14); //设置缩放等级

mMapView.getController().enableClick(true); //支持点击

mMapView.setBuiltInZoomControls(true); //支持缩放

//创建 弹出泡泡图层

createPaopao();

//定位初始化

mLocClient = new LocationClient( this );

locData = new LocationData();

mLocClient.registerLocationListener( myListener );

LocationClientOption option = new LocationClientOption();

option.setOpenGps(true);//打开gps

option.setCoorType("bd09ll"); //设置坐标类型

option.setScanSpan(1000);

mLocClient.setLocOption(option);

mLocClient.start();

//定位图层初始化

myLocationOverlay = new locationOverlay(mMapView);

//设置定位数据

myLocationOverlay.setData(locData);

//添加定位图层

mMapView.getOverlays().add(myLocationOverlay);

myLocationOverlay.enableCompass();

//修改定位数据后刷新图层生效

mMapView.refresh();

}

/**

* 手动触发一次定位请求

*/

public void requestLocClick(){

isRequest = true;

mLocClient.requestLocation();

Toast.makeText(LocationOverlayDemo.this, "正在定位……", Toast.LENGTH_SHORT).show();

}

/**

* 修改位置图标

* @param marker

*/

public void modifyLocationOverlayIcon(Drawable marker){

//当传入marker为null时,使用默认图标绘制

myLocationOverlay.setMarker(marker);

//修改图层,需要刷新MapView生效

mMapView.refresh();

}

/**

* 创建弹出泡泡图层

*/

public void createPaopao(){

viewCache = getLayoutInflater().inflate(R.layout.custom_text_view, null);

popupText =(TextView) viewCache.findViewById(R.id.textcache);

//泡泡点击响应回调

PopupClickListener popListener = new PopupClickListener(){

@Override

public void onClickedPopup(int index) {

Log.v("click", "clickapoapo");

}

};

//创建初始化显示的pop 图层

pop = new PopupOverlay(mMapView,popListener);

// 传入pop图层到自定义地图定位视图中

MyLocationMapView.pop = pop;

}

/**

* 定位SDK监听函数

*/

public class MyLocationListenner implements BDLocationListener {

@Override

public void onReceiveLocation(BDLocation location) {

if (location == null)

return ;

locData.latitude = location.getLatitude();

locData.longitude = location.getLongitude();

//如果不显示定位精度圈,将accuracy赋值为0即可

locData.accuracy = location.getRadius();

// 此处可以设置 locData的方向信息, 如果定位 SDK 未返回方向信息,用户可以自己实现罗盘功能添加方向信息。

locData.direction = location.getDerect();

//更新定位数据

myLocationOverlay.setData(locData);

//更新图层数据执行刷新后生效

mMapView.refresh();

//是手动触发请求或首次定位时,移动到定位点

Log.d("zttjiangqq", "locData:latitude:"+locData.latitude+",longitude:"+locData.longitude);

if (isRequest || isFirstLoc){

//移动地图到定位点

Log.d("LocationOverlay", "receive location, animate to it");

mMapController.animateTo(new GeoPoint((int)(locData.latitude* 1e6), (int)(locData.longitude * 1e6)));

isRequest = false;

myLocationOverlay.setLocationMode(LocationMode.FOLLOWING);

requestLocButton.setText("跟随");

mCurBtnType = E_BUTTON_TYPE.FOLLOW;

}

//首次定位完成

isFirstLoc = false;

}

public void onReceivePoi(BDLocation poiLocation) {

if (poiLocation == null){

return ;

}

}

}

//继承MyLocationOverlay重写dispatchTap实现点击处理

public class locationOverlay extends MyLocationOverlay{

public locationOverlay(MapView mapView) {

super(mapView);

}

@Override

protected boolean dispatchTap() {

//处理点击事件,弹出泡泡信息

popupText.setBackgroundResource(R.drawable.popup);

popupText.setText("我的位置");

//定位图层显示的位置(图标,经纬度信息,)

pop.showPopup(BMapUtil.getBitmapFromView(popupText),

new GeoPoint((int)(locData.latitude*1e6), (int)(locData.longitude*1e6)),

8);

return true;

}

}

@Override

protected void onPause() {

mMapView.onPause();

super.onPause();

}

@Override

protected void onResume() {

mMapView.onResume();

super.onResume();

}

@Override

protected void onDestroy() {

//退出时销毁定位

if (mLocClient != null)

mLocClient.stop();

mMapView.destroy();

super.onDestroy();

}

@Override

protected void onSaveInstanceState(Bundle outState) {

super.onSaveInstanceState(outState);

mMapView.onSaveInstanceState(outState);

}

@Override

protected void onRestoreInstanceState(Bundle savedInstanceState) {

super.onRestoreInstanceState(savedInstanceState);

mMapView.onRestoreInstanceState(savedInstanceState);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// getMenuInflater().inflate(R.menu.activity_main, menu);

return true;

}

}

/**

* 继承MapView重写onTouchEvent实现泡泡处理操作

* @author hejin

*

*/

class MyLocationMapView extends MapView{

static PopupOverlay pop = null;//弹出泡泡图层,点击图标使用

public MyLocationMapView(Context context) {

super(context);

// TODO Auto-generated constructor stub

}

public MyLocationMapView(Context context, AttributeSet attrs){

super(context,attrs);

}

public MyLocationMapView(Context context, AttributeSet attrs, int defStyle){

super(context, attrs, defStyle);

}

@Override

public boolean onTouchEvent(MotionEvent event){

if (!super.onTouchEvent(event)){

//消隐泡泡

if (pop != null && event.getAction() == MotionEvent.ACTION_UP)

pop.hidePop();

}

return true;

}

}

3:运行截图:

(四):特别提醒:

上面所要用到的自定义的Application类和之前文章中写的一样,最后千万不要忘记要加入一个定位service:

android:name="com.baidu.location.f"

android:enabled="true"

android:process=":remote" >

android百度地图自定义图层,百度地图开发之百度地图定位图层基本使用方法讲解...相关推荐

  1. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 加载 dex 文件 | 使用反射获取方法创建本应用的 dexElements | 各版本创建 dex 数组源码对比 )

    文章目录 一.不同 Android 系统创建 dex 数组源码对比 二.不同 Android 系统创建 dex 数组源码对比 三. Android 5.1 及以下系统反射方法并创建 Element[] ...

  2. 高德地图Web端JavaScript API开发(二)---在地图上绘制(点标注)

    使用高德地图在很多时候需要在地图上标记位置,并且很多时候需要用到自定义的图标去完成这种位置的标记. 当然,这些功能高德地图都为我们准备了,比如常用的地图覆盖物Marker和信息窗体等.这里就先说一下点 ...

  3. android绘制自定义室内地图,自定义样式-实用工具-开发指南-Android 室内地图SDK | 高德地图API...

    显示样式自定义 1)说明: 设置用户自定义的配置样式文件,包括类型映射配置和参数配置. 配置文件包括两类,一类配置商铺类别对应的点线面属性,即categoryType.csv文件,另一类配置点线面属性 ...

  4. 安卓之百度地图定位图层显示方式

    安卓之百度地图定位模式实现定位图层转变方式 在这里我就不细讲了,我之前的文章具体我都已经介绍了. 现在直接上代码(相当于对我前几篇文章的一个小描述). 首先需要实现和百度SDK进行连接.我上一篇已介绍 ...

  5. AndroidStudio百度地图开发之显示地图

    最近打算研究一些百度地图相关的东西,由于官方网站给的都是基于Eclipse开发的例子,所以在研究过程中遇到不少的坑,在这里记录一下,对 后来初用AndroidStudio 开发百度地图的兄弟们也算有个 ...

  6. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 交叉编译 OpenSSL 开源库 )

    文章目录 一.OpenSSL 开源库简介 二.OpenSSL 源码及环境变量脚本下载 三.修改环境变量脚本 四.OpenSSL 交叉编译 五.OpenSSL 交叉编译相关资源下载 参考博客 : [An ...

  7. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 项目中配置 OpenSSL 开源库 | 使用 OpenSSL 开源库解密 dex 文件 )

    文章目录 一.项目中配置 OpenSSL 开源库 二.OpenSSL 开源库解密参考代码 三.解密 dex 文件的 Java 代码 四.解密 dex 文件的 Jni 代码 参考博客 : [Androi ...

  8. 【Android 安全】DEX 加密 ( Java 工具开发 | apk 文件签名 )

    文章目录 一.生成 jks 文件 二.签名命令 三.执行结果 四.处理 Unsupported major.minor version 52.0 错误 参考博客 : [Android 安全]DEX 加 ...

  9. 【Android 安全】DEX 加密 ( Java 工具开发 | apk 文件对齐 )

    文章目录 一.apk 对齐操作 二.apk 对齐命令 三.apk 对齐操作代码示例 四.apk 对齐执行结果 参考博客 : [Android 安全]DEX 加密 ( 常用 Android 反编译工具 ...

  10. 【Android 安全】DEX 加密 ( Java 工具开发 | 解压 apk 文件 | 加密生成 dex 文件 | 打包未签名 apk 文件 | 文件解压缩相关代码 )

    文章目录 一.解压 apk 文件 二.加密生成 dex 文件 三.打包未签名 apk 文件 四.完整代码示例 五.文件解压缩相关代码 六.执行结果 参考博客 : [Android 安全]DEX 加密 ...

最新文章

  1. Spring Batch在大型企业中的最佳实践
  2. Generation Language GL
  3. AI大事件 | OpenAI员工离职创立机器人新公司,spaCy v2.0.0发布
  4. CentOS 6.5下源码包安装配置JDK 7
  5. mac的python怎么输入中文_无法在python IDE(Mac OS X)中输入unicode
  6. Opencv_黑白素描
  7. Object类型转换成double/int类型
  8. openDrive has Free Direct Linking !
  9. Shell脚本学习指南(一)——入门
  10. hdjs---1、hdjs爬坑杂记
  11. 微信云控源码帮您快速复制营销
  12. 【IoT】战略:BEM 战略解码 - 好的战略需要好的执行
  13. 本题要求计算给定的一系列正整数中奇数的和。
  14. pd调节规律_PD 控制规律的特点是具有超前控制功能。( )
  15. 配置iis解析php
  16. openssl源码中的头文件include error
  17. 使用python 模仿mybinlog 命令 二进制分析mysql binlog
  18. 2021-03-03——html中的图片标记
  19. 随着我国经济的持续快速发展,城市轻物流需求大幅增长
  20. u盘锁定计算机,u盘锁电脑的方法介绍【图解】

热门文章

  1. 分书问题(book)-C++
  2. 工程卓越和工具平台的关系
  3. JDBC中保存/读取长二进制(LONGBLOB)数据类型
  4. [翻译]NUnit---Condition Asserts Comparisons Asserts Type Asserts (五)
  5. 网心科技CEO李浩:边缘计算的当下以及未来
  6. 李彦宏在TechWorld描绘的技术世界
  7. 爬虫大作业--以importnew网站为例
  8. PodFest China发布首份《中文播客听众与消费调研》报告
  9. 东莞地铁1号线水濂山站至2#风井区间左线贯通,同沙公园站至水濂山站区间左线盾构始发
  10. 小猫爪:PMSM之FOC控制08-状态观测器的引入