百度地图3.7.1和传感器的应用

主要思路就是通过监听方向传感器,

然后接口回掉这个改变好之后的值,

在位置监听里设置这个传感器的值就可以了。

package com.map.ditu;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;

public class MySensorEventListener implements SensorEventListener {
    private Context mContext;
    private SensorManager mManager;
    private Sensor mSensor;
    // 最后的X坐标
    private float lastX;

    public MySensorEventListener(Context mContext) {
        this.mContext = mContext;
    }

    @SuppressWarnings("deprecation")
    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
            //改变的x值
            float x = event.values[SensorManager.DATA_X];
            //为了不使ui刷新过快进行判断
            if (Math.abs(x - lastX) > 1.0) {
                if (listener != null) {
                    listener.onSenSorChangListener(x);
                }
            }

            lastX = x;
        }

    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // TODO Auto-generated method stub

    }
    
    @SuppressWarnings("deprecation")
    public void start() {
        //获得传感器的管理者 
        mManager = (SensorManager) mContext
                .getSystemService(Context.SENSOR_SERVICE);
        // 获得方向传感器
        if (mManager != null) {
            mSensor = mManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
        }
        if (mSensor != null) {
            // 注册监听
            mManager.registerListener(this, mSensor,
                    SensorManager.SENSOR_DELAY_UI);
        }

    }

    public void stop() {
        // 取消注册
        mManager.unregisterListener(this);
    }

    private OnSensorChangeListener listener;

    public void setListener(OnSensorChangeListener listener) {
        this.listener = listener;
    }

    public interface OnSensorChangeListener {
        public void onSenSorChangListener(float x);
    }

}

使用的时候也和位置监听一样,要和activity一起联动。

package com.map.ditu;


import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
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.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.map.ditu.MySensorEventListener.OnSensorChangeListener;

import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;
import android.widget.Toast;
import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {
    private MapView map;
    private BaiduMap mBaidu;
    //位置
    private LocationClient mLocationClient;
    //位置接口
    private BDLocationListener myListener;
    //判断是不是第一次进入
    private boolean isFirst = true;
    //记录经纬度
    private double jing = 0;
    private double wei = 0;
    
    //自定义我的位置圆点
    private BitmapDescriptor mIconLocation;
    
    private float currentX;
    //位置传感器
    private MySensorEventListener listener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //去除标题栏
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        //初始化百度地图
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);

        initView();
        initLocation();
    }

    private void initLocation() {
        mLocationClient = new LocationClient(getApplicationContext());
        myListener = new MyLocationListener();
        //注册监听
        mLocationClient.registerLocationListener(myListener);
        //设置LocationClient
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationMode.Hight_Accuracy);// 可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
        option.setCoorType("bd09ll");// 可选,默认gcj02,设置返回的定位结果坐标系
        int span = 1000;
        option.setIsNeedAddress(true);// 可选,设置是否需要地址信息,默认不需要
        option.setOpenGps(true);// 可选,默认false,设置是否使用gps
        option.setLocationNotify(true);// 可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
        option.setIsNeedLocationDescribe(true);// 可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
        option.setIgnoreKillProcess(false);// 可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
        option.SetIgnoreCacheException(false);// 可选,默认false,设置是否收集CRASH信息,默认收集
        option.setEnableSimulateGps(false);// 可选,默认false,设置是否需要过滤gps仿真结果,默认需要
        option.setScanSpan(span);// 可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的

        mLocationClient.setLocOption(option);
        //初始化图标
        mIconLocation = BitmapDescriptorFactory.fromResource(R.drawable.navi_map_gps_locked);
        listener = new MySensorEventListener(this);
        listener.setListener(new OnSensorChangeListener() {
            
            @Override
            public void onSenSorChangListener(float x) {
                currentX = x;
                
            }
        });
    }

    private void initView() {
        map = (MapView) findViewById(R.id.map);
        //把视图对象转成BaiduMap
        mBaidu = map.getMap();
        // 设置地图初始的位置
//         MapStatusUpdate msu = MapStatusUpdateFactory.zoomBy(50.0f);
//         mBaidu.setMapStatus(msu);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // TODO Auto-generated method stub
        super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // TODO Auto-generated method stub
        switch (item.getItemId()) {
        case R.id.nomore:
            mBaidu.setMapType(BaiduMap.MAP_TYPE_NORMAL);// 设置普通地地图
            break;
        case R.id.weixing:
            mBaidu.setMapType(BaiduMap.MAP_TYPE_SATELLITE);// 设置卫星图
            break;
        case R.id.ontime:
            if (mBaidu.isTrafficEnabled()) {
                mBaidu.setTrafficEnabled(false);
                item.setTitle("实时交通---打开");
            } else {
                mBaidu.setTrafficEnabled(true);
                item.setTitle("实时交通---关闭");
            }
            break;
            case R.id.location:
                LatLng la = new LatLng(jing,
                        wei);
                MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(la);
                mBaidu.animateMapStatus(msu);
                break;

        default:
            break;
        }
        return true;
    }

    public class MyLocationListener implements BDLocationListener {

        @Override
        public void onReceiveLocation(BDLocation location) {
            //设置我当前位置的数据
            MyLocationData data = new MyLocationData.Builder()//
                    .accuracy(location.getRadius())//
                    .direction(currentX)//
                    .latitude(location.getLatitude())//
                    .longitude(location.getLongitude())//
                    .build();
            mBaidu.setMyLocationData(data);
            //设置自定义的图片
            MyLocationConfiguration config = new MyLocationConfiguration(com.baidu.mapapi.map.MyLocationConfiguration.LocationMode.FOLLOWING
                    , true,mIconLocation);
            mBaidu.setMyLocationConfigeration(config);
            
            //如果是第一次进入,会显示当前位置
            if (isFirst) {
                jing = location.getLatitude();
                wei = location.getLongitude();
                LatLng la = new LatLng(jing,
                        wei);
                MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(la);
                mBaidu.animateMapStatus(msu);
                isFirst = false;
                Toast.makeText(MainActivity.this,location.getAddrStr(),0).show();
            }

        }

    }

    @Override
    protected void onStart() {
        // TODO Auto-generated method stub
        super.onStart();
        // 开启定位能功能
        mBaidu.setMyLocationEnabled(true);
        if (!mLocationClient.isStarted())
            //开启定位
            mLocationClient.start();
        if(listener!=null){
            listener.start();
        }
        
    }

    @Override
    protected void onStop() {
        // TODO Auto-generated method stub
        super.onStop();
        // 停止定位功能
        mBaidu.setMyLocationEnabled(false);
        //停止定位
        mLocationClient.stop();
        listener.stop();
    }

}

 

posted @ 2016-03-22 14:45  aaddrrooiidd  阅读(441)  评论(0编辑  收藏  举报