您的位置:首页 > 其它

安卓开发_慕课网_百度地图_实现方向传感器

2014-12-15 20:07 381 查看
学习内容来自“慕课网”

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

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

学习接自前两篇

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

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

思路:

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

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

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

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

二、引入方向传感器

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

看红色字体的部分

package com.example.map;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
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.MyLocationConfiguration.LocationMode;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.example.map.MyOrientationListener.OnOrientationListener;
import com.example.map.R;

import android.location.Location;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;
import android.widget.Toast;

public class MainActivity extends Activity {

private MapView mMapView = null;
private BaiduMap mBaiduMap;
//简化代码            用于this.context=this;
private Context context;
//定位相关
private LocationClient mLocationClient;
private MyLocationListener mLocationListener;
//是否第一次定位的标志
private boolean isFirstIn = true;
//定位经纬度
private double mLatitude;
private double mLongtitude;
//自定义定位图标
46     private BitmapDescriptor mIconLocation;
47     private LocationMode mLocationMode;//控制模式
48     private MyOrientationListener myOrientationListener;
49     private float mCurrentX;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在使用SDK各组件之前初始化context信息,传入ApplicationContext
//注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());

requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
this.context = this;
initView();
//初始化定位
initLocation();

}

private void initView() {
// TODO Auto-generated method stub
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
//设置打开时的显示比列  这里显示500m左右
MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);
mBaiduMap.setMapStatus(msu);
}
private void initLocation() {
// TODO Auto-generated method stub
mLocationClient = new LocationClient(this);
mLocationListener = new MyLocationListener();
mLocationClient.registerLocationListener(mLocationListener);
LocationClientOption option = new LocationClientOption();
option.setCoorType("bd09ll");
option.setIsNeedAddress(true);
option.setOpenGps(true);
option.setScanSpan(1000);

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         });
}
//activity销毁时百度地图也销毁
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
// 开启定位
mBaiduMap.setMyLocationEnabled(true);
if (!mLocationClient.isStarted())
mLocationClient.start();
// 开启方向传感器
117         myOrientationListener.start();

}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
// 停止定位
mBaiduMap.setMyLocationEnabled(false);
mLocationClient.stop();
// 停止方向传感器
128         myOrientationListener.stop();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub

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.id_map_common:
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
break;
case R.id.id_map_site:
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
break;
case R.id.id_map_traffic:
if(mBaiduMap.isTrafficEnabled())
{
mBaiduMap.setTrafficEnabled(false);
item.setTitle("实时交通(off)");
}
else
{
mBaiduMap.setTrafficEnabled(true);
item.setTitle("实时交通(on)");
}
break;
case R.id.id_map_location:
//定位最新自己的位置
centerToMyLocation();
break;

default:
break;
}
return super.onOptionsItemSelected(item);
}
//进到自己的位置
private void centerToMyLocation() {
LatLng latLng = new LatLng(mLatitude,mLongtitude);

MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
mBaiduMap.animateMapStatus(msu);
}
private class MyLocationListener implements BDLocationListener{

@Override
public void onReceiveLocation(BDLocation location) {
// TODO Auto-generated method stub
MyLocationData data = new MyLocationData.Builder()//
.direction(mCurrentX)//
.accuracy(location.getRadius())//
.latitude(location.getLatitude())//
.longitude(location.getLongitude())//
.build();
mBaiduMap.setMyLocationData(data);
// 设置自定义图标
202     MyLocationConfiguration config = new MyLocationConfiguration(mLocationMode.NORMAL, true, mIconLocation);
203     mBaiduMap.setMyLocationConfigeration(config);
//获取最新经纬度
mLatitude = location.getLatitude();
mLongtitude = location.getLongitude();
//判断是否第一次定位
if (isFirstIn)
{
//设置经纬度
LatLng latLng = new LatLng(location.getLatitude(),location.getLongitude());

MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
mBaiduMap.animateMapStatus(msu);
//将是否第一次定位的标志 变为不是第一次定位
isFirstIn = false;
//显示当前定位的位置
Toast.makeText(context, location.getAddrStr(),
Toast.LENGTH_SHORT).show();
}

}

}
}


添加方向传感器部分的类

MyLocationListener.java

package com.example.map;

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

public class MyOrientationListener implements SensorEventListener
{
private SensorManager mSensorManager;
private Context mContext;
//传感器
private Sensor mSensor;
private float lastX;

//构造方法
public MyOrientationListener(Context context)
{
this.mContext = context;
}

@SuppressWarnings("deprecation")
//开始监听
public void start()
{
//拿到系统服务
mSensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
if (mSensorManager != null)
{
// 获得方向传感器
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
}

if (mSensor != null)
{
mSensorManager.registerListener(this, mSensor,
SensorManager.SENSOR_DELAY_UI);
}
}

//结束监听
public void stop()
{
mSensorManager.unregisterListener(this);
}

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

}

@SuppressWarnings(
{ "deprecation" })
@Override
//方向发生变化
public void onSensorChanged(SensorEvent event)
{
if (event.sensor.getType() == Sensor.TYPE_ORIENTATION)
{
float x = event.values[SensorManager.DATA_X];

if (Math.abs(x - lastX) > 1.0)
{
if (mOnOrientationListener != null)
{
mOnOrientationListener.onOrientationChanged(x);
}
}

lastX = x;

}
}

private OnOrientationListener mOnOrientationListener;

public void setOnOrientationListener(
OnOrientationListener mOnOrientationListener)
{
this.mOnOrientationListener = mOnOrientationListener;
}

public interface OnOrientationListener
{
void onOrientationChanged(float x);
}

}


MyOrientationListener.java

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

效果图





坐标箭头的素材

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: