7

我正在构建一个使用相机预览的相机应用程序。为了使用全屏预览,我锁定了活动

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

现在我有以下问题:每当我呈现一个表单或我必须显示一个对话框时,它总是以横向模式显示,即使用户在纵向模式下使用他/她的设备也是如此。我尝试使用变换动画来旋转edittext视图,并且它们已正确旋转,但我仍然无法再聚焦它们,并且键盘也总是以横向显示:(

你知道有什么办法可以在这里找到路吗?

重要提示:检测方向不是这里的问题。问题是:如何以它们仍然可用的方式旋转表单/视图/视图组和键盘。

我知道它必须以某种方式成为可能:三星的相机应用程序(随 Galaxy S3 一起提供)能够在不旋转预览的情况下旋转视图,所以它必须是可能的!看:

http://www.letsgomobile.org/images/reviews/0186/galaxy-s3-camera.jpg

http://cdn2.mos.techradar.futurecdn.net//art/mobile_phones/Samsung/GalaxyS3/Galaxy%20Fire/Samsung_Galaxy_S3_25-580-100.JPG

4

6 回答 6

2

通过设置此属性

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

您仅将屏幕锁定为横向,此后即使用户以纵向模式持有设备,它也不会旋转到纵向模式。根据我对您问题的理解,您可以做一件事。

android:configChanges="orientation"

在清单文件中,将上述属性添加到您的活动中。并且在 Activity 类中重写 onConfigurationChange 方法,您可以根据需要在其中处理方向更改,而不是将 Activity 锁定到 Landscape。

如果我以正确的方式理解您的问题,那么它可能会对您有所帮助。

于 2012-12-24T14:00:02.617 回答
2

三星相机应用程序正在使用带有方向传感器的方向更改侦听器。如果用户从设置中阻止设备旋转,旋转仍然会发生。

您将需要创建完整的自定义小部件,因此您不能在 Dialog 中使用构建,您必须显示一个 CustomDialog ...。

基本思想是使用 OrientationEventListener 和 SensorManager。在设备旋转上,您必须更新您的 UI 并使用新方向旋转视图。这是关于使用 OrientationEventListener 的教程如何使用 OrientationEventListener 在大多数相机应用程序上,活动仍然在 LANDSCAPE 上被阻止。所有相机应用程序都使用此技巧来简化 SurfaceView 大小随旋转变化的处理。

于 2012-12-27T09:52:04.027 回答
0

你必须通过旋转你的设备来覆盖活动的行为,你必须在你的mafinest中添加orientationChange,然后为这个事件添加监听器并手动旋转你的视图。

如果您使用此方法,所有对话框等(系统视图)都将以正确的方式出现。

检查这个:http: //developer.android.com/reference/android/app/Activity.html#ConfigurationChanges

还有这个: 当进度对话框和后台线程处于活动状态时如何处理屏幕方向变化? (我认为第二个答案)

于 2012-12-18T14:47:45.793 回答
0

您最好尝试将另一个活动用作对话框并在清单中设置其属性(方向和主题)并使用它。

于 2012-12-26T20:48:34.297 回答
0

在您的清单文件中,为您的相机预览活动提供以下属性以 android:configChanges="keyboardHidden|orientation"获取更多信息

<activity
        android:name=".Your_Activity_Name"
        android:configChanges="keyboardHidden|orientation"
        android:label="@string/app_name" >
        <intent-filter>
            <!-- Your filter attributes if any. -->
        </intent-filter>
    </activity>

并在您的活动类中覆盖onConfigurationChanged并在关注屏幕方向模式(例如,横向或纵向)中执行必要的(根据您的需要),如下所示_

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

     // Checks the orientation of the screen
     if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
         Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        //Your code to do the other things in landscape mode...

     } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
         Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
       //Your code to do the other things in portrait mode...

     }
 }

我希望这能帮助你摆脱你的问题。

于 2012-12-27T07:24:08.330 回答
0

afaik:通过捕获方向事件并根据该方向使用新布局使屏幕膨胀来实现旋转。

  1. 在景观中膨胀
  2. 发生旋转
  3. 为您要更改的屏幕部分充气,例如,我们使用纵向按钮的新布局而不是横向按钮来为按钮的持有者视图充气。

您必须将布局切割成在运行时添加在一起的部分。

实现此目的的另一种方法是,例如,使用表面视图进行相机预览,并使用另一种布局来保持表面并在其顶部添加framelayout

于 2012-12-27T08:13:40.363 回答