禁用从纵向到横向的默认动画

时间:2012-08-14 17:39:33

标签: android android-layout android-animation

我有一个带有几个“正常”活动的应用程序,可以在横向或纵向上运行。它们专为肖像而设计,主要用于肖像。

这款应用只有一个活动,它使用相机并锁定在风景中。我通过将图像和文本旋转90度来“模拟”此活动是在肖像上,所以它看起来像其他活动。

在某些设备上,例如Samsung Galaxy Tab 7和Galaxy S3,从正常的纵向活动到相机横向活动并返回时会显示旋转动画。这对用户来说很困惑,因为横向活动模拟了人像。

有没有办法删除此旋转动画?理想情况下,我想更改为默认的纵向到纵向动画,但只需删除旋转动画就足够了。

我试过

overridePendingTransition(0, 0);

该方法的其他变体没有成功。

[ADDED]

根据@igalarzab,@ Georg和@Joe的建议,我做到了这一点(仍然没有运气):

  • 将Android:configChanges =“orientation | screenSize”添加到Manifest
  • 添加onConfigurationChanged
  • 创建了一个虚拟动画,它什么都不做,并添加了overridePendingTransition(R.anim.nothing,R.anim.nothing);

我有这些结果:

  • onConfigurationChanged仅在旋转相同的活动时调用(活动A在肖像上 - >活动A在横向上)。但是当从肖像上的活动A开始时它没有被调用 - >景观活动B
  • 这会阻止Activity在旋转时重新启动,但它没有删除旋转动画(在Galaxy S3,Galaxy Nexus,Galaxy Tab 7.0和Galaxy Tab 10.1上测试)
  • overridePendingTransition(R.anim.nothing,R.anim.nothing);删除了正常过渡(纵向 - >纵向和横向 - >横向)但它没有删除旋转动画(纵向 - >横向,反之亦然)。

[VIDEO]

我上传的视频显示了我要禁用的动画。当手持电话时,从相机活动(锁定到风景)更改为其他活动时会发生这种情况:

http://youtu.be/T79Q1P_5_Ck

9 个答案:

答案 0 :(得分:26)

抱歉,无法控制旋转动画。这是在您的应用程序之外完成的,在窗口管理器的深处,它获取当前屏幕的屏幕截图,调整大小并重建其背后的UI,然后运行内置动画以从原始屏幕截图转换为新的重建UI。屏幕旋转更改时无法修改此行为。

答案 1 :(得分:18)

这是相机应用程序禁用旋转动画的方式:

private void setRotationAnimation() {
    int rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE;
    Window win = getWindow();
    WindowManager.LayoutParams winParams = win.getAttributes();
    winParams.rotationAnimation = rotationAnimation;
    win.setAttributes(winParams);
}

注意:根据API Reference和下面的评论,这只适用:

  • 在API级别18或以上
  • FLAG_FULLSCREEN标志设置为活动的WindowManager.LayoutParams
  • 另一个窗口不包含活动(例如,长按电源按钮触发的关机弹出窗口)

答案 2 :(得分:2)

您可以在AndroidManifest中设置一个名为android:configChanges的属性,您可以在其中决定要在代码中管理哪些更改。这样,旋转变化动画将被禁用,您可以根据需要在onConfigurationChanged的方法Activity中处理它。

<activity
    android:name=".MySuperClass"
    android:label="@string/read_qrcode"
    android:screenOrientation="portrait"
    android:configChanges="orientation" />

答案 3 :(得分:1)

我把它放在mainActivity中并取消了旋转动画:

@Override
    public void setRequestedOrientation(int requestedOrientation) {
        super.setRequestedOrientation(requestedOrientation);

        int rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_JUMPCUT;
        Window win = getWindow();
        WindowManager.LayoutParams winParams = win.getAttributes();
        winParams.rotationAnimation = rotationAnimation;
        win.setAttributes(winParams);

    }

更多详情here

答案 4 :(得分:0)

你可能已经尝试过了,但以防万一:

尝试定义“不执行任何操作”动画并使用其ID调用overridePendingTransition()。也许是这样的:

    <set xmlns:android="http://schemas.android.com/apk/res/android" 
         android:fillAfter="true">
        <translate
            android:fromXDelta="0"
            android:toXDelta="0"
            android:duration="100" />
    </set>

抱歉,我没有使用Galaxy设备进行测试:)

答案 5 :(得分:-1)

如果您想以纵向模式设置活动,只能在清单文件中执行此操作

 <activity
     android:name=".Qosko4Activity"
     android:label="@string/app_name"
     android:screenOrientation="portrait" >
     <intent-filter>
         <action android:name="android.intent.action.MAIN" />
         <category android:name="android.intent.category.LAUNCHER" />
     </intent-filter>
 </activity>

答案 6 :(得分:-1)

  

您可以在AndroidManifest中设置一个名为的属性   android:configChanges您可以在哪里决定要进行哪些更改   管理代码。这样,旋转变化动画将是   已禁用,您可以根据需要在方法中处理它   onConfigurationChanged你的活动。

     

这应该可行,但根据this page,你还应该通过在你的活动标签中添加android:configChanges =“orientation | screenSize”来将screenSize添加到configChanges。

答案 7 :(得分:-1)

成功检查:Java - Android 9 (Pie) - Android Studio 4.1.3 - Huawei P10

六个月来我无法解决这个需求。问题出在代码中未分配的标志“FLAG_FULLSCREEN”中。

第一步 MainActivity.java:

public class MainActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    /* getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
    WindowManager.LayoutParams.FLAG_FULLSCREEN); */ // If the animation still is, try applying it.
    setRotationAnimation(); 
  }

  private void setRotationAnimation() {
    int rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_JUMPCUT;
    Window win = getWindow();
    WindowManager.LayoutParams winParams = win.getAttributes();
    winParams.rotationAnimation = rotationAnimation;
    win.setAttributes(winParams); 
  }

  public void Button (View view) {
    // Connected to android:onClick="Button" in XML.
    Intent intent = new Intent(MainActivity.this, MainActivity2.class);
    startActivity(intent);
  }
}

下一步 MainActivity2.java:

public class MainActivity2 {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);

    /* getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
    WindowManager.LayoutParams.FLAG_FULLSCREEN); */ // If the animation still is, try applying it.
    setRotationAnimation(); 
  }

  private void setRotationAnimation() {
    int rotationAnimation = 
       WindowManager.LayoutParams.ROTATION_ANIMATION_JUMPCUT;
    Window win = getWindow();
    WindowManager.LayoutParams winParams = win.getAttributes();
    winParams.rotationAnimation = rotationAnimation;
    win.setAttributes(winParams); 
  }

  public void Button (View view) {
    Intent intent = new Intent(MainActivity2.this, MainActivity.class);
    startActivity(intent);
  }
}

下一步styles.xml:

<resources>
  <style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
      <item name="android:windowFullscreen">true</item>
  </style>
</resources>

我理解的简单事情: 在运行activity2之前,您必须首先在任何地方启动“setRotationAnimation()”。 启动activity2时,您必须在其中运行“setRotationAnimation()”。 工作不正常。

答案 8 :(得分:-2)

反对那些说不,我说是的可能,这很简单!第一件事可能听起来很愚蠢,但锁定您的应用程序到所需的方向!然后继续向陀螺仪询问设备最后的方向,但最重要的是旋转或将视图设置为新方向的动画!

编辑:您可能希望隐藏系统ui,因为它不会旋转。 马里奥