欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Andorid 风水罗盘简单实现

程序员文章站 2022-05-27 20:57:55
...

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

上图:
Andorid 风水罗盘简单实现

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

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接口:该接口包含两个回调方法,当传感器的回传值或精度发生变化时,系统会调用这两个回调方法。

Andorid 风水罗盘简单实现

上代码

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);
    }

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