锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

Android SensorManager传感器应用: 横竖屏方向自动切换 和 抖动恢复屏幕方向

时间:2022-10-12 15:30:00 6手动方向传感器多少

目录

  • 1. 问题来源
  • 2. 实现效果
  • 3. 示例说明
  • 5. 源码地址

之前写了一个简单的视频播放器:
https://blog.csdn.net/intbird/article/details/105970536
它考虑了屏幕的方向, 现在简单实现一下

1. 问题来源

  1. 若始终进行横竖屏切换, 没有其他条件(如屏幕方向跟随人脸模式):
    下面代码的 OrientationEventListener onOrientationChanged
    判断屏幕角度 再进行 旋转屏幕的方向 即可实现
  2. 但: 如果手机处于垂直屏状态, 人工操作切换为横屏(如播放视频):
    屏幕旋转路径如下:
    竖屏(原始) > 横屏(手动) -> 竖屏(自动检测后恢复)
    问题: 这导致手动切换后屏幕方向无效(等于多余)
    所以: 需要自动旋转屏幕 一些
    开关和关闭开关 (我看ipad抖动方向回正)
  3. 手机传感器有一些差异,需要后续调整(传感器类型)
    这里简单的用屏幕摇动 45° 内部是方向切换

2. 实现效果

矿泉水瓶是直立参照物
1

3. 示例说明

官方文档: https://developer.android.com/guide/topics/sensors/sensors_overview

  1. 方向检测代码: OrientationEventListener 自动切换屏幕
  2. 开启检测条件: SensorEventListener: 识别传感器晃动动作
  3. 关闭条件: onConfigurationChanged 屏幕方向切换后,禁止自动切换

OrientationEventListener

            orientationEventListener = object : OrientationEventListener(                 activity, sensorTime             ) {                 override fun onOrientationChanged(orientation: Int) {                     MediaLogUtil.log("Sensor onOrientationChanged: $orientation ")                     if (orientation == ORIENTATION_UNKNOWN) return                     if (orientation > 350 || orientation < 10) {                         activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT                     } else if (orientation in 70..99) {                         activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE                     } else if (orientation in 160..189) {                         activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT                     } else if (orientation in 250..279) {                         activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE                     }                 }             } 

SensorEventListener

      sensorEvent = object : SensorEventListener {                 override fun onSensorChanged(event: SensorEvent?) {                     MediaLogUtil.log("Sensor onSensorChanged: ${(event?.values?.get(2) ?: 0)} ")                     if (null == event) return                     enableOrientationEvent(event.values[2] <= 5)  // 0 ~ 10 暂时取中间值                 }                  override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {                 }             } 

onConfigurationChanged

   // fragment or activity   override fun onConfigurationChanged(newConfig: Configuration) {        enableOrientationEvent(false)   }        fun enableOrientationEvent(enable: Boolean) {         if (enable) {             orientationEventListener?.enable()         } else {             orientationEventListener?.enable()         } else {             orientationEventListener?.disable()         }     } 

5. 源码地址

播放器实现代码: https://blog.csdn.net/intbird/article/details/105970536

Github源码地址: https://github.com/intbird/VideoPlayerLib

GitHub issues(持续维护,待开发):
https://github.com/intbird/VideoPlayerLib/issues/2

文章来自:http://blog.csdn.net/intbird 请说明转载来源

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章