博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
安卓开发_慕课网_百度地图_实现方向传感器
阅读量:7222 次
发布时间:2019-06-29

本文共 10591 字,大约阅读时间需要 35 分钟。

学习内容来自“慕课网”

这里学习百度地图方向传感器功能

就是当转动手机的时候,地图上显示个人所在位置的图标的箭头变动

学习接自前两篇

思路:

传感器随着定位的开始而开启,随着定位的结束而结束

传感器获得位置的移动而更新方向

代码在前两篇的基础上修改

一、讲原本坐标的图标改成箭头图标

二、引入方向传感器

首先增添MainActivity.java中的自定义图标和方向传感器代码

看红色字体的部分

1 package com.example.map;  2   3 import com.baidu.location.BDLocation;  4 import com.baidu.location.BDLocationListener;  5 import com.baidu.location.LocationClient;  6 import com.baidu.location.LocationClientOption;  7 import com.baidu.mapapi.SDKInitializer;  8 import com.baidu.mapapi.map.BaiduMap;  9 import com.baidu.mapapi.map.BitmapDescriptor; 10 import com.baidu.mapapi.map.BitmapDescriptorFactory; 11 import com.baidu.mapapi.map.MapStatusUpdate; 12 import com.baidu.mapapi.map.MapStatusUpdateFactory; 13 import com.baidu.mapapi.map.MapView; 14 import com.baidu.mapapi.map.MyLocationConfiguration; 15 import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode; 16 import com.baidu.mapapi.map.MyLocationData; 17 import com.baidu.mapapi.model.LatLng; 18 import com.example.map.MyOrientationListener.OnOrientationListener; 19 import com.example.map.R; 20  21 import android.location.Location; 22 import android.os.Bundle; 23 import android.app.Activity; 24 import android.content.Context; 25 import android.graphics.Bitmap; 26 import android.view.Menu; 27 import android.view.MenuItem; 28 import android.view.Window; 29 import android.widget.Toast; 30  31 public class MainActivity extends Activity { 32      33     private MapView mMapView = null; 34     private BaiduMap mBaiduMap; 35     //简化代码            用于this.context=this; 36     private Context context; 37     //定位相关 38     private LocationClient mLocationClient; 39     private MyLocationListener mLocationListener; 40     //是否第一次定位的标志 41     private boolean isFirstIn = true; 42     //定位经纬度 43     private double mLatitude; 44     private double mLongtitude; 45     //自定义定位图标 46     private BitmapDescriptor mIconLocation; 47     private LocationMode mLocationMode;//控制模式 48     private MyOrientationListener myOrientationListener; 49     private float mCurrentX; 50      51      52     @Override 53     protected void onCreate(Bundle savedInstanceState) { 54         super.onCreate(savedInstanceState); 55       //在使用SDK各组件之前初始化context信息,传入ApplicationContext   56         //注意该方法要再setContentView方法之前实现   57         SDKInitializer.initialize(getApplicationContext());   58          59         requestWindowFeature(Window.FEATURE_NO_TITLE); 60         setContentView(R.layout.activity_main); 61         this.context = this; 62         initView(); 63         //初始化定位 64         initLocation(); 65          66     } 67      68     private void initView() { 69         // TODO Auto-generated method stub 70         mMapView = (MapView) findViewById(R.id.bmapView); 71         mBaiduMap = mMapView.getMap(); 72         //设置打开时的显示比列  这里显示500m左右 73         MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);  74         mBaiduMap.setMapStatus(msu); 75         } 76     private void initLocation() { 77         // TODO Auto-generated method stub 78         mLocationClient = new LocationClient(this); 79         mLocationListener = new MyLocationListener(); 80         mLocationClient.registerLocationListener(mLocationListener); 81         LocationClientOption option = new LocationClientOption(); 82         option.setCoorType("bd09ll"); 83         option.setIsNeedAddress(true); 84         option.setOpenGps(true); 85         option.setScanSpan(1000); 86          87         mLocationClient.setLocOption(option); 88          89         // 初始化图标 90         mIconLocation = BitmapDescriptorFactory.fromResource(R.drawable.navi_map_gps_locked); 91         myOrientationListener = new MyOrientationListener(context); 92         myOrientationListener.setOnOrientationListener(new OnOrientationListener() 93         { 94             @Override 95             public void onOrientationChanged(float x) 96             { 97                 mCurrentX = x; 98             } 99         });100     }101     //activity销毁时百度地图也销毁102     @Override  103     protected void onDestroy() {   104         super.onDestroy();  105         //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理  106         mMapView.onDestroy();  107     }  108     @Override109     protected void onStart() {110         // TODO Auto-generated method stub111         super.onStart();112         // 开启定位113         mBaiduMap.setMyLocationEnabled(true);114         if (!mLocationClient.isStarted())115             mLocationClient.start();116         // 开启方向传感器117         myOrientationListener.start();118             119     }120     @Override121     protected void onStop() {122         // TODO Auto-generated method stub123         super.onStop();124         // 停止定位125         mBaiduMap.setMyLocationEnabled(false);126         mLocationClient.stop();127         // 停止方向传感器128         myOrientationListener.stop();129     }130     @Override  131     protected void onResume() {  132         super.onResume();  133         //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理  134         mMapView.onResume();  135         }  136     @Override  137     protected void onPause() {  138         super.onPause();  139         //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理  140         mMapView.onPause();  141         }  142     @Override143     public boolean onCreateOptionsMenu(Menu menu) {144         // TODO Auto-generated method stub145         146         getMenuInflater().inflate(R.menu.main, menu);147         return true;148     }149     //菜单按钮的响应事件150     @Override151     public boolean onOptionsItemSelected(MenuItem item) {152         // TODO Auto-generated method stub153         switch (item.getItemId()) {154         case R.id.id_map_common:155             mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);156             break;157         case R.id.id_map_site:158             mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);159             break;160         case R.id.id_map_traffic:161             if(mBaiduMap.isTrafficEnabled())162             {163                 mBaiduMap.setTrafficEnabled(false);164                 item.setTitle("实时交通(off)");165             }166             else167             {168                 mBaiduMap.setTrafficEnabled(true);169                 item.setTitle("实时交通(on)");170             }171             break;172         case R.id.id_map_location:173             //定位最新自己的位置174             centerToMyLocation();175             break;176 177         default:178             break;179         }180         return super.onOptionsItemSelected(item);181     }182     //进到自己的位置183     private void centerToMyLocation() {184         LatLng latLng = new LatLng(mLatitude,mLongtitude);185         186         MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);187         mBaiduMap.animateMapStatus(msu);188     }189     private class MyLocationListener implements BDLocationListener{190 191         @Override192         public void onReceiveLocation(BDLocation location) {193             // TODO Auto-generated method stub194             MyLocationData data = new MyLocationData.Builder()//195             .direction(mCurrentX)//196             .accuracy(location.getRadius())//197             .latitude(location.getLatitude())//198             .longitude(location.getLongitude())//199             .build();200     mBaiduMap.setMyLocationData(data);201     // 设置自定义图标202     MyLocationConfiguration config = new MyLocationConfiguration(mLocationMode.NORMAL, true, mIconLocation);203     mBaiduMap.setMyLocationConfigeration(config);204     //获取最新经纬度205     mLatitude = location.getLatitude();206     mLongtitude = location.getLongitude();207     //判断是否第一次定位208     if (isFirstIn)209     {210         //设置经纬度211         LatLng latLng = new LatLng(location.getLatitude(),location.getLongitude());212         213         MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);214         mBaiduMap.animateMapStatus(msu);215         //将是否第一次定位的标志 变为不是第一次定位216         isFirstIn = false;217         //显示当前定位的位置218         Toast.makeText(context, location.getAddrStr(),219                 Toast.LENGTH_SHORT).show();220     }221 222         }223         224     }225 }

添加方向传感器部分的类

MyLocationListener.java

1 package com.example.map; 2  3 import android.content.Context; 4 import android.hardware.Sensor; 5 import android.hardware.SensorEvent; 6 import android.hardware.SensorEventListener; 7 import android.hardware.SensorManager; 8  9 public class MyOrientationListener implements SensorEventListener10 {11     private SensorManager mSensorManager;12     private Context mContext;13     //传感器14     private Sensor mSensor;15     private float lastX;16 17     //构造方法18     public MyOrientationListener(Context context)19     {20         this.mContext = context;21     }22 23     @SuppressWarnings("deprecation")24     //开始监听25     public void start()26     {27         //拿到系统服务28         mSensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);29         if (mSensorManager != null)30         {31             // 获得方向传感器32             mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);33         }34 35         if (mSensor != null)36         {37             mSensorManager.registerListener(this, mSensor,38                     SensorManager.SENSOR_DELAY_UI);39         }40     }41 42     //结束监听43     public void stop()44     {45         mSensorManager.unregisterListener(this);46     }47 48     @Override49     public void onAccuracyChanged(Sensor arg0, int arg1)50     {51         // TODO Auto-generated method stub52 53     }54 55     @SuppressWarnings(56     { "deprecation" })57     @Override58     //方向发生变化59     public void onSensorChanged(SensorEvent event)60     {61         if (event.sensor.getType() == Sensor.TYPE_ORIENTATION)62         {63             float x = event.values[SensorManager.DATA_X];64 65             if (Math.abs(x - lastX) > 1.0)66             {67                 if (mOnOrientationListener != null)68                 {69                     mOnOrientationListener.onOrientationChanged(x);70                 }71             }72 73             lastX = x;74 75         }76     }77 78     private OnOrientationListener mOnOrientationListener;79 80     public void setOnOrientationListener(81             OnOrientationListener mOnOrientationListener)82     {83         this.mOnOrientationListener = mOnOrientationListener;84     }85 86     public interface OnOrientationListener87     {88         void onOrientationChanged(float x);89     }90 91 }
MyOrientationListener.java

 

改动以上两部分后便可以看到效果,移动手机方向,坐标箭头方向随之变化

效果图

             

 

坐标箭头的素材

 

转载地址:http://nrzfm.baihongyu.com/

你可能感兴趣的文章
诡异!React stopPropagation失灵
查看>>
Python_OOP
查看>>
个人博客开发系列:评论功能之GitHub账号OAuth授权
查看>>
mongodb--安装和初步使用教程
查看>>
ES6简单总结(搭配简单的讲解和小案例)
查看>>
text-decoration与color属性
查看>>
如何使用Mybatis第三方插件--PageHelper实现分页操作
查看>>
PyCharm搭建GO开发环境(GO语言学习第1课)
查看>>
Android交互
查看>>
提醒我喝水chrome插件开发指南
查看>>
列表数据转树形数据
查看>>
Java新版本的开发已正式进入轨道,版本号18.3
查看>>
从零开始的webpack生活-0x009:FilesLoader装载文件
查看>>
在electron中实现跨域请求,无需更改服务器端设置
查看>>
gitlab-ci配置详解(一)
查看>>
听说你叫Java(二)–Servlet请求
查看>>
案例分享〡三拾众筹持续交付开发流程支撑创新业务
查看>>
FreeWheel业务系统微服务化过程经验分享
查看>>
移动互联网下半场,iOS开发者如何“高薪”成长?
查看>>
Atlassian是怎样进行持续交付的?且听 Steve Smith一一道来
查看>>