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

Posted

技术标签:

【中文标题】禁用从纵向到横向的默认动画【英文标题】:Disable default animation from Portrait to Landscape 【发布时间】:2012-08-11 01:37:25 【问题描述】:

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

此应用有一个使用相机并锁定为横向的 Activity。我通过将图像和文本旋转 90 度来“模拟”这个活动是纵向的,所以它看起来像其他活动。

在某些设备上,例如三星 Galaxy Tab 7 和 Galaxy S3,从正常的纵向活动到相机横向活动并返回时会显示一个旋转动画。这会让用户感到困惑,因为横向活动模拟了纵向。

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

我试过了

overridePendingTransition(0, 0);

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

[添加]

按照@igalarzab、@Georg 和@Joe 的建议,我做到了(仍然没有运气):

在清单中添加了 android:configChanges="orientation|screenSize" 添加了 onConfigurationChanged 创建了一个什么都不做的虚拟动画并添加了 overridePendingTransition(R.anim.nothing, R.anim.nothing);

我得到了这些结果:

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

[视频]

我上传了一个视频,其中显示了我想禁用的动画。从相机活动(锁定为横向)更改为其他活动,同时将手机保持为纵向时会发生这种情况:

http://youtu.be/T79Q1P_5_Ck

【问题讨论】:

嗨,我肯定会关注这个问题,因为我们有类似的设置。我也尝试过 overridePendingTransition 并且无法删除令人困惑的动画。您可能会发现我关于相机人像模式可靠性的问题很有趣(如果您有任何意见,我将不胜感激)***.com/questions/11638250/… 我会在那里添加我有 Sam 的任何输入。我还没有找到任何解决方案。 你为什么使用类似 ios 的底部标签?为什么不使用操作栏?我知道这与您的问题无关,但您应该遵循设计指南,恕我直言。 这个developer.android.com/reference/android/content/…怎么样? 感谢@Gaurav,但从我的测试来看,它似乎与 overridePendingTransition() 具有相同的效果。它会移除过渡动画,但不会移除旋转。 【参考方案1】:

抱歉,没有办法控制旋转动画。这是在您的应用程序之外完成的,在窗口管理器的深处,它会在其中截取当前屏幕的屏幕截图,调整大小并重建其背后的 UI,然后运行内置动画以从原始屏幕截图过渡到新重建的屏幕截图用户界面。当屏幕旋转发生变化时,无法修改此行为。

【讨论】:

感谢@hackbod。我担心是这种情况。是的,好像做不到。 @hackbod 原生相机应用程序处理方向配置更改并进行布局更改,但它没有任何延迟或显示旋转动画。该应用如何实现这一目标? 我认为这个答案现在已经过时了 @Jason Robinson,你错了。本机相机应用程序根本不改变方向,因此它不需要改变旋转动画:相反,它接收传感器数据并处理它以检测方向何时应该改变,然后旋转活动的内容视图。您可以通过从屏幕顶部向下滑动使系统 UI 出现来看到这一点:横向时不会出现,因为它在左侧,而不是(或反向横向时右侧) 三星原生相机APP可以无缝做到这一点。您可以在没有任何布局动画的情况下更改状态栏位置。相机预览也保持不变。【参考方案2】:

这是股票相机应用禁用旋转动画的方式:

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 或以上 为 Activity 的 WindowManager.LayoutParams 设置了 FLAG_FULLSCREEN 标志 Activity 未被其他窗口覆盖(例如,长按电源按钮触发的关机弹出窗口)

【讨论】:

这是API级别18,之前是怎么做到的? @ChristopherPerry 在它根本没有旋转窗口之前,他们只是根据传感器的响应为View 设置动画。 这是一个重要的警告:“只有在传入和传出的最顶层不透明窗口设置了 #FLAG_FULLSCREEN 位时才会产生影响”,这会影响我的使用,因此这不起作用:-( 带有 4.2.1 (API 17) 的 Galaxy Nexus 3 中的相机应用具有旋转动画【参考方案3】:

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

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

【讨论】:

谢谢。但是,我已经尝试过了,并且 1)从横向上的活动 a 到纵向上的活动 b 时,不会调用 onConfigurationChanged。仅当从横向上的活动 a 旋转到纵向上的相同活动 a 时才会调用它。 2) 似乎现在禁用了旋转动画,它只是避免重新启动活动,但动画仍然存在(至少在 S3、Galaxy Nexus 和 Galaxy Tab 7 和 10.1 上)。 对不起,我不确定我是否正确理解您的问题...也许您可以使用getResources().getConfiguration().orientation 获取设备的方向以正确处理这种情况,然后旋转图像和像你说的那样发短信(必要时) 我已经在旋转图像和文本了。唯一剩下的就是禁用 Android 添加的自动旋转动画。我已经上传了一个视频,展示了在手持手机纵向更改活动时显示此动画:youtu.be/T79Q1P_5_Ck 好的!现在我跟着你...... :) 当请求相机活动时,发送一个带有调用者屏幕方向的额外意图(使用getResources().getConfiguration().orientation 获取它),然后使用setRequestedOrientation 设置相同的方向(并避免动画)。之后,您可以根据选择的方向决定是否旋转图像和文本。 不幸的是,由于一些限制,我需要相机活动始终处于横向状态。因此,即使之前的活动是在那个方向上,我也无法将其设置为纵向。【参考方案4】:

我把它放在 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.

【讨论】:

@martinpelant 你怎么看?【参考方案5】:

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

尝试定义一个“什么都不做”动画并使用其 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 设备 :)

【讨论】:

感谢您的回答。我尝试添加 overridePendingTransition(R.anim.nothing, R.anim.nothing);在完成()之后,开始活动();,在 onCreate 和 onConfigurationChanged 内部,但旋转动画没有被禁用(至少在 S3、Galaxy Nexus 和 Galaxy Tab 7 和 10.1 上没有)。 我明白了。所以它也发生在 Galaxy Nexus 上?如果是这种情况,那么也许我可以在任何 AOSP ICS 设备上试用它,甚至可以在模拟器上试用(因为我相信 Galaxy Nexus 上有一个库存的 AOSP 软件)。如果我找到任何东西,我会告诉你的。 是的。它也发生在 Galaxy Nexus 上。这个动画似乎来自 ICS 本身,不是三星添加的。谢谢。【参考方案6】:

您可以在 AndroidManifest 中设置一个名为 android:configChanges 您可以在其中决定要进行哪些更改 在代码中管理。这样,旋转变化动画就会 禁用,您可以在方法中随意处理 Activity 的 onConfigurationChanged。

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

【讨论】:

感谢您的回答。我试过在 Manifest 上添加 android:configChanges="keyboard|keyboardHidden|orientation|screenSize" 和 @Override public void onConfigurationChanged(Configuration config) ... 在 Java 上。但是,当我从横向的相机活动转到纵向的其他活动时,不会调用我的 onConfigurationChanged。仅当我更改同一活动的方向时才会调用它。【参考方案7】:

如果您只想将活动设置为纵向模式,您可以像这样在清单文件中执行此操作

 <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>

【讨论】:

谢谢。但是,我已经将我的相机活动设置为仅横向,其他活动不应仅锁定为纵向。我现在需要禁用旋转动画。【参考方案8】:

成功检查: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()”。 工作不正常。

【讨论】:

【参考方案9】:

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

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

【讨论】:

警告任何尝试此操作的人 - 当您尝试以 90 度角绘制文本和图标时,厄运在等着您。 祝你好运ActionBar

以上是关于禁用从纵向到横向的默认动画的主要内容,如果未能解决你的问题,请参考以下文章

应用动画从纵向到横向

SwiftUI - 丑陋的动画从纵向切换到横向

纵向模式下的动画UIView在ios上横向不一致

切换到横向时,Tableview 将约束更改为全屏

前端笔记十三,变形与动画相关属性

出现弹出窗口时,iOS 8 中禁用 UISplitViewController 纵向到横向旋转