Android传感器(三):方向传感器

  1. 新建BaseActivity类

由于传感器较多,新建一个BaseActivity封装属性和方法:

package com.example.gingerbread;

import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.widget.TextView;

public class BaseActivity extends Activity implements SensorEventListener {
    public TextView tx1;
    public TextView tx2;
    public float[] angle = new float[3];
    public long lastTime;
    public SensorManager sm;
    public String content;
    private OnChangeListener onChangeListener;
    private Sensor acceleromererSensor;

    public List<Sensor> initSensorS() {
        //获取手机所有的传感器
        sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        return sm.getSensorList(Sensor.TYPE_ALL);
    }

    public void initSensor(Context ctx, int type) {
        //根据传入的传感器类型初始化传感器
        sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        acceleromererSensor = sm.getDefaultSensor(type);
        // //注册传感器,第一个参数为距离监听器,第二个是传感器类型,第三个是获取数据速度
        sm.registerListener(this, acceleromererSensor,
                SensorManager.SENSOR_DELAY_NORMAL);
    }

    public static interface OnChangeListener {

        public void onAccuracyChanged2(Sensor sensor, int accuracy);

        public void onSensorChanged2(SensorEvent event);

    }

    public final void setOnChangeListener(OnChangeListener listener) {
        onChangeListener = listener;
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        if (sm != null) {
            //理解为取消这个事件监听实现注销传感器
            sm.unregisterListener(this);
        }
    }

    // 向量求模
    public double magnitude(float x, float y, float z) {
        double magnitude = 0;
        magnitude = Math.sqrt(x * x + y * y + z * z);
        return magnitude;
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        // TODO Auto-generated method stub
        onChangeListener.onSensorChanged2(event);

    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // TODO Auto-generated method stub
        // 精度发生改变
        // 什么也不干
        onChangeListener.onAccuracyChanged2(sensor, accuracy);
    }
}

2.方向传感器:

  • 新建activity
public class DirectionActivity extends BaseActivity implements OnChangeListener
  • 初始化UI和传感器
setContentView(R.layout.activity_main);
        tx2 = (TextView) findViewById(R.id.TextView02);
        tx1 = (TextView) findViewById(R.id.TextView01);
        // 系统设置的重力加速度标准值,设备在水平静止的情况下就承受这个压力,所以默认Y轴方向的加速度值为STANDARD_GRAVITY
        initSensor(this, Sensor.TYPE_ORIENTATION);
        setOnChangeListener(this);
  1. 主体:传感器数据处理
/**
         * 第一个角度:Azimuth (degrees of rotation around the z axis).
         * 
         * 表示手机自身的y轴与地磁场北极方向的角度,即手机顶部朝向与正北方向的角度。
         * 
         * 
         * 当手机绕着自身的z轴旋转时,该角度值将发生改变。
         * 
         * 例如该角度值为0时,表示手机顶部指向正北;该角度为90度时,代表手机顶部指向正东;该角度为180度时,代表手机顶部指向正南;
         * 该角度为270度时,代表手机顶部指向正西。
         * 
         * 
         * 
         * 第二个角度:Pitch (degrees of rotation around the x axis).
         * 
         * 表示手机顶部或尾部翘起的角度。
         * 
         * 当手机绕着自身的x轴旋转,该角度会发生变化,值的范围是-180到180度。
         * 
         * 绕着X轴顺时针旋转时,该角度是负值;
         * 
         * 绕着X轴逆时针旋转时,该角度是正值。
         * 
         * 假设将手机屏幕朝上水平放在桌子上,如果桌子是完全水平的,该角度应该是0。
         * 
         * 
         * 
         * 第三个角度:Roll (degrees of rotation around the y axis).
         * 
         * 表示手机左侧或右侧翘起的角度。
         * 
         * 当手机绕着自身Y轴旋转时,该角度值将会发生变化,取值范围是-90到90度。
         * 
         * 绕着Y轴顺时针旋转时,该角度是负值;
         * 
         * 绕着Y轴逆时针旋转时,该角度是正值。
         */
long currentTime = System.currentTimeMillis();
        // 没100毫秒取一次距离
        if (currentTime - lastTime < 100)
            return;
        lastTime = currentTime;
        // if (timestamp != 0) {
        // final float dT = (event.timestamp - timestamp) * NS2S;
        // angle[0] = event.values[0] * dT * 100;
        // angle[1] = event.values[1] * dT * 100;
        // angle[2] = event.values[2] * dT * 100;
        // }
        timestamp = event.timestamp;


        angle[0] = event.values[0];
        angle[1] = event.values[1];
        angle[2] = event.values[2];
        content = String.format("Azimuth :%8.4f , Pitch :%8.4f , Roll :%8.4f",
                angle[0], angle[1], angle[2]);
        tx2.setText(content);
        tx1.setText(timestamp + "");

Demo下载:gingerbread
相关链接:我的Android开发相关文章

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风晴03

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值