Android传感器——摇一摇切换图片

版权声明:转载请标注原文地址 https://blog.csdn.net/qq_39959838/article/details/80345575
在android应用程序中,很多时候需要与用户的动作行为进行互动,或者指定用户做某些行为从而完成某些动作,其中的一些行为就是触发了安卓当中的传感器,然后通过安卓封装的传感器动作,能够获取到用户的行为,然后做出相应的反馈,那么传感器又是如何开发的呢,他又有那些相关知识点呢?

android当中常用的传感器大概包括以下几种:

1.方向传感器
方向传感器用于感应手机设备的摆放状态,方向传感器可以返回三个角度,这三个角度即可确定手机的摆放状态。
关于方向传感器返回的三个角度说明如下:
第一个角度:表示手机顶部朝向与正北方的夹角,当手机绕着z轴旋转时,该角度值发生变化。
第二个方向:表示手机顶部与尾部翘起来的角度,当手机绕着x轴倾斜时,该角度值发生变化。
第三个方向:表示手机左侧或者右侧翘起的角度。当手机绕着y轴倾斜时,该角度值发生变化。

2.陀螺仪传感器
陀螺仪传感器用于手机设备的旋转速度,陀螺仪传感器可以返回设备绕x,y,z这三个坐标值
(陀螺仪传感器的坐标系统和加速度传感器的坐标系统完全相同)的旋转速度,旋转速度的单位是弧度/秒,
旋转速度为正值代表逆时针旋转,负值代表顺时针旋转。
返回的三个角速度有如下说明:
第一个值:代表该设备绕x轴旋转的角速度。
第二个值:代表该设备绕y轴旋转的角速度。
第三个值:代表该设备绕z轴旋转的角速度。

3.磁场传感器
   磁场传感器主要用于读取手机设备外部的磁场强度,即使周围没有任何直接的磁场,手机设备也始终处于
   地球的磁场中,随着手机设备摆放状态的改变,周围的磁场在手机的x,y,z方向上的影响也会发生改变。
磁场传感器会返回三个数据,分别代表周围磁场分解到x,y,z三个方向上的磁场分量,磁场数据的单位是微特斯拉。

4.重力传感器
   重力传感器会返回一个三维向量,这个三维向量可显示重力的方向和强度,重力传感器的坐标系统和
   加速度传感器的坐标系统是相同的。
当设备处于静止状态时,重力传感器的输出,与加速度传感器的输出应该是相同的。

5.线性加速度传感器
线性加速度返回一个三维向量,可显示在各方向上的加速度(不包含重力加速度)。线性加速度传感器的
坐标系统与加速度传感器的坐标系统相同。

6.温度传感器
温度传感器用于获取手机设备所处的环境的温度,温度传感器会返回一个数据,代表手机设备周围的温度,
单位是摄氏度。

7.光传感器
光传感器用于获取手机设备所处环境的光的强度,光传感器会返回一个数据,代表手机设备周围光的强度。
单位勒克斯lx。

8.压力传感器
压力传感器用于获取手机设备所处环境的压力的大小,压力传感器会返回一个数据,代表设备周围压力的大小。

9.android5.0新增的心率传感器
 心率传感器是5.0新增的一种传感器,这种传感器,可以返回佩戴该设备的人每分钟的心态次数。


android当中传感器常见知识点大概分为:

1.Android平台支持三大类传感器,分别是_位移传感器 _、_环境传感器_、_位置传感器 __。
位移传感器 
这些传感器沿三条轴线测量加速度和旋转力度。这类传感器家族包括加速度传感器,重力传感器,陀螺仪和旋转适量传感器。
环境传感器 
测量各种环境参数的传感器,如,周围的气温和气压,光线强度和湿度。这类传感器有气压,光线和温度传感器。
位置传感器 
这些传感器测量设备的物理位置,其包含方向和磁力传感器。


2.位移传感器沿三条轴线测量 加速度 和 旋转力度 。这类传感器包括加速度传感器 ,重力传感器, 陀螺仪传感器 等。
3. 位置传感器用于测量设备的 物理位置 ,其包含方向传感器 和 磁力传感器 。
4.使用传感器需要做如下工作: 确定设备上有哪些传感器 , 确定传感器的能力(如最大的工作范围) ,
获取原始传感器数据,注册和注销传感器的监听器 。
5.Android传感器有的基于 硬件 ,有一些是基于 软件 的。
6.基于硬件的传感器是内嵌到手机或者平板中的 物理器件 ,它们的数据直接来源于测量特定的 物理特性 ,如加速度,地球磁场强度,或角速度的变化。 
7.基于软件的传感器从一个或更多的 基于硬件的传感器 中获取数据。有时候它们也被称为虚拟传感器或 合成传感器 。
8. 使用SensorManager 可以创建传感器服务的实例,通过 Sensor 能够创建特定传感器的实例。
9. 传感器事件包含以下信息: 原始传感器数据 , 产生事件的传感器类型 ,数据准确性,以及 事件的时间 。
10.注册传感器的监听器需要实现的接口为: SensorEventListener 


关于传感器的开发步骤可以总结为如下所示:

1.调用context的getsystemservice(context.SENSOR_SERVICE)方法获取SensorManager对象,
SensorManager对象代表系统的传感器管理服务。
2.调用SensorManager的getDefaultSensor(int type)方法来获取指定类型的传感器。
3.通常选择在activity的onResume()方法中调用SensorManager的registerListener()方法为
指定的传感器注册监听器,程序通过实现监听器即可获取传感器传回来的数据。
SensorManager提供的注册传感器的方法为:registerListener(......);方法中的参数有如下的说明。
Listener:监听传感器事件的监听器,该监听器需要实现SensorEventListener接口。
4.在activity的onPause()方法中调用SensorManager的unregisterListener()方法注销监听器。


接下来我们使用具体的案例进一步理解一下传感器的使用:使用加速度传感器完成摇晃切换背景图片的功能。

1.绘制布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@mipmap/loading1"
    android:id="@+id/change_layout">

</LinearLayout>
2.在activity当中编写java代码的内容
public class AcceleChangeImgActivity extends AppCompatActivity {

    private LinearLayout layout;
    private SensorManager manager;
    private Sensor sensor;
    private int what = 0;
//    获取震动服务对象
    private Vibrator vibrator;
    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            if (msg.what==0) {
                layout.setBackgroundResource(R.mipmap.loading1);
            }else if (msg.what==1) {
                layout.setBackgroundResource(R.mipmap.loading2);
            }else if(msg.what==2){
                layout.setBackgroundResource(R.mipmap.loading3);
            }else if (msg.what==3){
                layout.setBackgroundResource(R.mipmap.meinv);
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_accele_change_img);
        layout = (LinearLayout) findViewById(R.id.change_layout);
//        1.获取传感器服务管理对象
        manager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
//        2.获取传感器对象
        sensor = manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
//        3.注册传感器监听器
        manager.registerListener(listener,sensor,manager.SENSOR_DELAY_NORMAL);
//        震动服务对象
        vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
    }

    //    创建监听器对象
    SensorEventListener listener = new SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent event) {
            float[] values = event.values;
            float x = values[0];
            float y = values[1];
            float z = values[2];

            int coll = 18;   //作为一个标准值
//            判断在什么情况下要切换图片
            if (Math.abs(x)>coll|Math.abs(y)>coll|Math.abs(z)>coll) {
                /**
                 * 300:摇晃了300毫秒之后,开始震动
                 * 500:震动持续的时间,震动持续了500毫秒。
                 * */
                long[]pattern = {300,500};
                vibrator.vibrate(pattern,-1);
                what++;
                if (what>3) {
                    what = 0;
                }
                handler.sendEmptyMessage(what);
            }
        }
        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {

        }
    };

//    4.注销传感器监听器
    @Override
    protected void onPause() {
        super.onPause();
        manager.unregisterListener(listener);
    }
}
在代码中我们使用Vibrator对象添加了震动的功能。但是需要注意的是添加振动的权限,否则不能使用震动功能。权限如下:

<uses-permission android:name="android.permission.VIBRATE" />

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页