Android SensorManager传感器应用: 横竖屏方向自动切换 和 抖动恢复屏幕方向
时间:2022-10-12 15:30:00
目录
- 1. 问题来源
- 2. 实现效果
- 3. 示例说明
- 5. 源码地址
之前写了一个简单的视频播放器:
https://blog.csdn.net/intbird/article/details/105970536
它考虑了屏幕的方向, 现在简单实现一下
1. 问题来源
- 若始终进行横竖屏切换, 没有其他条件(如屏幕方向跟随人脸模式):
下面代码的 OrientationEventListener onOrientationChanged
判断屏幕角度 再进行 旋转屏幕的方向 即可实现 - 但: 如果手机处于垂直屏状态, 人工操作切换为横屏(如播放视频):
屏幕旋转路径如下:
竖屏(原始) > 横屏(手动) -> 竖屏(自动检测后恢复)
问题: 这导致手动切换后屏幕方向无效(等于多余)
所以: 需要自动旋转屏幕一些
开关和关闭开关
(我看ipad抖动方向回正) - 手机传感器有一些差异,需要后续调整(传感器类型)
这里简单的用屏幕摇动 45° 内部是方向切换
2. 实现效果
矿泉水瓶是直立参照物
3. 示例说明
官方文档: https://developer.android.com/guide/topics/sensors/sensors_overview
- 方向检测代码: OrientationEventListener 自动切换屏幕
- 开启检测条件: SensorEventListener: 识别传感器晃动动作
- 关闭条件: 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 请说明转载来源