我想实现youtube处理其视频定向的方式。
在说我必须使用onConfigurationChanged之前,有几件事需要考虑。
要考虑的事情
的方向如何。
YOUTUBE轮调是如何工作的?
如果手机是在纵向模式(使用操作系统快速settings)
我有什么?
使用onConfigurationChanged,我可以知道何时旋转电话(如果启用了自动旋转)并定义布局:
override fun onConfigurationChanged(newConfig: Configuration) {
when (newConfig.orientation) {
Configuration.ORIENTATION_PORTRAIT -> buildPortrait()
Configuration.ORIENTATION_LANDSCAPE -> buildLandscape()
}
super.onConfigurationChanged(newConfig)
}使用旋转按钮,我可以处理屏幕方向(当手机在纵向上被从操作系统中屏蔽时)。
fun rotate() {
val orientation = requireActivity().requestedOrientation
val isRotationOn = Settings.System.getInt(requireActivity().contentResolver,
Settings.System.ACCELEROMETER_ROTATION, 0) == 1
requireActivity().requestedOrientation = if (isRotationOn) {
// AUTO-ROTATE enabled
TODO()
} else
// PORTRAIT BLOCKED
if (orientation == PORTRAIT) {
buildLandscape()
LANDSCAPE
} else {
buildPortrait()
PORTRAIT
}
}什么是我不能实现的?,我不知道如何处理屏幕旋转时,我有自动旋转启用,以处理旋转的传感器,同时,有一个旋转按钮,做一个旋转,而不考虑自动旋转。
重要:我在任何地方都找不到解决方案的例子。
发布于 2022-03-01 20:41:11
您需要使用OrientationEventListener来侦听方向更改,并在方向更改时将requestedOrientation设置为ActivityInfo.SCREEN_ORIENTATION_USER。在onOrientationChanged中传递的取向值从0到359,-1表示平坦。您需要按照以下代码将其映射到4个方向。
orientationEventListener = object: OrientationEventListener(this) {
override fun onOrientationChanged(orientation: Int) {
val newOrientation = when (orientation) {
in 0 .. 44 -> 0
in 45 .. 134 -> 1
in 135 .. 224 -> 2
in 225 .. 314 -> 3
in 315 .. 359 -> 0
else -> ORIENTATION_UNKNOWN
}
if (newOrientation != previousOrientation) {
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER
}
previousOrientation = newOrientation
}
}请记住,如果自动旋转设置是打开的,则只启用上面的侦听器。
val autoRotationOn = Settings.System.getInt(contentResolver,
Settings.System.ACCELEROMETER_ROTATION, 0) == 1
if (autoRotationOn) {
orientationEventListener.enable()
} else {
orientationEventListener.disable()
}由于自动旋转设置可以在当前活动的生命周期内更改,因此您必须侦听值的更改并启用/禁用orientationEventListener。
private val contentObserver = object:ContentObserver(handler) {
override fun onChange(selfChange: Boolean) {
super.onChange(selfChange)
setupOrientationEventListener()
}
}
val settingUri = Settings.System.getUriFor(Settings.System.ACCELEROMETER_ROTATION)
contentResolver.registerContentObserver(settingUri, false, contentObserver)https://stackoverflow.com/questions/67827328
复制相似问题