Android中方向传感器的用法,制作简易指南针

2023-11-08 18:20

本文主要是介绍Android中方向传感器的用法,制作简易指南针,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

项目效果


项目结构


activity_main.xm

l心代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >


    <ImageView
        android:id="@+id/compass_img"
        android:layout_width="250dp"
        android:layout_height="250dp"
        android:layout_centerInParent="true"
        android:src="@drawable/compass" />


    <ImageView
        android:id="@+id/arrow_img"
        android:layout_width="60dp"
        android:layout_height="110dp"
        android:layout_centerInParent="true"
        android:src="@drawable/arrow" />


</RelativeLayout>

MainActivity

public class MainActivity extends Activity {

private SensorManager sensorManager;
private ImageView compassImg;//指南针的表盘



@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化赋值
compassImg=(ImageView) findViewById(R.id.compass_img);

sensorManager=(SensorManager) getSystemService(Context.SENSOR_SERVICE);
//地磁传感器实例
Sensor magneticSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
//加速度传感器实例
Sensor accelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

sensorManager.registerListener(listener, magneticSensor, sensorManager.SENSOR_DELAY_GAME);
sensorManager.registerListener(listener, accelerometerSensor, sensorManager.SENSOR_DELAY_GAME);

}

private SensorEventListener listener=new SensorEventListener() {
float[] accelerometerValues=new float[3];
float[] magneticValues = new float[3];
private float lastRotateDegree;

@Override
public void onSensorChanged(SensorEvent event) {
//判断当前是加速度传感器还是地磁传感器
if (event.sensor.getType()==Sensor.TYPE_ACCELEROMETER) {
//注意赋值时要调用clone方法
//SensorEvent的values数组,就可以得到传感器输出的所有值了。
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];
//将两个值传入到getRotationMatrix的方法中就可以得到一个包含旋转矩阵的R数组。
//其中R是一个长度为9的float数组,getRotationMatrix方法计算出的旋转数据就会赋值到这个数组当中
//第二个参数是一个用于将地磁向量转换成重力坐标的旋转矩阵,通常定位null值即可。
//第三,第四个参数分别就是加速度传感器和地磁传感器输出的values值
SensorManager.getRotationMatrix(R, null, accelerometerValues, magneticValues);
/*得到R数组之后,接着就可以调用getOrientation的方法来计算手机的旋转数据了。
* values[0]记录着手机围绕z轴的旋转弧度
* values[1]记录着手机围绕x轴的旋转弧度
* values[2]记录着手机围绕x轴的旋转弧度
* 计算出的数据都是以弧度为单位的,因此转化成角度调用Math.toDegrees(values[0])
* values[0];的取值范围是-180度到+180度,其中+-180度表示正南方向,0度表示正北方向,
* -90度表示正西方向,90度表示正东方向
* */
sensorManager.getOrientation(R, values);
Log.e("1", "value[0] is"+Math.toDegrees(values[0]));
//将计算出来的旋转角取反,用于旋转指南针背景图
float rotateDegree=-(float) Math.toDegrees(values[0]);
if (Math.abs(rotateDegree-lastRotateDegree)>1) {
/*
* 使用旋转动画技术
* 创建了一个RotateAnimation实例
* 并在构造方法中传入了6个参数
* 参数1表示旋转的启示角度
* 参数2表示旋转的终止角度
* 后四个参数用于指定旋转的中心点
* 这里我们把从传感器中获取到的旋转角取反,传递给RotateAnimation,并指定旋转
* 的中心点为指南针背景的中心,然后调用ImageView的startAnimation()的方法
* 来执行旋转动画
*/
RotateAnimation animation= new RotateAnimation(lastRotateDegree, rotateDegree, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
animation.setFillAfter(true);
compassImg.startAnimation(animation);
lastRotateDegree=rotateDegree;


}



}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {


}
};
@Override
protected void onDestroy() {

super.onDestroy();
if (sensorManager!=null) {
sensorManager.unregisterListener(listener);

}





}





}//class

如果没有明白下载我的例子:

http://download.csdn.net/detail/zhaihaohao1/8406581





这篇关于Android中方向传感器的用法,制作简易指南针的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/371666

相关文章

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

Java8 Collectors.toMap() 的两种用法

《Java8Collectors.toMap()的两种用法》Collectors.toMap():JDK8中提供,用于将Stream流转换为Map,本文给大家介绍Java8Collector... 目录一、简单介绍用法1:根据某一属性,对对象的实例或属性做映射用法2:根据某一属性,对对象集合进行去重二、Du

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

Python中的sort方法、sorted函数与lambda表达式及用法详解

《Python中的sort方法、sorted函数与lambda表达式及用法详解》文章对比了Python中list.sort()与sorted()函数的区别,指出sort()原地排序返回None,sor... 目录1. sort()方法1.1 sort()方法1.2 基本语法和参数A. reverse参数B.

vue监听属性watch的用法及使用场景详解

《vue监听属性watch的用法及使用场景详解》watch是vue中常用的监听器,它主要用于侦听数据的变化,在数据发生变化的时候执行一些操作,:本文主要介绍vue监听属性watch的用法及使用场景... 目录1. 监听属性 watch2. 常规用法3. 监听对象和route变化4. 使用场景附Watch 的

Java Instrumentation从概念到基本用法详解

《JavaInstrumentation从概念到基本用法详解》JavaInstrumentation是java.lang.instrument包提供的API,允许开发者在类被JVM加载时对其进行修改... 目录一、什么是 Java Instrumentation主要用途二、核心概念1. Java Agent

Java 中 Optional 的用法及最佳实践

《Java中Optional的用法及最佳实践》在Java开发中,空指针异常(NullPointerException)是开发者最常遇到的问题之一,本篇文章将详细讲解Optional的用法、常用方... 目录前言1. 什么是 Optional?主要特性:2. Optional 的基本用法2.1 创建 Opti

Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧

《Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧》本文将通过实际代码示例,深入讲解Python函数的基本用法、返回值特性、全局变量修改以及异常处理技巧,感兴趣的朋友跟随小编一起看看... 目录一、python函数定义与调用1.1 基本函数定义1.2 函数调用二、函数返回值详解2.1 有返

使用python制作一款文件粉碎工具

《使用python制作一款文件粉碎工具》这篇文章主要为大家详细介绍了如何使用python制作一款文件粉碎工具,能够有效粉碎密码文件和机密Excel表格等,感兴趣的小伙伴可以了解一下... 文件粉碎工具:适用于粉碎密码文件和机密的escel表格等等,主要作用就是防止 别人用数据恢复大师把你刚删除的机密的文件恢

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码