美文网首页
传感器Sensor

传感器Sensor

作者: 勤学奋进小郎君 | 来源:发表于2018-10-16 21:49 被阅读0次

    简单地创建一个光传感器

    public class MainActivity extends Activity {
    
        private SensorManager sensormanager;
        private SensorEventListener sensorevent;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            /*
            传感器的创建
            1、先创建传感器管理器,管理所有传感器
            2、传入参数,指定特定传感器
            3、注册
            4、结束,注销传感器
             */
            // 1、获取传感器管理服务对象
            sensormanager = (SensorManager) getSystemService(SENSOR_SERVICE);
            // 2、特定传观器对象获取: 光传感器
            Sensor lightsensor = sensormanager.getDefaultSensor(Sensor.TYPE_LIGHT);
            // 3、注册监听器,来实时的更改操作
            //监听器:精确度更改会立即执行onSensorChanged方法
            sensorevent = new SensorEventListener() {
                @Override
                public void onSensorChanged(SensorEvent event) {
                }
    
                @Override
                public void onAccuracyChanged(Sensor sensor, int accuracy) {
                }
            };
            sensormanager.registerListener(sensorevent, lightsensor,SensorManager.SENSOR_DELAY_NORMAL);
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            sensormanager.unregisterListener(sensorevent);
            Log.e("传感器", "注销");
        }
    }
    

    速度传感器

    • 不一样的地方
    Sensor lightsensor = sensormanager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    
    • 设备返回的数据:XYZ座标轴返回的加速度


      Y轴总是9.8左右,代表地球引力作用下的加速度
    • 举个栗子: 微信摇一摇

    手机平放,力作用在Z轴;长边贴地立起,作用在X轴;短边贴地,作用在y轴

    根据上边补充的代码

            sensorevent = new SensorEventListener() {
                @Override
                public void onSensorChanged(SensorEvent event) {
                    float x = event.values[0];
                    float y = event.values[1];
                    float z = event.values[2];
                    //手机竖放,作用在Y轴,来回摇摆让x轴受力
                    if (x > 15 && y > 15){
                        //正在微信摇一摇
                    }
                }
    

    方向传感器--简易指南针

    Sensor.TYPE_ORIENTATION类型已经废弃,推荐使用加速度+磁力传感器

    • 简单获取方向传感器
      一个监听器来监听多个传感器
    public class MainActivity extends Activity {
    
        private SensorManager sensormanager;
        private SensorEventListener listener;
        private TextView textview;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            /*
            传感器的创建
            1、先创建传感器管理器,管理所有传感器
            2、传入参数,指定特定传感器
            3、注册
            4、结束,注销传感器
             */
            // 1、获取传感器管理服务对象
            sensormanager = (SensorManager) getSystemService(SENSOR_SERVICE);
            // 2、特定传观器对象获取: 方向传感器
            Sensor accelerometersensor = sensormanager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
            Sensor magneticsensor = sensormanager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
            // 3、注册监听器,来实时的更改操作
            //监听器:精确度更改会立即执行onSensorChanged方法
            listener = new SensorEventListener() {
                private float[] accelerometer = new float[3];
                private float[] magnetic = new float[3];
                @Override
                public void onSensorChanged(SensorEvent event) {
                    //判断当前是什么传感器
                    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
                        //使用clone来取值
                        accelerometer = event.values.clone();
                    }else if(event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){
                        magnetic = event.values.clone();
                    }
                    float[] R = new float[9];
                    float[] values = new float[3];
                    if (accelerometer.length != 0 && magnetic.length != 0) {
                        //根据传输的数据,计算转动角度,将结果放进长度为9的数组中
                        sensormanager.getRotationMatrix(R, null, accelerometer, magnetic);
                        //根据上面计算出的旋转矩阵R,在计算旋转角度,存进values中
                        sensormanager.getOrientation(R, values);
                        //弧度转换成角度
                        Math.toDegrees(values[0]);
                    }
                }
    
                @Override
                public void onAccuracyChanged(Sensor sensor, int accuracy) {
    
                }
            };
            //更新速率:提到游戏的规格上
            sensormanager.registerListener(listener, magneticsensor,SensorManager.SENSOR_DELAY_GAME);
            sensormanager.registerListener(listener, accelerometersensor, SensorManager.SENSOR_DELAY_GAME);
    
        }
        @Override
        protected void onDestroy() {
            super.onDestroy();
            sensormanager.unregisterListener(listener);
            Log.e("传感器", "注销");
        }
    }
    
    • 粗糙版指南针

    activity_layout.xml
    展示指针和罗盘

        <ImageView
            android:layout_width="250dp"
            android:layout_height="250dp"
            android:id="@+id/compass"
            android:src="@drawable/compass"
            android:layout_marginTop="25dp"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true" />
    
        <ImageView
            android:layout_width="96dp"
            android:layout_height="wrap_content"
            android:id="@+id/arrow"
            android:src="@drawable/arrow"
            android:layout_marginTop="53dp"
            android:layout_alignTop="@+id/compass"
            android:layout_centerHorizontal="true" />
    

    MainActivity.java

    public class MainActivity extends Activity {
    
        private SensorManager sensormanager;
        private SensorEventListener listener;
        private ImageView arrow;
        private float lastRotateDegree;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            arrow = (ImageView)findViewById(R.id.arrow);
            /*
            传感器的创建
            1、先创建传感器管理器,管理所有传感器
            2、传入参数,指定特定传感器
            3、注册
            4、结束,注销传感器
             */
            // 1、获取传感器管理服务对象
            sensormanager = (SensorManager) getSystemService(SENSOR_SERVICE);
            // 2、特定传观器对象获取: 方向传感器
            Sensor accelerometersensor = sensormanager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
            Sensor magneticsensor = sensormanager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
            // 3、注册监听器,来实时的更改操作
            //监听器:精确度更改会立即执行onSensorChanged方法
            listener = new SensorEventListener() {
                private float[] accelerometer = new float[3];
                private float[] magnetic = new float[3];
                @Override
                public void onSensorChanged(SensorEvent event) {
                    //判断当前是什么传感器
                    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
                        //使用clone来取值
                        accelerometer = event.values.clone();
                    }else if(event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){
                        magnetic = event.values.clone();
                    }
                    float[] R = new float[9];
                    float[] values = new float[3];
                    if (accelerometer.length != 0 && magnetic.length != 0) {
                        //根据传输的数据,计算转动角度,将结果放进长度为9的数组中
                        sensormanager.getRotationMatrix(R, null, accelerometer, magnetic);
                        //根据上面计算出的旋转矩阵R,在计算旋转角度,存进values中
                        sensormanager.getOrientation(R, values);
                        //弧度转换成角度
                        Log.e("角度", String.valueOf(Math.toDegrees(values[0])));
                        float angle = (float) Math.toDegrees(values[0]);
    
                            //配置转动参数
                            RotateAnimation animate = new RotateAnimation(lastRotateDegree, angle, RELATIVE_TO_SELF, 0.5f, RELATIVE_TO_SELF, 0.5f);
                            animate.setFillAfter(true);
                            //开始传动配置好的动画
                            arrow.startAnimation(animate);
                            lastRotateDegree = angle;
                    }
    
                }
    
    
                @Override
                public void onAccuracyChanged(Sensor sensor, int accuracy) {
    
                }
            };
            //更新速率:提到游戏的规格上
            sensormanager.registerListener(listener, magneticsensor,SensorManager.SENSOR_DELAY_GAME);
            sensormanager.registerListener(listener, accelerometersensor, SensorManager.SENSOR_DELAY_GAME);
    
        }
        @Override
        protected void onDestroy() {
            super.onDestroy();
            sensormanager.unregisterListener(listener);
            Log.e("传感器", "注销");
        }
    }
    

    相关文章

      网友评论

          本文标题:传感器Sensor

          本文链接:https://www.haomeiwen.com/subject/tvqkzftx.html