处理来自传感器的方向并通过手动触发它

Handling orientation from sensors and by triggering it manually

我有一个布局,我目前支持通过覆盖 onConfigurationChanged 并根据所选方向排列视图来更改方向。试图通过从 minimize/expand 视图按钮触发它来支持相同的功能,但是方向改变在新的和旧的方向上被调用了两次。

我有 adjustConfig(int orientation) 方法负责移动视图,hiding/showing 需要什么 - 它可以完成工作。

@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); } });

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

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

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

你说:

  1. the problem is that for example, if I am on a portrait and clicking on the button to switch to landscape, the flow works and kicks off onConfigurationChanged with new landscape configuration which makes the change

  2. but then immediately onConfigurationChanged gets called again with the current mode which is portrait and I end up with the initial state - portrait again.

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

只是为了确保没有遗漏任何重要细节:

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

添加附加信息后更新:

好的,现在明白了。

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

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

Activity是否锁定在特定方向都没有关系。

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

主要思想如下:

  • minimize/maximize 按钮会将 activity 锁定在特定方向,就像您现在所做的那样。

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

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

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