传感器Sensor

简单地创建一个光传感器

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座标轴返回的加速度


    13671484-d7e4d727bd47009a.png
    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("传感器", "注销");
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值