我是靠谱客的博主 知性含羞草,这篇文章主要介绍Andorid 风水罗盘简单实现1.什么是传感器上代码,现在分享给大家,希望可以做个参考。

公司最近要开发关于风水的产品,产品需求说要做一个风水罗盘。接着UI就马上出了几张图,然后我想了一下,罗盘应该是android 特有的传感器,通过传感器获取一些动态数据,然后给与指针进行动态赋值,添加动画。

上图:
这里写图片描述

首先介绍一下,什么是传感器。

1.什么是传感器

维基百科是这样定义的:传感器是一种物理装置或生物器官,能够探测、感受外界的信号、物理条件(如光、热、湿度)或化学组成(如烟雾),并将探知的信息传递给其他装置或器官。

在Android中传感器可以展示当前手机状态的应用,包括硬件信息、当前位置、加速计、陀螺仪、光感、磁场、定向、电池窗台,声压,同时还可以进行多点触控的测试。只要你的想象力足够丰富,完全可以利用这些信息做出一些很新奇得应用。

Android sensor framewrok允许你访问多种类型的传感器,这些传感器有的基于硬件,有一些是基于软件的。基于硬件的传感器是内嵌到手机或者平板中的物理器件,它们的数据直接来源于测量特定的物理特性,如加速度,地球磁场强度,或角速度的变化。基于软件的传感器没有物理元器件,它们是模仿基于硬件的传感器工作的。基于软件的传感器从一个或更多的基于硬件的传感器中获取数据。有时候它们也被称为虚拟传感器或合成传感器,线性加速度传感器和重力传感器就是基于软件传感器的例子。表1总结了Android平台支持的传感器。

一般的Android都不支持所有类型的传感器。例如,大部分手机和平板都有一个加速传感器和磁力传感器,但是很少有拥有气压传感器或者温度传感器。并且,一个设备可以拥有一种类型的不止一个的传感器,如,一个设备拥有两个重力传感器,每个传感器有不同的测量范围。

传感器种类

传感器主要分三大类:

动作(Motion)传感器
环境(Environmental)传感器
位置(Position)传感器

动作传感器:

这类传感器在三个轴(X、Y、Z)上测量加速度和旋转角度。包括如下几个传感器

加速(accelerometer)传感器
陀螺仪(gyroscope)传感器
重力(gravity)传感器
线性加速(linear acceleration)传感器
旋转向量(rotational vector)传感器

环境传感器

这类传感器可以测量不同环境的参数,例如周围环境的空气温度和压强、光照强度和湿度。包括如下几个传感器

温度(barometer)传感器
光线(photometer)传感器
温度(thermometer)传感器
压力(pressure)传感器

位置传感器

这类传感器可以测量设备的物理位置。包括如下几个传感器

方向(orientation)传感器(数据来自加速传感器和磁场传感器)
磁场(magnetomenter)传感器

传感器类型名称 传感器类别 系统定义的传感器常量 传感器常量对应的数值
1. 加速度 TYPE_ACCELEROMETER SENSOR_TYPE_ACCELEROMETER 1
2. 磁力域 TYPE_MAGNETIC_FIELD SENSOR_TYPE_MAGNETIC_FIELD 2
3. 方向 TYPE_ORIENTATION SENSOR_TYPE_ORIENTATION 3
4. 陀螺 TYPE_GYROSCOPE SENSOR_TYPE_GYROSCOPE 4
5. 光线(亮度)TYPE_LIGHT SENSOR_TYPE_LIGHT 5
6. 压力 TYPE_PRESSURE SENSOR_TYPE_PRESSURE 6
7. 温度 TYPE_TEMPERATURE SENSOR_TYPE_TEMPERATURE 7
8. 临近性 TYPE_PROXIMITY SENSOR_TYPE_PROXIMITY 8

以上传感器只是部分,后面将用代码获取到手机所支持的传感器类型。再此之前我们还需要了解ASF。

什么是ASF

所谓ASF就是Android SDK提供的Android sensor framework(Android传感器框架),其作用是用来访问当前Android设备内置的传感器,帮助我们完成各种与传感器有关的任务。例如

1、确定当前Android设备内置了哪些传感器。
2、确定某一个传感器的技术指标。例如该传感器能测量的最大范围、传感器的制造商、对电量的要求、测量的精度等。
3、获取传感器传回来的数据以及定义传感器回传的数据的精度。
4、注册和注销传感器事件监听器,这些监听器用于监听传感器的变化,通常从传感器回传的数据需要利用这些监听器完成。

ASF支持的传感器:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
TYPE_ACCELEROMETER //加速度传感器(硬件) TYPE_MAGNETIC_FIELD //磁场传感器(硬件) TYPE_ORIENTATION //方向传感器(软件传感器,数据来自重力和磁场传感器) TYPE_GYROSCOPE //陀螺仪传感器(硬件) TYPE_LIGHT //光线传感器(硬件) TYPE_PRESSURE //压力传感器(硬件) TYPE_PROXIMITY //临近传感器(硬件) TYPE_GRAVITY //重场传感器(硬件或软件) TYPE_LINEAR_ACCELERATION //线性加速度传感器(硬件或软件) TYPE_ROTATION_VECTOR //旋转矢量传感器(硬件或软件) TYPE_RELATIVE_HUMIDITY //湿度传感器(硬件) TYPE_AMBIENT_TEMPERATURE //温度传感器(硬件) TYPE_TEMPERATURE //温度传感器(硬件),从Android4.0开始被TYPE_AMBIENT_TEMPERATURE取代

ASF的主要类和接口

SensorManager类:用于创建sensor service的实例。该类提供了很多用于访问和枚举传感器、注册和注销传感器监听器的方法。而且还提供了与传感器精度、扫描频率、校正有关的常量。
Sensor类:提供了一些用于获取传感器技术参数的方法。如版本、类型、生产商等。
SensorEvent类:系统使用该类创建传感器事件对象。该对象可以提供与传感器事件相关的信息。传感器事件对象包括的信息有:原始的传感器回传数据、传感器类型、数据的精度以及触发事件的时间。
SensorEventListener接口:该接口包含两个回调方法,当传感器的回传值或精度发生变化时,系统会调用这两个回调方法。

这里写图片描述

上代码

1、得到SensorManager

复制代码
1
sensorManager = (SensorManager) getProxyActivity().getBaseContext().getSystemService(Context.SENSOR_SERVICE);

2、注册传感器

复制代码
1
sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),SensorManager.SENSOR_DELAY_GAME);

3、实现接口,以及方法
implements SensorEventListener

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
@SuppressLint("SetTextI18n") @Override public void onSensorChanged(SensorEvent sensorEvent) { //如果真机上触发event的传感器类型为水瓶传感器类型 if (sensorEvent.sensor.getType()==Sensor.TYPE_ORIENTATION){ //获取绕Z轴转过的角度 float degree = sensorEvent.values[0]; if (degree>338||degree<22){ text = "北"; }else if (degree>23&&degree<=67){ text= "西北"; }else if (degree>68&&degree<=112){ text= "西"; }else if (degree>113&&degree<=157){ text="西南"; }else if (degree>158&&degree<=201){ text = "南"; }else if (degree>202&&degree<=247){ text = "东南"; }else if (degree>248&&degree<=291){ text = "东"; }else if (degree>292&&degree<337){ text="东北"; } //创建旋转动画(反向转过degree度) rotateAnimation = new RotateAnimation(currentDegree, -degree , Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f); //设置动画的持续时间 rotateAnimation.setDuration(200); //设置动画结束后保存状态 rotateAnimation.setFillAfter(true); //启动动画 ivZhen.setAnimation(rotateAnimation); ivZhen.startAnimation(rotateAnimation); //动态赋值当前角度 currentDegree = -degree; //计算当前显示角度 currentUpdate = (int) (360-degree); //显示角度 tvDegree.setText(text+" "+currentUpdate+"°"); } } @Override public void onAccuracyChanged(Sensor sensor, int i) { }

4、注销传感器

复制代码
1
2
3
4
5
@Override public void onPause() { super.onPause(); sensorManager.unregisterListener(this); }

有什么疑问欢迎留言,一起讨论。

最后

以上就是知性含羞草最近收集整理的关于Andorid 风水罗盘简单实现1.什么是传感器上代码的全部内容,更多相关Andorid内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(73)

评论列表共有 0 条评论

立即
投稿
返回
顶部