zoukankan      html  css  js  c++  java
  • 安卓开发_慕课网_百度地图_实现方向传感器

    学习内容来自“慕课网”

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

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

    学习接自前两篇

    安卓开发_慕课网_百度地图

    安卓开发_慕课网_百度地图_实现定位

    思路:

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

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

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

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

    二、引入方向传感器

    首先增添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     @Override
    109     protected void onStart() {
    110         // TODO Auto-generated method stub
    111         super.onStart();
    112         // 开启定位
    113         mBaiduMap.setMyLocationEnabled(true);
    114         if (!mLocationClient.isStarted())
    115             mLocationClient.start();
    116         // 开启方向传感器
    117         myOrientationListener.start();
    118             
    119     }
    120     @Override
    121     protected void onStop() {
    122         // TODO Auto-generated method stub
    123         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     @Override
    143     public boolean onCreateOptionsMenu(Menu menu) {
    144         // TODO Auto-generated method stub
    145         
    146         getMenuInflater().inflate(R.menu.main, menu);
    147         return true;
    148     }
    149     //菜单按钮的响应事件
    150     @Override
    151     public boolean onOptionsItemSelected(MenuItem item) {
    152         // TODO Auto-generated method stub
    153         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             else
    167             {
    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         @Override
    192         public void onReceiveLocation(BDLocation location) {
    193             // TODO Auto-generated method stub
    194             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 SensorEventListener
    10 {
    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     @Override
    49     public void onAccuracyChanged(Sensor arg0, int arg1)
    50     {
    51         // TODO Auto-generated method stub
    52 
    53     }
    54 
    55     @SuppressWarnings(
    56     { "deprecation" })
    57     @Override
    58     //方向发生变化
    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 OnOrientationListener
    87     {
    88         void onOrientationChanged(float x);
    89     }
    90 
    91 }
    MyOrientationListener.java

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

    效果图

                 

    坐标箭头的素材

  • 相关阅读:
    基于微信红包插件的原理实现android任何APP自动发送评论(已开源)
    人家为撩妹就鼓捣个网页,我做了个约炮APP(已开源)
    android加固签名工具(源码下载)
    如何优雅的写一篇安利文-以Sugar ORM为例
    写给独立开发兄弟共勉-寂寞是19首诗和2首悲歌
    我开源了一个ios应用,你们拿去随便玩
    android用欢迎界面加载运行环境
    用c#操作Mongodb(附demo)
    sql:除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询
    怎样阻止Linux服务器执行rm -rf /*命令
  • 原文地址:https://www.cnblogs.com/xqxacm/p/4339802.html
Copyright © 2011-2022 走看看