Andorid 风水罗盘简单实现
公司最近要开发关于风水的产品,产品需求说要做一个风水罗盘。接着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支持的传感器:
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
sensorManager = (SensorManager) getProxyActivity().getBaseContext().getSystemService(Context.SENSOR_SERVICE);
2、注册传感器
sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),SensorManager.SENSOR_DELAY_GAME);
3、实现接口,以及方法
implements SensorEventListener
@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&°ree<=67){
text= "西北";
}else if (degree>68&°ree<=112){
text= "西";
}else if (degree>113&°ree<=157){
text="西南";
}else if (degree>158&°ree<=201){
text = "南";
}else if (degree>202&°ree<=247){
text = "东南";
}else if (degree>248&°ree<=291){
text = "东";
}else if (degree>292&°ree<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、注销传感器
@Override
public void onPause() {
super.onPause();
sensorManager.unregisterListener(this);
}
有什么疑问欢迎留言,一起讨论。
上一篇: 数据库索引,B+树