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&&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、注销传感器

 @Override
    public void onPause() {
        super.onPause();
        sensorManager.unregisterListener(this);
    }

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

猜你喜欢

转载自blog.csdn.net/u013933720/article/details/79839747
今日推荐