传感器--方向传感器制作指南针
2016-05-19 11:42
363 查看
我们根据地磁传感器和加速度传感器来进行当前手机旋转的方向
同时使用一个imageView来展示我们当前的方向的展示,并让其根据手机旋转的角度来旋转指向正确的方向
同时使用一个imageView来展示我们当前的方向的展示,并让其根据手机旋转的角度来旋转指向正确的方向
public class MainActivity extends AppCompatActivity { private SensorManager sensorManager; private Sensor accelerometerSensor;//加速度传感器 private Sensor magneticSensor;//地磁传感器 private ImageView imageView; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); //将两个传感器注册 sensorManager.registerListener(listener,accelerometerSensor,SensorManager.SENSOR_DELAY_GAME); sensorManager.registerListener(listener,magneticSensor,SensorManager.SENSOR_DELAY_GAME); } private void init() { sensorManager= (SensorManager) getSystemService(SENSOR_SERVICE); accelerometerSensor=sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); magneticSensor=sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); imageView= (ImageView) findViewById(R.id.imageView); } private SensorEventListener listener=new SensorEventListener() { float[] accelerometerValues=new float[9]; float[] magneticValues=new float[3]; float lastDegree;//用来记录旋转之前的角度 @Override public void onSensorChanged(SensorEvent event) { // if (event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){ //在赋值的时候一定要调用一下values的clone()方法 //获取加速度传感器中的数据,是一个长度为9的数组 accelerometerValues=event.values.clone(); }else if (event.sensor.getType()==Sensor.TYPE_MAGNETIC_FIELD){ //获取地磁传感器的数据,是一个长度为3的数组 magneticValues=event.values.clone(); } float[] R=new float[9]; float[] values=new float[3]; //通过下面的方法,获取一个包含旋转矩阵的数组,并将值赋给R, SensorManager.getRotationMatrix(R,null,accelerometerValues,magneticValues); SensorManager.getOrientation(R,values); //values[0]中是围绕z轴旋转的角度,应用Math类将其转换为角度 Log.d("MainActivity",Math.toDegrees(values[0])+""); float rotateDegree= (float) -Math.toDegrees(values[0]); //应用动画,根据角度的变化,来旋转指南针图片 if (Math.abs(rotateDegree-lastDegree)>1){ new ObjectAnimator().ofFloat(imageView,"rotation",lastDegree,rotateDegree).setDuration(100).start(); lastDegree=rotateDegree; } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } }; //最后别忘记取消注册传感器 protected void onDestroy() { super.onDestroy(); sensorManager.unregisterListener(listener); } }
相关文章推荐
- Android 沉浸式状态栏攻略 让你的状态栏变色吧
- c++第6次试验
- Ant 替换某一文件中的字符串
- 【Android初级工程师】Service
- Page Cache的优化(随笔)
- Mac系统,上传项目到github
- 【VC图像处理】旋转图像
- Loss和神经网络训练
- c++第六次实验
- Spring UT-IT
- 弗洛伊德(Floyd)算法
- jQuery Ajax实例各种使用方法详解
- 人生中最【无用】的二十件事
- Android Studio常用插件
- PHP CURL上传文件出现413 Request Entity Too Large
- Java GC(5)-性能调优的原则
- thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法
- iOS重写父类中的方法时要先调用父类中的方法的原因
- 给 Android 开发者的 RxJava 详解
- iOS-OC-通过融云APPKey和AppSecret获取融云Token