【问题标题】:Handling orientation from sensors and by triggering it manually处理来自传感器的方向并手动触发它
【发布时间】:2019-06-22 17:01:47
【问题描述】:

我有一个布局,我目前通过覆盖onConfigurationChanged 并根据所选方向排列视图来支持方向更改。试图通过从最小化/展开视图按钮触发相同的功能来支持相同的功能,但是方向更改会被新旧方向调用两次。

我有 adjustConfig(int orientation) 方法,它负责移动视图、隐藏/显示需要的内容 - 它完成了这项工作。

@Override
public void onConfigurationChanged(Configuration newConfig) {
    adjustConfig(newConfig.orientation);
    super.onConfigurationChanged(newConfig);

  //since fullScreeBtn blocks the orientation sensors, we enable it back 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
    }
}

public void adjustConfig (int orientation) {
// do some hide/show work based on the orientation type
}

fullScreeBtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { setRequestedOrientation( getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? ActivityInfo.CREEN_ORIENTATION_PORTRAIT : ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } });

我有一个全屏/最小化按钮,可以调用 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)setRequestedOrientation(ActivityInfo.CREEN_ORIENTATION_PORTRAIT) 基于我想要更改的方向并依次触发 onConfigurationChanged 处理我的配置,到目前为止一切都很好,但问题是,例如,如果我在肖像上并单击按钮进行切换对于横向,流程工作并以新的横向配置启动onConfigurationChanged,这会进行更改,但随后立即以当前模式再次调用onConfigurationChanged,我最终以初始状态 - 再次纵向。

编辑:目前代码的工作方式是,您可以从物理旋转手机开始,然后在纵向和横向之间来回切换,或者点击最小化/全屏,但不能同时点击两者,因为我打电话的那一刻 setRequestedOrientationfullScreeBtn 它强制方向并禁用传感器侦听,所以当我点击全屏时它会根据需要旋转屏幕,然后我会旋转手机以查看它,但从这一点开始我被卡住了因为我无法物理旋转回来,只能通过再次单击最小化图像。

我的目标是同时支持传感器和手动选项,所以如果我点击fullScreeBtn,它将切换到横向模式,用户需要旋转手机来调整舒适的视图,就像YouTube 今天也是如此。

【问题讨论】:

    标签: android orientation


    【解决方案1】:

    你说:

    1. 问题是,例如,如果我在肖像上并单击 切换到横向的按钮,流程工作并开始 onConfigurationChanged 具有新的景观配置,这使得 变化

    2. 但随后会立即再次调用 onConfigurationChanged 当前模式是纵向的,我以初始状态结束- 再拍一张。

    我试图复制您的案例,但除非缺少某些细节,否则我看不出为什么要指出 nr。 2会发生。因此,在单击按钮切换到横向后,应用程序会保持横向状态 - 这也是我所期待的。

    只是为了确保没有留下任何重要的细节:

    • 您是否有机会在您的应用中收听OrientationEventListener
    • onConfigurationChanged 中是否有任何设置请求方向的逻辑?

    添加附加信息后更新:

    好的,现在说得通了。

    看,为了实现你想要的行为,就像在 Youtube 中一样,你很可能需要在游戏中加入另一个组件,它被称为:OrientationEventListener

    此监听器允许您直接从传感器监听方向变化。

    Activity 是否锁定在特定方向无关紧要。

    但是,它有点复杂,这个侦听器以度为单位传达设备的当前方向,从 0 到 359,您必须弄清楚与横向或纵向方向匹配的度数范围。

    主要思想如下:

    • 最小化/最大化按钮会将活动锁定在特定方向,就像您现在所做的那样。

    • OrientationEventListener 的实现将在后台监听设备方向。当设备方向与活动方向匹配时,这意味着设备处于横向并且活动也处于横向(或相反),您将活动方向重置回ActivityInfo.SCREEN_ORIENTATION_SENSOR。从此时起,您的 Activity 将不会被锁定在特定方向,而是会再次开始跟随传感器。

    • onConfigurationChanged() 中删除setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);,因为现在此步骤已按上述方式处理。

    首先开始研究OrientationEventListener。有关于如何使用它的示例。

    【讨论】:

    • 是的,我很抱歉没有添加此行,我另外致电(更新为问题)setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);,因为您不能使用我正在寻找的两种方式方向,因为在调用 @ 之后来自侦听器的 987654330@ 它会阻止传感器侦听器并强制更改,所以我试图再次解锁它,这导致了这两个调用。
    • 我根据提供的新信息更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多