2014-04-03 43 views
5

我试图模仿YouTube Android应用程序的行为被点击视频播放器的“全屏”按钮时:切换全屏模式和方向,如YouTube

  • 如果设备是目前在肖像,马上旋转风景(即使用户仍然握住设备以纵向拍摄)并保持在风景中,直到用户将设备旋转到风景然后旋转回人像
    • 如果设备当前处于风景中,立即旋转为纵向(即使用户仍然将设备保持纵向)并保持纵向直到用户将设备旋转到纵向然后再旋转到t o风景。
    • 在任何时候,允许用户手动将他们的设备旋转到所需的方向。

看来,如果我强迫旋转到横向或纵向使用:

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

...我立即失去检测传感器方向的能力改变(即,一旦用户处于风景中,并且他们想要手动将设备旋转回肖像)。

如果我在onConfigurationChanged中将要求的方向更改为未指定或传感器,则方向短暂地翻转为横向/纵向(无论我上面要求),然后捕捉到与设备握持方式相匹配的方向。

有关如何实现上述目标的任何想法?

回答

8

我有excact同样的问题。我最终使用的是使用OrientationListener来检测用户实际已将手机倾斜到风景,然后将方向设置为SCREEN_ORIENTATION_SENSOR。

OrientationEventListener orientationEventListener = 
new OrientationEventListener(getActivity()) { 
    @Override 
    public void onOrientationChanged(int orientation) { 
     int epsilon = 10; 
     int leftLandscape = 90; 
     int rightLandscape = 270; 
     if(epsilonCheck(orientation, leftLandscape, epsilon) || 
      epsilonCheck(orientation, rightLandscape, epsilon)){ 
       getMainActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); 
      } 
     } 

     private boolean epsilonCheck(int a, int b, int epsilon) { 
      return a > b - epsilon && a < b + epsilon; 
     } 
    }; 
    orientationEventListener.enable(); 

这里是OrientationEventListener的文档:Documentation

您还需要增加检查的画像,因为你描述的需要,在原来的岗位。

+1

这应该是选定的答案。也可以做Math.abs(a - b)<ε清晰度 –

+0

非常感谢。这个对我有用 – BalaramNayak