42

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

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

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

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

我试过了

overridePendingTransition(0, 0);

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

[添加]

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

  • 将 android:configChanges="orientation|screenSize" 添加到 Manifest
  • 添加了 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

4

9 回答 9

26

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

于 2012-08-28T05:59:56.357 回答
23

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

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 参考和评论,这只有效:

  • API 级别 18 或以上
  • FLAG_FULLSCREEN标志是为WindowManager.LayoutParams活动设置的
  • Activity 未被另一个窗口覆盖(例如,长按电源按钮触发的关机弹出窗口)
于 2014-01-16T15:20:07.597 回答
2

You can set in the AndroidManifest a property called android:configChanges where you can decide which changes you want to manage in code. In this way, the rotation change animation will be disabled and you can handle it as you want in the method onConfigurationChanged of your Activity.

<activity
    android:name=".MySuperClass"
    android:label="@string/read_qrcode"
    android:screenOrientation="portrait"
    android:configChanges="orientation" />
于 2012-08-26T12:32:07.020 回答
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);

    }

更多细节在这里

于 2016-04-24T20:56:03.623 回答
0

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

尝试定义一个“什么都不做”动画并overridePendingTransition()用它的 id 调用。也许是这样的:

    <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 设备 :)

于 2012-08-26T12:16:33.883 回答
-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>
于 2012-08-15T08:10:32.007 回答
-1

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

这应该可以,但是根据此页面,您还应该通过将 android:configChanges="orientation|screenSize" 添加到您的活动标签来将 screenSize 添加到 configChanges。

于 2012-08-26T20:58:27.693 回答
-1

成功勾选:Java - Android 9 (Pie) - Android Studio 4.1.3 - 华为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>

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

于 2021-04-25T07:47:31.747 回答
-2

Against them who said no I say yes it is possible and it is very simple! The first thing may sound stupid but lock your application to the desired orientation! Then keep asking the gyrometer what orientation the device has an last but not least rotate or animate your views to the new orientation!

Edit: you may want to hide the system ui since it won't rotate. Mario

于 2014-01-16T14:06:19.000 回答