项目效果

项目结构

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中方向传感器的用法,制作简易指南针相关推荐

  1. android服务绑定异步,Android中异步类AsyncTask用法总结

    本文总结分析了Android中异步类AsyncTask用法.分享给大家供大家参考,具体如下: 最近整理笔记的时候,看到有关AsyncTask不是很理解,重新疏导了一下,有在网上找了一些资料,个人不敢独 ...

  2. Android中各种Span的用法——转载

    转载一篇觉得很好的文章,在转载中成长:https://blog.csdn.net/qq_16430735/article/details/50427978 Android中各种Span的用法 前言 S ...

  3. 49.Android中各种Span的用法

    49.Android中各种Span的用法 Android中各种Span的用法 前言 SpannableStringBuilder URLSpan UnderlineSpan TypefaceSpan ...

  4. android tabhost 动画,Android中使用TabHost 与 Fragment 制作页面切换效果

    三个标签页置于顶端 效果图: 在文件BoardTabHost.java中定义页面切换的效果:切换页面时,当前页面滑出,目标页面滑入.这是2个不同的动画设定动画时要区分对待 import android ...

  5. Android学习笔记-传感器开发之利用传感器和Tween开发简易指南针

    本次我们学习Android传感器的开发,前面已经介绍过了,tween的使用,所以,我们可以结合传感器与tween动画,开发简易的指南针. 首先先介绍一下传感器的相关知识, 在Android应用程序中使 ...

  6. Android 利用方向传感器实现 指南针

    step1:新建一个项目Compass,并将一张指南针图片导入到res/drawable-hdpi目录中 step2:设计应用的UI界面,main.xml <?xml version=" ...

  7. Android 利用方向传感器获得手机的相对角度

    1.android 的坐标系是如何定义x, y z 轴的. x轴的方向是沿着屏幕的水平方向从左向右,如果手机不是正方形的话,较短的边需要水平放置,较长的边需要垂直放置. Y轴的方向是从屏幕的左下角开始 ...

  8. Android 利用方向传感器实现 指南针

    step1:新建一个项目Compass,并将一张指南针图片导入到res/drawable-hdpi目录中 step2:设计应用的UI界面,main.xml <?xml version=" ...

  9. Android方向传感器实践——自己动手做指南针

    传感器(Sensor)系统可以让智能手机的功能更加丰富多彩,在Android系统中支持多种传感器.Android的Sensor系统涉及了Android的各个层次. Android系统支持多种传感器,有 ...

  10. Android利用方向传感器获得手机的相对角度实例说明

    1.android 的坐标系是如何定义x, y z 轴的 x轴的方向是沿着屏幕的水平方向从左向右,如果手机不是正方形的话,较短的边需要水平放置,较长的边需要垂直放置. Y轴的方向是从屏幕的左下角开始沿 ...

最新文章

  1. 日志为什么不入数据库
  2. .html,.htm和.shtml的区别
  3. word无法打开请去应用商店_word文档打不开的4种解决方法
  4. ORBSLAM2在Ubuntu14.04上详细配置流程
  5. 线段树——思维(Codeforces 339D Xenia and Bit Operations/Billboard HDU - 2795)
  6. mysql group和order_mysql 用 group by 和 order by同时使用
  7. php开发api数据加密,php-app开发接口加密
  8. 17.立体匹配——匹配两个图 Matlab实战,立体效果_3
  9. ubuntu mysql主从配置_MYSQL 主从数据库的配置 ubuntu 12.04
  10. access 分表存储_数据库分区、分表、分库、分片
  11. gtest学习笔记--5 死亡测试
  12. the jre_home environment variable is not defined correctly this environment vari
  13. 服务器显示asp错误,win2008 ASP显示500内部错误不能显示详细错误的解决方法
  14. 爬取唯品会口红数据,这次哪家打折力度最大?我看到0.8折的
  15. 华清远见Qt作业网络聊天室1014
  16. 九章量子计算机地位,“九章”量子计算机这么牛,到底有什么用?|【经纬低调分享】...
  17. 【转】How-To-Ask-Questions-The-Smart-Way
  18. 论文阅读32 | Channel Augmented Joint Learning for Visible-Infrared Recognition
  19. C. Equalize(贪心)
  20. 胡适赠言:给找工作的大学生 适用于任何时刻

热门文章

  1. Electromyography(EMG)介绍(偏医学临床)| BCIduino社区整理
  2. FANUC机器人坐标系相关问题解决办法汇总
  3. C语言--判断一个年份是否是闰年(详解)
  4. 关于数学模拟软件无法在win10环境下运行的解决办法
  5. 抓包应用分析与静态路由配置
  6. 2023下半年软考高级系统架构设计师怎么报名?
  7. KubeEdge框架temperature测试demo部署
  8. Linux 之加密类型,CA,Openssl,Openssh
  9. 为什么那么多年轻人更愿意吃全麦面包而不是老面馒头?
  10. c 语言定义班级 专业,序号-专业班级-学号-姓名程序设计基础及应用实验1认识C语言电子刊物...