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

相关文章

SpringBoot3.4配置校验新特性的用法详解

《SpringBoot3.4配置校验新特性的用法详解》SpringBoot3.4对配置校验支持进行了全面升级,这篇文章为大家详细介绍了一下它们的具体使用,文中的示例代码讲解详细,感兴趣的小伙伴可以参考... 目录基本用法示例定义配置类配置 application.yml注入使用嵌套对象与集合元素深度校验开发

SpringBoot UserAgentUtils获取用户浏览器的用法

《SpringBootUserAgentUtils获取用户浏览器的用法》UserAgentUtils是于处理用户代理(User-Agent)字符串的工具类,一般用于解析和处理浏览器、操作系统以及设备... 目录介绍效果图依赖封装客户端工具封装IP工具实体类获取设备信息入库介绍UserAgentUtils

Android使用ImageView.ScaleType实现图片的缩放与裁剪功能

《Android使用ImageView.ScaleType实现图片的缩放与裁剪功能》ImageView是最常用的控件之一,它用于展示各种类型的图片,为了能够根据需求调整图片的显示效果,Android提... 目录什么是 ImageView.ScaleType?FIT_XYFIT_STARTFIT_CENTE

Java中的@SneakyThrows注解用法详解

《Java中的@SneakyThrows注解用法详解》:本文主要介绍Java中的@SneakyThrows注解用法的相关资料,Lombok的@SneakyThrows注解简化了Java方法中的异常... 目录前言一、@SneakyThrows 简介1.1 什么是 Lombok?二、@SneakyThrows

Python中的getopt模块用法小结

《Python中的getopt模块用法小结》getopt.getopt()函数是Python中用于解析命令行参数的标准库函数,该函数可以从命令行中提取选项和参数,并对它们进行处理,本文详细介绍了Pyt... 目录getopt模块介绍getopt.getopt函数的介绍getopt模块的常用用法getopt模

mysql中的group by高级用法

《mysql中的groupby高级用法》MySQL中的GROUPBY是数据聚合分析的核心功能,主要用于将结果集按指定列分组,并结合聚合函数进行统计计算,下面给大家介绍mysql中的groupby用法... 目录一、基本语法与核心功能二、基础用法示例1. 单列分组统计2. 多列组合分组3. 与WHERE结合使

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl

Java中Scanner的用法示例小结

《Java中Scanner的用法示例小结》有时候我们在编写代码的时候可能会使用输入和输出,那Java也有自己的输入和输出,今天我们来探究一下,对JavaScanner用法相关知识感兴趣的朋友一起看看吧... 目录前言一 输出二 输入Scanner的使用多组输入三 综合练习:猜数字游戏猜数字前言有时候我们在

java解析jwt中的payload的用法

《java解析jwt中的payload的用法》:本文主要介绍java解析jwt中的payload的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解析jwt中的payload1. 使用 jjwt 库步骤 1:添加依赖步骤 2:解析 JWT2. 使用 N

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络