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中方向传感器的用法,制作简易指南针相关推荐
- android服务绑定异步,Android中异步类AsyncTask用法总结
本文总结分析了Android中异步类AsyncTask用法.分享给大家供大家参考,具体如下: 最近整理笔记的时候,看到有关AsyncTask不是很理解,重新疏导了一下,有在网上找了一些资料,个人不敢独 ...
- Android中各种Span的用法——转载
转载一篇觉得很好的文章,在转载中成长:https://blog.csdn.net/qq_16430735/article/details/50427978 Android中各种Span的用法 前言 S ...
- 49.Android中各种Span的用法
49.Android中各种Span的用法 Android中各种Span的用法 前言 SpannableStringBuilder URLSpan UnderlineSpan TypefaceSpan ...
- android tabhost 动画,Android中使用TabHost 与 Fragment 制作页面切换效果
三个标签页置于顶端 效果图: 在文件BoardTabHost.java中定义页面切换的效果:切换页面时,当前页面滑出,目标页面滑入.这是2个不同的动画设定动画时要区分对待 import android ...
- Android学习笔记-传感器开发之利用传感器和Tween开发简易指南针
本次我们学习Android传感器的开发,前面已经介绍过了,tween的使用,所以,我们可以结合传感器与tween动画,开发简易的指南针. 首先先介绍一下传感器的相关知识, 在Android应用程序中使 ...
- Android 利用方向传感器实现 指南针
step1:新建一个项目Compass,并将一张指南针图片导入到res/drawable-hdpi目录中 step2:设计应用的UI界面,main.xml <?xml version=" ...
- Android 利用方向传感器获得手机的相对角度
1.android 的坐标系是如何定义x, y z 轴的. x轴的方向是沿着屏幕的水平方向从左向右,如果手机不是正方形的话,较短的边需要水平放置,较长的边需要垂直放置. Y轴的方向是从屏幕的左下角开始 ...
- Android 利用方向传感器实现 指南针
step1:新建一个项目Compass,并将一张指南针图片导入到res/drawable-hdpi目录中 step2:设计应用的UI界面,main.xml <?xml version=" ...
- Android方向传感器实践——自己动手做指南针
传感器(Sensor)系统可以让智能手机的功能更加丰富多彩,在Android系统中支持多种传感器.Android的Sensor系统涉及了Android的各个层次. Android系统支持多种传感器,有 ...
- Android利用方向传感器获得手机的相对角度实例说明
1.android 的坐标系是如何定义x, y z 轴的 x轴的方向是沿着屏幕的水平方向从左向右,如果手机不是正方形的话,较短的边需要水平放置,较长的边需要垂直放置. Y轴的方向是从屏幕的左下角开始沿 ...
最新文章
- 日志为什么不入数据库
- .html,.htm和.shtml的区别
- word无法打开请去应用商店_word文档打不开的4种解决方法
- ORBSLAM2在Ubuntu14.04上详细配置流程
- 线段树——思维(Codeforces 339D Xenia and Bit Operations/Billboard HDU - 2795)
- mysql group和order_mysql 用 group by 和 order by同时使用
- php开发api数据加密,php-app开发接口加密
- 17.立体匹配——匹配两个图 Matlab实战,立体效果_3
- ubuntu mysql主从配置_MYSQL 主从数据库的配置 ubuntu 12.04
- access 分表存储_数据库分区、分表、分库、分片
- gtest学习笔记--5 死亡测试
- the jre_home environment variable is not defined correctly this environment vari
- 服务器显示asp错误,win2008 ASP显示500内部错误不能显示详细错误的解决方法
- 爬取唯品会口红数据,这次哪家打折力度最大?我看到0.8折的
- 华清远见Qt作业网络聊天室1014
- 九章量子计算机地位,“九章”量子计算机这么牛,到底有什么用?|【经纬低调分享】...
- 【转】How-To-Ask-Questions-The-Smart-Way
- 论文阅读32 | Channel Augmented Joint Learning for Visible-Infrared Recognition
- C. Equalize(贪心)
- 胡适赠言:给找工作的大学生 适用于任何时刻
热门文章
- Electromyography(EMG)介绍(偏医学临床)| BCIduino社区整理
- FANUC机器人坐标系相关问题解决办法汇总
- C语言--判断一个年份是否是闰年(详解)
- 关于数学模拟软件无法在win10环境下运行的解决办法
- 抓包应用分析与静态路由配置
- 2023下半年软考高级系统架构设计师怎么报名?
- KubeEdge框架temperature测试demo部署
- Linux 之加密类型,CA,Openssl,Openssh
- 为什么那么多年轻人更愿意吃全麦面包而不是老面馒头?
- c 语言定义班级 专业,序号-专业班级-学号-姓名程序设计基础及应用实验1认识C语言电子刊物...