android studio for android learning (二十三 )Android Orientation Sensor(方向传感器)与指南针实战(新方法替代orientation)
1.只要android手机硬件提供了相关的传感器支持,就可以用来做个简单的指南针玩玩。
2.步骤简单如下:a.调用Context的getSystemService()方法获取sensorManager,它代表传感器的管理服务;b.指定所用传感器类型,sensor:可以创建一个特定的传感器实例,c.注册相应的监听事件sensorEvent事件对象,d.当传感器数据发生变化时回调。
3.传感器的API不复杂,包含3个类和一个接口,分别是:SensorManager,Sensor,SensorEvent,SensorEventListener,共4个API。
4.基本使用方法:
实例化SensorManager
SensorManager mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
当你不知道设备支持的Sensor时,可以先获取设备支持的传感器列表。
List<Sensor> deviceSensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
安卓平台提供了2个传感器用于让我们判断设备的位置,分别是地磁场传感器(the geomagnetic field sensor)和方向传感器(the orientation sensor),本文中用方向传感器,方向传感器是基于软件的,并且它的数据是通过加速度传感器和磁场传感器共同获得的。
5.传感器坐标系统,z是指向地心的方位角,x轴是仰俯角(由静止状态开始前后反转),y轴是翻转角(由静止状态开始左右反转),如下图中所示,系统会给我们返回一个长度为三的float数组,包含三个方向值,按顺序分别是ZXY轴。
6.介绍差不多了,上源码。
package com.dragon.compass;import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;import java.util.List;public class Main extends AppCompatActivity implements SensorEventListener {ImageView znzImage;float currentDegree = 0f;SensorManager mSensorManager;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);znzImage = (ImageView)findViewById(R.id.znzImage);
// 获取传感器对象mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);List<Sensor> deviceSensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);Log.e("dragon",deviceSensors+"");}@Overrideprotected void onResume(){super.onResume();mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),SensorManager.SENSOR_DELAY_GAME);}@Overrideprotected void onPause(){mSensorManager.unregisterListener(this);super.onPause();}@Overrideprotected void onStop(){mSensorManager.unregisterListener(this);super.onStop();}@Overridepublic void onSensorChanged(SensorEvent event){int sensorType = event.sensor.getType();switch(sensorType){case Sensor.TYPE_ORIENTATION:float degree = event.values[0];RotateAnimation ra = new RotateAnimation(currentDegree,-degree, Animation.RELATIVE_TO_PARENT,0.5f,Animation.RELATIVE_TO_SELF,0.5f);ra.setDuration(200);znzImage.startAnimation(ra);currentDegree = -degree;break;}}@Overridepublic void onAccuracyChanged(Sensor sensor,int accuracy){}}
布局文件main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#fff"><ImageView
android:id="@+id/znzImage"android:layout_width="match_parent"android:layout_height="match_parent"android:scaleType="fitCenter"android:src="@drawable/znz" />
</LinearLayout>
7.成功了但发现,方向传感器已经弃用了,Sensor.TYPE_ORIENTATION这上面会有一横线。为了后面学习者的连续性,将它进行改进,利用加速度传感器和地磁传感器来计算方向角。
新的替代方法,这里只用到了Z轴,用到了加速度传感器和地磁传感器
package com.dragon.compass;import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;public class Main extends AppCompatActivity implements SensorEventListener {ImageView znzImage;float currentDegree = 0f;SensorManager mSensorManager;private Sensor accelerometer;//加速度传感器private Sensor magnetic;//地磁传感器private float[] accelerometerValues = new float[3];private float[] magneticFieldValues = new float[3];@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);znzImage = (ImageView)findViewById(R.id.znzImage);
// 实例化管理者mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
// List<Sensor> deviceSensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
// Log.e("dragon",deviceSensors+"");
// 实例化加速度传感器accelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
// 实例化地磁传感器magnetic = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);calculateOrientation();}@Overrideprotected void onResume(){
// 注册监听事件mSensorManager.registerListener(this,accelerometer,SensorManager.SENSOR_DELAY_GAME);mSensorManager.registerListener(this,magnetic,SensorManager.SENSOR_DELAY_GAME);super.onResume();}@Overrideprotected void onPause(){mSensorManager.unregisterListener(this);super.onPause();}@Overrideprotected void onStop(){mSensorManager.unregisterListener(this);super.onStop();}private float calculateOrientation(){float[] values = new float[3];float[] R = new float[9];SensorManager.getRotationMatrix(R, null, accelerometerValues,magneticFieldValues);SensorManager.getOrientation(R, values);values[0] = (float) Math.toDegrees(values[0]);return values[0];
}@Overridepublic void onSensorChanged(SensorEvent event){if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {accelerometerValues = event.values;}if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {magneticFieldValues = event.values;}float degree = calculateOrientation();RotateAnimation ra = new RotateAnimation(currentDegree,-degree, Animation.RELATIVE_TO_PARENT,0.5f,Animation.RELATIVE_TO_SELF,0.5f);ra.setDuration(200);znzImage.startAnimation(ra);currentDegree=-degree;}@Overridepublic void onAccuracyChanged(Sensor sensor,int accuracy){}}
效果图
专注于AR的在移动端的实现,如果你还有问题没解决,你可以加入我们一起交流。或是关注我们的技术公众号,这是提供技术干货的地方,你有干货可以向我们推荐。
如果你觉得写的不错,对你有用,请在下面点个 顶 支持一下嘛,有问题可以在下面留言评论。
github源码地址下载
android studio for android learning (二十三 )Android Orientation Sensor(方向传感器)与指南针实战(新方法替代orientation)相关推荐
- Android Studio开发蓝牙应用(二)
Android Studio开发蓝牙应用(二) 实现的功能 与蓝牙模块HC-06交换信息 过程 新建Empty Activity 创建布局 activity_btread_and_write.xml ...
- 【Android Studio探索之路系列】之四:Android Studio快捷键
作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.co ...
- 用较新版本的Android Studio Chipmunk编译旧版本的Android 21的Sample
技术发展这么快,经常遇到需要使用新版本的Android Studio来开发运行旧的Android工程,此时需要处理gradle兼容的问题 问题一.Could not install Gradle di ...
- android studio 远程调试,Unity3D学习笔记——Android远程真机调试(Unity Remote)
前言:当使用Unity开发移动端的游戏,特别是使用到手机的传感器,如重力感应等,调试的时候,很麻烦, 因为每次都需要编译成APK后安装到手机中测试,而Unity Remote便能很好的解决这个问题,U ...
- access中的android sdk,Android Studio报错unable to access android sdk add-on list解决方案
一.问题 初次安装Android Studio,启动后,报错如下: unable to access android sdk add-on lis 如图: 二.原因 AS启动后,会在默认路径下检测是否 ...
- Android Studio(3.6.2版本)安装 java2smali 插件,java2smali 插件的使用方法简述
Android Studio(3.6.2版本)安装 java2smali 插件,java2smali 插件的使用方法简述 一.Android Studio(3.6.2版本)安装 java2smali ...
- android studio device功能,Android Studio 3.0找不到Android Device Monitor
因为自Android Studio 3.0开始弃用Android Device Monitor,Android Developers官网上的原话是: Android Device Monitor is ...
- Android Studio同步失败设置代理,Android Studio如何设置代理?
由于使用Android Studio期间,很多时候都要访问谷歌官方服务器,但是由于一些其他原因,会导致连接不上或者速度很慢,那就需要我们设置一下国内的镜像代理了.下面,让我们一起来看看Android ...
- android studio占内存大小,极大精简android studio在C盘的内存
在C盘占很大的内存大约就2种原因: 1.SDK占内存太大 2.AVD模拟器占内存太大 第一种情况,移动SDK(用android studio不需要配置环境变量) 先移动C盘的Android目录,里面是 ...
- android studio真机调试失败,【Android】Android Studio真机调试的问题统整
真机调试需要注意以下几个问题 [1]手机的USB调试需开启 [2]手机不能是仅充电模式,需要传输数据模式 [3]有些USB线会偷工减料,请拿一条没问题的线,例如买手机时原厂给的配线 [4]在PC端需要 ...
最新文章
- iOS 设置UILabel 的内边距
- 安装Kerberos服务端和客户端
- 巧克力情歌手---McKnight, Brian
- C++学习之路 | PTA乙级—— 1091 N-自守数 (15 分)(精简)
- git.exe 启动 慢_户外慢生活节来了!南京固城湖水慢城开启春日度假模式
- 在arm上运行x86动态库_苹果官宣:Arm取代英特尔
- IDEA 配置 SpringBoot 启动端口
- 2.1简单计算问题的求解
- 使用分层的方法设计 机器人软件
- micrium ucprobe使用笔记
- oracle多个参数查询,Oracle 多参数查询语句
- JPinyin繁体相互转换
- c++ 写一个复数计算器
- 洛谷 P3373 【模板】线段树 2 题解
- 服务器系统要用GUID还是MBR,win7mbr和guid应该选哪一个
- 第一场嵌入式笔试——CVTE嵌入式应用工程师
- 关于echarts省份地图不显示
- (转)反汇编算法介绍和应用——线性扫描算法分析
- matlab自带函数实现高斯滤波
- https+ip实现摄像头访问浏览器
热门文章
- OpenGL ES2 学习教程5——顶点属性
- 很不错的js幻灯片代码分享
- MVC项目开发中那些用到的知识点(Ajax.BeginForm)
- DOTFUN XML Silverlight中文留言簿Beta V1.0 即将上线!
- 1043 Is It a Binary Search Tree (25 分) BST反转?不反转 遍历+vector
- springboot @value 默认值_原创 | 搞定默认值
- spring cloud gateway 网关_33、Spring Cloud网关Gateway
- linux opencl安装方法,如何在Ubuntu上安装libOpenCL.so
- 多线程id为什么是负的?原因
- 直线/折线/圆/三角形划分平面直线切割球问题大总结(最多能划分多少区域)