【Android入门到项目实战-- 9.4】—— 方向传感器的详细使用教程

目录

一、基础知识

二、实战使用


一、基础知识

        Android的方向传感器,返回三轴的角度数据,方向数据的单位是角度。

        提供三个数据:azimuth、pitch和roll。

        azimuth:方位,返回水平时磁北极和Y轴的夹角,范围是0°到360°;0°=北,90°=东,180°=南,270°=西。

        pitch:x轴和水平面的夹角,范围是-180°到180°;当z轴向y轴转动时,角度为正值。

        roll:y轴和水平面的夹角,范围是-90°到90°;当x轴向z轴移动时,角度为正值。

在应用程序中使用SensorManager.getOrientation()来获得原始数据。

public static float[] getOrientation (float[] R, float[] values)

第一个参数是R用来保存磁场和加速度的数据,通过该函数获取方位角。

第二个参数是函数输出,数据自动填充。

  • values[0]:方向角,但用(磁场+加速度)得到的数据范围是(-180~180),也就是说,0表示正北,90表示正东,180/-180表示正南,-90表示正西。而直接通过方向感应器数据范围是(0~359)360/0表示正北,90表示正东,180表示正南,270表示正西。
  • values[1]:pitch 倾斜角即由静止状态开始,前后翻转,手机顶部往上抬起(0~-90),手机尾部往上抬起(0~90)
  • values[2]:roll 旋转角 即由静止状态开始,左右翻转,手机左侧抬起(0~90),手机右侧抬起(0~-90)

通过函数getRotationMatrix获取R

public static boolean getRotationMatrix (float[] R, float[] I, float[] gravity, float[] geomagnetic)

注册监听

sensorManager.registerListener(this, acc_sensor, SensorManager.SENSOR_DELAY_GAME); 
sensorManager.registerListener(this, mag_sensor,SensorManager.SENSOR_DELAY_GAME); 

 

二、实战使用

 如下图:下面实现具有以下功能的简单检测。

可以检测到是否指向东北方向,手机顶部时候抬起,手机右侧是否抬起。

新建项目,修改activity_main.xml代码

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

    <TextView
        android:id="@+id/textViewx"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/textViewy"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/textViewz"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

修改MainActivity代码,如下:

public class MainActivity extends AppCompatActivity implements SensorEventListener {
    private SensorManager sm;
    TextView textViewx;
    TextView textViewy;
    TextView textViewz;
    //加速度传感器数据
    float accValues[] = new float[3];
    //地磁传感器数据
    float magValues[] = new float[3];
    //旋转矩阵,用来保存磁场和加速度的数据
    float r[] = new float[9];
    //模拟方向传感器的数据(原始数据为弧度)
    float values[] = new float[3];
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textViewx = (TextView) findViewById(R.id.textViewx);
        textViewy = (TextView) findViewById(R.id.textViewy);
        textViewz = (TextView) findViewById(R.id.textViewz);

//        获取传感器管理器
        sm = (SensorManager)getSystemService(SENSOR_SERVICE);
//        调用方法获得需要的传感器
        Sensor mSensorOrientation = sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
        Sensor nSensorOrientation = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
//        注册监听器
//        SENSOR_DELAY_FASTEST最灵敏

//        SENSOR_DELAY_GAME 游戏的时候,不过一般用这个就够了

//        SENSOR_DELAY_NORMAL 比较慢。

//        SENSOR_DELAY_UI 最慢的
        sm.registerListener(this, mSensorOrientation, android.hardware.SensorManager.SENSOR_DELAY_UI);
        sm.registerListener(this, nSensorOrientation, android.hardware.SensorManager.SENSOR_DELAY_UI);

    }

    //    该方法在传感器的值发生改变的时候调用
    @Override
    public void onSensorChanged(SensorEvent event) {
        if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
            accValues = event.values.clone();
        }
        else if(event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){
            magValues = event.values.clone();
        }

        /**
         * r:要填充的旋转数组
         * I: 将磁场数据转换进实际的重力坐标中,一般默认情况下可以设置为null
         * gravity: 加速度传感器数据
         * geomagnetic:地磁传感器数据
         */
        SensorManager.getRotationMatrix(r, null, accValues, magValues);

        /**
         * R:旋转数组
         * values:模拟方向传感器的数据
         */
        SensorManager.getOrientation(r, values);
        //将弧度转化为角度后输出
        float azimuth = (float) Math.toDegrees(values[0]);
        float pitch = (float) Math.toDegrees(values[1]);
        float roll = (float) Math.toDegrees(values[2]);
        if(azimuth >= 0 && azimuth <= 90){
            textViewx.setText(azimuth+"   "+"正指向东北方向");
        }else{
            textViewx.setText(azimuth+"");
        }
        if(pitch <=0 && pitch >= -90){
            textViewy.setText(pitch+"   "+"手机顶部正往上抬起");
        }else{
            textViewy.setText(pitch+"");
        }
        if(roll <=0 && pitch >= -90){
            textViewz.setText(roll+"   "+"手机右侧正往上抬起");
        }else{
            textViewz.setText(roll+"");
        }

    }

    //    当传感器的进度发生改变时会回调
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }
    //    在activity变为不可见的时候,传感器依然在工作,这样很耗电,所以我们根据需求可以在onPause方法里面停掉传感器的工作
    @Override
    public void onPause() {
        sm.unregisterListener(this);
        super.onPause();
    }
}

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PDI-CE-9.4是Pentaho Data Integration Community Edition的一个版本。下面是关于如何部署和安装PDI-CE-9.4的步骤: 1. 首先,你需要去PDI-CE-9.4的官方网站,下载相应的软件包。下载完后,解压缩软件包到你想要安装的目录。 2. 接下来,你需要检查你的系统是否具备运行PDI-CE-9.4的要求。确保你的系统满足最低硬件和软件要求,以确保软件能够正常运行。 3. 打开解压后的文件夹,找到运行PDI-CE-9.4的可执行文件,例如`spoon.bat`(Windows系统)或`spoon.sh`(Linux/Unix系统)。 4. 双击运行`spoon.bat`(Windows系统)或通过终端运行`./spoon.sh`(Linux/Unix系统),启动PDI-CE-9.4。 5. 在PDI-CE-9.4启动后,你将看到一个图形界面。你可以在这里创建、编辑和执行数据集成和转换的任务。 6. 在使用PDI-CE-9.4时,你需要连接到相应的数据库。你可以通过点击菜单栏中的"连接"按钮,然后选择需要连接的数据库类型,并提供相关的连接信息。 7. 在创建和编辑任务时,你可以使用PDI-CE-9.4提供的各种转换步骤和作业入口来操作数据。 8. 在完成任务设置和编辑后,你可以点击菜单栏中的"运行"按钮来执行任务。你还可以使用调试功能来调试任务并查看执行过程中的数据变化和结果。 9. 在使用完毕后,你可以点击菜单栏中的"退出"按钮或关闭PDI-CE-9.4窗口来退出软件。 这些是关于PDI-CE-9.4部署和安装的一些简要步骤。根据不同的操作系统和实际需求,可能会有些许差异,但总体过程大致相同。希望这些步骤能帮助你成功地部署和安装PDI-CE-9.4

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

四月天行健

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

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

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

打赏作者

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

抵扣说明:

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

余额充值