42

横向きまたは縦向きのいずれかで実行できるいくつかの「通常の」アクティビティを備えたアプリがあります。それらはポートレート用に設計されており、主にポートレートで使用されます。

このアプリには、カメラを使用し、横向きにロックされている1つのアクティビティがあります。このアクティビティは、画像とテキストを90度回転させることで縦向きになっているので、他のアクティビティと同じように「シミュレート」します。

Samsung Galaxy Tab7やGalaxyS3などの一部のデバイスでは、通常の縦向きのアクティビティからカメラの横向きのアクティビティに移動したり、戻ったりするときに回転アニメーションが表示されます。横向きのアクティビティは縦向きをシミュレートするため、これはユーザーを混乱させます。

この回転アニメーションを削除する方法はありますか?理想的には、デフォルトのポートレートからポートレートアニメーションに変更したいのですが、回転アニメーションを削除するだけで十分です。

私はもう試した

overridePendingTransition(0, 0);

その方法の他のバリエーションは成功しませんでした。

[追加した]

@ igalarzab、@ Georg、@ Joeによる提案に従って、私はこれを実行しました(まだ運がありません):

  • マニフェストにandroid:configChanges = "orientation|screenSize"を追加しました
  • onConfigurationChangedを追加しました
  • 何もしないダミーアニメーションを作成し、overridePendingTransition(R.anim.nothing、R.anim.nothing);を追加しました。

私はこれらの結果を得ました:

  • onConfigurationChangedは、同じアクティビティを回転する場合にのみ呼び出されます(縦向きのアクティビティA->横向きのアクティビティA)。ただし、ポートレートのアクティビティA->ランドスケープのアクティビティBから移動する場合は呼び出されません
  • これにより、回転時にアクティビティが再開されなくなりましたが、回転アニメーションは削除されませんでした(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のサイズを変更して再構築し、組み込みのアニメーションを実行して元のスクリーンショットから新しい再構築された画面に移行するウィンドウマネージャーの奥深くで行われます。 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
  • アクティビティは別のウィンドウでカバーされません(たとえば、電源ボタンを長押しすることによってトリガーされる電源オフポップアップ)
于 2014-01-16T15:20:07.597 に答える
2

android:configChangesAndroidManifestで、コードで管理する変更を決定できるというプロパティを設定できます。このようにして、回転変更アニメーションが無効になり、のメソッドで必要に応じて処理できonConfigurationChangedます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というプロパティを設定できます。このプロパティで、コードで管理する変更を決定できます。このようにして、回転変更アニメーションが無効になり、アクティビティのonConfigurationChangedメソッドで必要に応じて処理できます。

これは機能するはずですが、このページによると、アクティビティタグにandroid:configChanges = "orientation | screenSize"を追加して、configChangesにscreenSizeを追加する必要もあります。

于 2012-08-26T20:58:27.693 に答える
-1

正常にチェックオン:Java-Android 9(Pie)-Android Studio 4.1.3-Huawei P10

6か月間、私はこのニーズを解決できませんでした。問題は、コード内の割り当てられていないフラグ「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()」を実行する必要があります。正しく動作しません。

于 2021-04-25T07:47:31.747 に答える
-2

いいえと言った彼らに対して私ははいと言いますそれは可能であり、それは非常に簡単です!最初のことはばかげているように聞こえるかもしれませんが、アプリケーションを目的の方向にロックしてください!次に、ジャイロメーターにデバイスの最後の方向を尋ね続けますが、ビューを新しい方向に回転またはアニメーション化します。

編集:システムUIは回転しないため、非表示にすることをお勧めします。マリオ

于 2014-01-16T14:06:19.000 に答える