传感器展示

传感器展示示例通过视觉示例演示传感器使用。

概览

启动程序时,应用程序显示一个菜单,包含每个传感器的子视图按钮。传感器视图实例化给定传感器,以数字形式显示传感器的值,并以简单的图形表示进行可视化。

主视图显示了带有应用程序名称的标题以及通过 ColumnLayout 对齐的每个子视图按钮。一个 StackView 管理子视图和主菜单之间的导航。应用程序在启动时检查传感器是否可用,并禁用不可用的传感器的按钮。

注意:为了简化示例,传感器可用性只在启动时检查一次。

加速度计视图

加速度计视图显示当前设备的加速度值,并将图像移动一个与设备加速度相反的量,使图像具有与设备移动成比例的惯性效果。

图像的移动发生在加速度计的 onReadingChanged 方法中。

Accelerometer {
    id: accelerometer

    property real x: 0
    property real y: 0
    property real z: 0

    active: true
    dataRate: 25

    onReadingChanged: {
        x = (reading as AccelerometerReading).x
        y = (reading as AccelerometerReading).y
        z = (reading as AccelerometerReading).z
        imageTranslation.x = -x * 10
        imageTranslation.y = y * 10
    }
}

每当有新的加速度计值时,图像转换坐标都会相应更新。

接近度视图

接近度视图显示一个图像,每当设备的接近传感器被遮挡时,图像就会放大。

指南针视图

指南针视图显示一个指南针图像,该图像根据指南针传感器读取值旋转,使指南针指向北方。

磁力计视图

磁力计视图显示一个磁场图像,该图像围绕由 x 和 y 磁力计值给定的大矢量旋转一个量。这通常导致与指南针相同的旋转,展示了磁力计读取值的一个用法。由于磁力计提供三个轴的所有方向的读取值,因此在使用这些读取值方面有更多的自由度。

Magnetometer {
    id: magnetometer
    active: true
    dataRate: 25
    onReadingChanged: {
        root.magnetometerX = (reading as MagnetometerReading).x
        root.magnetometerY = (reading as MagnetometerReading).y
        root.magnetometerZ = (reading as MagnetometerReading).z
        root.magnetRotation =
            ((Math.atan2(root.magnetometerX, root.magnetometerY) / Math.PI) * 180)
    }
}

陀螺仪视图

陀螺仪视图也显示一个图像,该图像围绕三个轴旋转一个量,这个量是根据陀螺仪读取值计算的。由于陀螺仪提供围绕三个空间轴的相对角变化,并且读取更新之间的时间可以变化,因此会存储读取时间,并根据读取更新之间的时间进行归一化。

Gyroscope {
    id: gyroscope

    property var lastTimeStamp: 0
    property real x: 0
    property real y: 0
    property real z: 0

    active: true
    dataRate: 25

    onReadingChanged: {
        x = (reading as GyroscopeReading).x
        y = (reading as GyroscopeReading).y
        z = (reading as GyroscopeReading).z
        let firstCall = false
        if (lastTimeStamp == 0) {
            firstCall = true
        }
        let timeSinceLast = reading.timestamp - lastTimeStamp
        lastTimeStamp = reading.timestamp

        //Skipping the initial time jump from 0
        if (firstCall === true)
            return
        let normalizedX = x * (timeSinceLast / 1000000)
        imageXRotation.angle += normalizedX
        let normalizedY = y * (timeSinceLast / 1000000)
        imageYRotation.angle -= normalizedY
        let normalizedZ = z * (timeSinceLast / 1000000)
        imageZRotation.angle += normalizedZ
    }
}

按下重置按钮将图像旋转重置为 0。

示例项目 @ code.qt.io

© 2024 The Qt Company Ltd。本文件中包含的文档贡献均为各自所有者的版权。所提供的文档根据自由软件基金会发布的《GNU自由文档许可证》第1.3版本进行许可。