簡體   English   中英

Kotlin使用運動傳感器

[英]Kotlin using Motion sensor

我試圖弄清楚使用Kotlin的運動傳感器如何工作。 我想做些什么,如果電話打開了,糾正了,如果電話關閉了,錯了。 我已經看過教程,但仍然無法弄清楚。 以下是我嘗試過的代碼。

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.content.Context
import android.hardware.Sensor
import android.hardware.SensorEvent
import android.hardware.SensorEventListener
import android.hardware.SensorManager

class MainActivity : AppCompatActivity(), SensorEventListener {

    private lateinit var sensorManager: SensorManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        this.sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager

        sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)?.let {
            this.accelerometer = it
        }

        sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY)?.let {
            this.gravity = it
        }

        sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE)?.let {
            this.gyroscope = it
        }

        sensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION)?.let {
            this.linearAcceleration = it
        }

        sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR)?.let {
            this.rotationVector = it
        }

    }

    override fun onSensorChanged(event: SensorEvent?) {
        when (event?.sensor?.type) {
            Sensor.TYPE_LINEAR_ACCELERATION -> {
                valuesLinAcceleration[0] = event.values[0]
                valuesLinAcceleration[1] = event.values[1]
                valuesLinAcceleration[2] = event.values[2]

                this.binding.tvLinearAccelX.text = event.values[0].formatValue()
                this.binding.tvLinearAccelY.text = event.values[1].formatValue()
                this.binding.tvLinearAccelZ.text = event.values[2].formatValue()
            }

            Sensor.TYPE_GRAVITY -> {
                valuesGravity[0] = event.values[0]
                valuesGravity[1] = event.values[1]
                valuesGravity[2] = event.values[2]

                this.binding.tvGravity.text = event.values[0].formatValue()
                this.binding.tvGravityY.text = event.values[1].formatValue()
                this.binding.tvGravityZ.text = event.values[2].formatValue()
            }

            Sensor.TYPE_ACCELEROMETER -> {
                val alpha = 0.8f

                accelGravity[0] = alpha * accelGravity[0] + (1 - alpha) * event.values[0]
                accelGravity[1] = alpha * accelGravity[1] + (1 - alpha) * event.values[1]
                accelGravity[2] = alpha * accelGravity[2] + (1 - alpha) * event.values[2]

                accelLin[0] = event.values[0] - accelGravity[0]
                accelLin[1] = event.values[1] - accelGravity[1]
                accelLin[2] = event.values[2] - accelGravity[2]

                this.binding.tvAccelerometerX.text = accelLin[0].formatValue()
                this.binding.tvAccelerometerY.text = accelLin[1].formatValue()
                this.binding.tvAccelerometerZ.text = accelLin[2].formatValue()

            }

            Sensor.TYPE_GYROSCOPE -> {
                valuesGyroscope[0] = event.values[0]
                valuesGyroscope[1] = event.values[1]
                valuesGyroscope[2] = event.values[2]

                this.binding.tvGyroscope.text = event.values[0].formatValue()
                this.binding.tvGyroscopeY.text = event.values[1].formatValue()
                this.binding.tvGyroscopeZ.text = event.values[2].formatValue()
            }

            Sensor.TYPE_ROTATION_VECTOR -> {
                valuesRotation[0] = event.values[0]
                valuesRotation[1] = event.values[1]
                valuesRotation[2] = event.values[2]

                this.binding.tvRotationVector.text = event.values[0].formatValue()
                this.binding.tvRotationVectorY.text = event.values[1].formatValue()
                this.binding.tvRotationVectorZ.text = event.values[2].formatValue()
            }
        }


    }

    override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {

    }
}

似乎缺少了一些東西,如果你們能指出正確的方向或正確的方法,那將非常有幫助。 謝謝

您沒有為傳感器注冊任何偵聽器,因此您將永遠不會獲得任何更新。

您可以通過以下方式注冊偵聽器:

protected void onResume() {
    super.onResume();
    sensorManager.registerListener(this, this.accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
    // repeat that line for each sensor you want to monitor
}

...

protected void onPause() {
    super.onPause();
    sensorManager.unregisterListener(this);
}

您可以根據使用情況使用不同的采樣周期。 檢查在SensorManager中定義的常量,以發現更適合您的參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM