web-dev-qa-db-ja.com

ポートレートからランドスケープへのデフォルトのアニメーションを無効にする

私は、横向きでも縦向きでも実行できるいくつかの「通常の」アクティビティを備えたアプリを持っています。彼らはのために設計され、主に肖像画に使用されます。

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

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

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

私はもう試した

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

42
Jorge Cevallos

回転アニメーションを制御する方法はありません。これは、アプリの外の方法で行われます。ウィンドウマネージャーの深部で、現在の画面のスクリーンショットを取得し、その背後にあるUIのサイズを変更して再構築します。次に、組み込みのアニメーションを実行して、元のスクリーンショットから再構築された新しいスクリーンショットに移行しますUI。画面の回転が変化したときにこの動作を変更する方法はありません。

25
hackbod

これは、ストックカメラアプリが回転アニメーションを無効にする方法です。

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_FULLSCREENWindowManager.LayoutParamsフラグが設定されています
  • アクティビティが別のウィンドウで覆われていない(たとえば、電源ボタンを長押しするとトリガーされる電源オフポップアップ)
21
martinpelant

AndroidManifestでAndroid:configChangesというプロパティを設定して、コードで管理する変更を決定できます。このようにして、回転変更アニメーションは無効になり、onConfigurationChangedのメソッドActivityで必要に応じてそれを処理できます。

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

それを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);

    }

詳細 こちら

1
M. Sherbeeny

あなたはすでにこれを試したかもしれませんが、念のため:

「何もしない」アニメーションを定義し、その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デバイスがありませんでした:)

0
Joe