您的位置:首页 > 移动开发 > Android开发

【Android开发小记--8】传感器 以及 指南针的实现

2016-02-05 00:07 816 查看

传感器

注:这里都是用的真机调试

根据生命周期,在onResume()中启用传感器,在onPause()中注销注册,

先设置传感器管理器 SensorManager,再在 onResume() 其中添加各个传感器 sensor 并监听,然后在onSensorChanged(SensorEvent event)方法中读取数据,最后还要在 onPause()(onStop())中注销注册。

MainActivity.java

public class MainActivity extends AppCompatActivity implements SensorEventListener {
    private SensorManager sensorManager;
    private Sensor sensor;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //传感器管理器
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    }
    @Override
    public void onSensorChanged(SensorEvent event) {
        switch (event.sensor.getType()) {
            case Sensor.TYPE_PROXIMITY:
                System.out.println(event.values[0]);
                break;
            case Sensor.TYPE_ACCELEROMETER:
                System.out.format("x=%f,y=%f,z=%f\n", event.values[0], event.values[1], event.values[2]);
                break;
            case Sensor.TYPE_ORIENTATION:
                System.out.format("value:%f\n", event.values[0]);
                break;
        }
    }
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }
    @Override
    protected void onResume() {
        super.onResume();
        //距离传感器
        sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
        //传感器监听器
        sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL);
        //加速度传感器
        sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL);
        //指南针传感器
        sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
        sensorManager.registerListener(this, sensor, sensorManager.SENSOR_DELAY_NORMAL);
    }
    @Override
    protected void onPause() {
        super.onPause();
        //注销注册
        sensorManager.unregisterListener(this);
    }
}


具体代码点击

指南针的实现

效果图



这里就是添加了一张图片,使用 RotateAnimation 来根据传感器数据来做相应的旋转,

MainActivity.java

public class MainActivity extends AppCompatActivity implements SensorEventListener {
    private ImageView imageView;
    private SensorManager sensorManager;
    private Sensor sensor;
    private float degrees, preDegree = 0f;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //传感器管理器
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        imageView = (ImageView) findViewById(R.id.imageView);
    }
    @Override
    protected void onResume() {
        super.onResume();
        //指南针传感器
        sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
        sensorManager.registerListener(this, sensor, sensorManager.SENSOR_DELAY_NORMAL);
    }
    @Override
    public void onSensorChanged(SensorEvent event) {
        switch (event.sensor.getType()) {
            case Sensor.TYPE_ORIENTATION:
                degrees = -event.values[0];//读取度数
                //在屏幕上显示,若变化大于5度就显示变化
                if (Math.abs(degrees - preDegree) > 5) {
                    RotateAnimation ra = new RotateAnimation(preDegree, degrees, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
                    ra.setDuration(200);
                    ra.setFillAfter(true);//保持在这里
                    imageView.startAnimation(ra);
                    preDegree = degrees;//下次的初始数据
                }
                break;
        }
    }
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }
    @Override
    protected void onPause() {
        super.onPause();
        //注销注册
        sensorManager.unregisterListener(this);
    }
}


具体代码点击

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: