1. ホーム
  2. android

[解決済み] アクティビティシーンのアニメーション遷移中にステータスバーやナビゲーションバーがアニメーションしないようにするにはどうしたらいいですか?

2022-06-25 08:18:57

質問

まず、ステータスバーの背景がダークブラウンに設定されており、ナビゲーションバーの背景がデフォルトの黒になっています。私は Material light テーマを使用しています。

新しいアクティビティを ActivityOptions.makeSceneTransitionAnimation を使用して新しいアクティビティを開始していますが、ステータス バーとナビゲーション バーの両方が一時的に白にフェードし、その後正しい色に戻ることに気づきました。

によると のドキュメントによると :

遷移の効果を完全に得るには、呼び出し側と呼び出される側の両方のアクティビティでウィンドウ コンテンツ遷移を有効にする必要があります。そうしないと、呼び出し側のアクティビティは終了時の遷移を開始しますが、その後、ウィンドウ遷移(スケールやフェードなど)が表示されます。

私は getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS); を呼び出しているアクティビティと呼び出されたアクティビティの両方で使用しています。

同様に、Enter トランジションをスライドに変更すると、ステータス バーとナビゲーション バーの両方で、白い背景を持つスライド トランジションが簡単に表示されます。

アクティビティ シーンのアニメーション遷移中に、ステータス バーとナビゲーション バーがアニメーション化しないようにするにはどうしたらよいですか?

どのように解決するのですか?

遷移中にナビゲーション/ステータス バーがアニメーションするのを防ぐために、私が知っている限りでは、2 つのアプローチがあります。

アプローチ #1: ウィンドウのデフォルトの終了/入力フェード遷移からステータス バーとナビゲーション バーを除外する

移行中にナビゲーション バーとステータス バーがフェードイン/アウトする理由は、デフォルトでは、移行が始まると、すべての非共有ビュー (ナビゲーション/ステータス バーの背景を含む) が、呼び出し/呼び出されたアクティビティでそれぞれフェードアウト/フェードアウトするからです。しかし、ナビゲーション/ステータスバーの背景をウィンドウのデフォルトの exit/enter から除外することで、簡単にこれを回避することができます。 Fade のトランジションから除外することで簡単に回避できます。次のコードをActivitysの onCreate() メソッドに追加します。

Transition fade = new Fade();
fade.excludeTarget(android.R.id.statusBarBackground, true);
fade.excludeTarget(android.R.id.navigationBarBackground, true);
getWindow().setExitTransition(fade);
getWindow().setEnterTransition(fade);

この遷移は、アクティビティのテーマでXMLを使って宣言することもできます(つまり、あなた自身の res/transition/window_fade.xml ファイルで)。

<?xml version="1.0" encoding="utf-8"?>
<fade xmlns:android="http://schemas.android.com/apk/res/android">
    <targets>
        <target android:excludeId="@android:id/statusBarBackground"/>
        <target android:excludeId="@android:id/navigationBarBackground"/>
    </targets>
</fade>

アプローチ2:ステータスバーとナビゲーションバーを共有要素で追加する

このアプローチは、klmprtの回答から構築されています。 ほとんど 私はまだ2つの修正をする必要がありましたが。

呼び出したActivityでは、次のコードを使ってActivityを開始しました。

View statusBar = findViewById(android.R.id.statusBarBackground);
View navigationBar = findViewById(android.R.id.navigationBarBackground);

List<Pair<View, String>> pairs = new ArrayList<>();
if (statusBar != null) {
  pairs.add(Pair.create(statusBar, Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME));
}
if (navigationBar != null) {
  pairs.add(Pair.create(navigationBar, Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME));
}
pairs.add(Pair.create(mSharedElement, mSharedElement.getTransitionName()));

Bundle options = ActivityOptions.makeSceneTransitionAnimation(activity, 
        pairs.toArray(new Pair[pairs.size()])).toBundle();
startActivity(new Intent(context, NextActivity.class), options);

ここまでは、klmprtさんが回答で提案したものと基本的に同じです。しかし、私はまた、私の呼ばれたアクティビティに次のコードを追加する必要がありました。 onCreate() メソッドに、移行中にステータス バーとナビゲーション バーが "点滅するのを防ぐために、次のコードを追加する必要がありました。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_next);

    // Postpone the transition until the window's decor view has
    // finished its layout.
    postponeEnterTransition();

    final View decor = getWindow().getDecorView();
    decor.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        @Override
        public boolean onPreDraw() {
            decor.getViewTreeObserver().removeOnPreDrawListener(this);
            startPostponedEnterTransition();
            return true;
        }
    });
}

ステータス バーとナビゲーション バーの背景を共有要素として追加すると、ウィンドウのデフォルトの終了/入力フェード遷移の上に描画されるようになり、遷移中にフェードしないことを意味します。この方法についての詳しい説明は この Google+ の投稿 .