Share via


轉軸角度感應器 API

轉軸角度是介於 0 到 360 之間的值:

  • 0 - 裝置已關閉 (螢幕彼此面向且不可見)
  • 90 - 裝置是「L」圖形,亦稱為「膝上型電腦狀態」或「書籍」狀態,視方向而定
  • 180 - 裝置是平面的
  • 360 - 摺疊裝置,讓螢幕彼此面對,而且只有一個螢幕在運作

提示

此程式碼範例是針對 Surface Duo 上的轉軸角度感應器所撰寫。

Jetpack 視窗管理員有一個 DeviceState API,可提供狀態 (的相關資訊,例如關閉、開啟、半開啟) ,可在多個製造商的裝置上運作。

程式碼範例

您可以使用以 Hinge Angle 感應器名稱設定的 Android 感應器管理員來測量轉軸角度。

private val HINGE_ANGLE_SENSOR_NAME = "Hinge Angle"

private var mSensorManager: SensorManager? = null
private var mHingeAngleSensor: Sensor? = null
private var mSensorListener: SensorEventListener? = null

// call setupSensors from onCreate
private fun setupSensors() {
    mSensorManager = getSystemService(SENSOR_SERVICE) as SensorManager
    val sensorList: List<Sensor> = mSensorManager!!.getSensorList(Sensor.TYPE_ALL)
    for (sensor in sensorList) {
        if (sensor.getName().contains(HINGE_ANGLE_SENSOR_NAME)) {
            mHingeAngleSensor = sensor
        }
    }
    mSensorListener = object : SensorEventListener {
        override fun onSensorChanged(event: SensorEvent) {
            if (event.sensor == mHingeAngleSensor) {
                val angle = event.values[0].toInt()
                //TODO something with angle
            }
        }

        override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {
            //TODO (if required)
        }
    }
}

override fun onPause() {
    super.onPause()
    if (mHingeAngleSensor != null) {
        mSensorManager?.unregisterListener(mSensorListener, mHingeAngleSensor)
    }
}

override fun onResume() {
    super.onResume()
    if (mHingeAngleSensor != null) {
        mSensorManager?.registerListener(
            mSensorListener,
            mHingeAngleSensor,
            SensorManager.SENSOR_DELAY_NORMAL
        )
    }
}