首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理像youtube一样在android上进行的视图轮转?

问如何处理像youtube一样在android上进行的视图轮转?
EN

Stack Overflow用户
提问于 2021-06-03 19:01:05
回答 1查看 705关注 0票数 1

我想实现youtube处理其视频定向的方式。

在说我必须使用onConfigurationChanged之前,有几件事需要考虑。

要考虑的事情

  1. 电话定位。这意味着你拿着电话的方式。它可以是肖像或景观

  1. 屏幕方向。这意味着视图的显示方式。它可以是肖像或景观,而不管手机

的方向如何。

YOUTUBE轮调是如何工作的?

如果手机是在纵向模式(使用操作系统快速settings)

  • The屏幕将保持在纵向
    1. 。如果你旋转手机
    2. ,那么旋转屏幕的唯一方法就是按下旋转按钮。屏幕将保持在最后的方向选择,即使你旋转手机,屏幕也不会改变。肖像将保持肖像,景观将保持LANDSCAPE.

  1. If手机是在自动旋转的mode
  • if你旋转手机,然后屏幕旋转跟随它。我是说,如果手机在人像里,屏幕就会是肖像。景观也是如此。

  • 如果按下旋转按钮,无论手机方向如何,屏幕方向都会发生变化。在这种情况下,听传感器方向的唯一方法是将手机旋转到屏幕旋转的同一一侧,然后返回。这是为了让手机传感器再次控制定位。

我有什么?

使用onConfigurationChanged,我可以知道何时旋转电话(如果启用了自动旋转)并定义布局:

代码语言:javascript
复制
override fun onConfigurationChanged(newConfig: Configuration) {
     when (newConfig.orientation) {
         Configuration.ORIENTATION_PORTRAIT -> buildPortrait()
         Configuration.ORIENTATION_LANDSCAPE -> buildLandscape()
     }

     super.onConfigurationChanged(newConfig)
}

使用旋转按钮,我可以处理屏幕方向(当手机在纵向上被从操作系统中屏蔽时)。

代码语言:javascript
复制
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
        }
    }

什么是我不能实现的?,我不知道如何处理屏幕旋转时,我有自动旋转启用,以处理旋转的传感器,同时,有一个旋转按钮,做一个旋转,而不考虑自动旋转。

重要:我在任何地方都找不到解决方案的例子。

EN

回答 1

Stack Overflow用户

发布于 2022-03-01 20:41:11

您需要使用OrientationEventListener来侦听方向更改,并在方向更改时将requestedOrientation设置为ActivityInfo.SCREEN_ORIENTATION_USER。在onOrientationChanged中传递的取向值从0到359,-1表示平坦。您需要按照以下代码将其映射到4个方向。

代码语言:javascript
复制
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
    }
}

请记住,如果自动旋转设置是打开的,则只启用上面的侦听器。

代码语言:javascript
复制
val autoRotationOn = Settings.System.getInt(contentResolver,
    Settings.System.ACCELEROMETER_ROTATION, 0) == 1
if (autoRotationOn) {
    orientationEventListener.enable()
} else {
    orientationEventListener.disable()
}

由于自动旋转设置可以在当前活动的生命周期内更改,因此您必须侦听值的更改并启用/禁用orientationEventListener。

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67827328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档