Android项目开发:指南针(两种方法实现)

您所在的位置:网站首页 手机指南针使用方法 Android项目开发:指南针(两种方法实现)

Android项目开发:指南针(两种方法实现)

2024-07-11 02:03| 来源: 网络整理| 查看: 265

Android项目开发:指南针应用的实现 1.基于方向传感器activity_main.xmlMainActivity.java 2.基于加速度传感器和地磁传感器

在Android中可以使用内置传感器(方向传感器、加速度传感器和地磁传感器等)实现指南针功能,编写出能够辨别手机方位的app。本文将讲述两种方法编写指南针app的方法,一是使用方向传感器,二是将加速度传感器和地磁传感器结合。

1.基于方向传感器

方向传感器是Android的基本传感器之一,通过三维坐标来确定(X,Y,Z)的三个方向,以进一步实现指南针功能。 ps:Sensor.TYPE_ORIENTATION在目前的Android系统中已经不再推荐使用,但是仍然可以通过其来获取数据。

activity_main.xml

简单一点,在layout中只设计了一个imageview来放置指南针的图片,以通过动画转动图片实现指南针功能。

MainActivity.java

思路比较简单,通过SensorEventListener监听传感器事件,获取方向传感器Z轴采集到的数据,转动指南针图片。

import androidx.appcompat.app.AppCompatActivity; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.util.Log; import android.view.animation.Animation; import android.view.animation.RotateAnimation; import android.widget.ImageView; public class MainActivity extends AppCompatActivity implements SensorEventListener { //使用方向传感器编写指南针 private ImageView imageView; private float currentDegree; private SensorManager sensorManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView=(ImageView) findViewById(R.id.imageview); currentDegree=0f; sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE); //获取传感器服务 } @Override protected void onResume() { //为方向传感器注册监听器 super.onResume(); sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),sensorManager.SENSOR_DELAY_GAME); } @Override protected void onPause() { //取消监听器 super.onPause(); sensorManager.unregisterListener(this); } @Override public void onSensorChanged(SensorEvent event) { //保持设备水平,使用水平传感器 if(event.sensor.getType()==Sensor.TYPE_ORIENTATION){ //取围绕Z轴转过的角度 float degree=event.values[0]; RotateAnimation rotateAnimation=new RotateAnimation(currentDegree,-degree, Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f); //动画转动角度 rotateAnimation.setDuration(200); //设置动画持续时间 rotateAnimation.setFillAfter(true); //设置动画结束后的保留状态 imageView.setAnimation(rotateAnimation); currentDegree=-degree; } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } } 2.基于加速度传感器和地磁传感器

布局和上面的方法一致,因此可以直接复制上面的activity_main.xml代码,详细介绍一下java代码部分。 在onCreate方法中分别获取了加速度传感器和地磁传感器实例,并给他们都注册了监听器。然后在onSensorChanged()方法中进行判断,如果当前是加速度传感器,就将values数组赋给accelerometerValues数组,如果当前是地磁传感器,就将values数组赋给magneticValues数组。在赋值的时候一定要调用values的clone()方法,不然accelerometerValues和magneticValues将指向同一块引用。 接下来,分别创建一个长度为9的R数组和一个长度为3的values数组,然后调用getRotationMatrix()方法给R数组赋值,再调用getOrientation()方法为values数组赋值,这是values数组中含有手机在所有方向上旋转的弧度了。(可以将弧度转换为度) 最后,在回调方法中利用RotateAnimation和当前旋转过的角度值values[0],可以将图片旋转。

import androidx.appcompat.app.AppCompatActivity; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.util.Log; import android.view.animation.Animation; import android.view.animation.RotateAnimation; import android.widget.ImageView; public class MainActivity extends AppCompatActivity implements SensorEventListener { //通过加速度传感器和地磁传感器编写指南针 private SensorManager sensorManager; private ImageView imageView; private float lastRotateDegree; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = (ImageView) findViewById(R.id.imageview); sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); //加速度感应器 Sensor magneticSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); //地磁感应器 Sensor accelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); sensorManager.registerListener(this, magneticSensor, SensorManager.SENSOR_DELAY_GAME); sensorManager.registerListener(this, accelerometerSensor, SensorManager.SENSOR_DELAY_GAME); } @Override protected void onDestroy() { super.onDestroy(); if (sensorManager != null) { sensorManager.unregisterListener(this); } } float[] accelerometerValues = new float[3]; float[] magneticValues = new float[3]; @Override public void onSensorChanged(SensorEvent event) { // 判断当前是加速度感应器还是地磁感应器 if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { //赋值调用clone方法 accelerometerValues = event.values.clone(); } else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { //赋值调用clone方法 magneticValues = event.values.clone(); } float[] R = new float[9]; float[] values = new float[3]; SensorManager.getRotationMatrix(R,null,accelerometerValues,magneticValues); sensorManager.getOrientation(R, values); Log.d("Main","values[0] :"+Math.toDegrees(values[0])); //values[0]的取值范围是-180到180度。 //+-180表示正南方向,0度表示正北,-90表示正西,+90表示正东 //将计算出的旋转角度取反,用于旋转指南针背景图 float rotateDegree = -(float) Math.toDegrees(values[0]); if (Math.abs(rotateDegree - lastRotateDegree) > 1) { RotateAnimation animation = new RotateAnimation(lastRotateDegree,rotateDegree, Animation.RELATIVE_TO_SELF,0.5f, Animation.RELATIVE_TO_SELF,0.5f); animation.setFillAfter(true); imageView.startAnimation(animation); //动画效果转动传感器 lastRotateDegree = rotateDegree; } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } }

最后,附上项目链接



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3