Lollipopの新しい共有要素を使用して、2つのアクティビティ間の画像遷移を実装しました。それは動作していますが、移行中に画面全体に奇妙な白い点滅が表示され、それを取り除く方法が見つかりません。以下に例を示します。
2番目のアクティビティの起動方法は次のとおりです
public static void launch(
@NonNull Activity activity, @NonNull View transitionView, Game game) {
ActivityOptionsCompat options =
ActivityOptionsCompat.makeSceneTransitionAnimation(
activity, transitionView, game.gameFullId);
Intent intent = new Intent(activity, ListImportationLoginActivity.class);
intent.putExtra(INTENT_EXTRA_GAME, retailer);
ActivityCompat.startActivity(activity, intent, options.toBundle());
}
次にonCreateで:
ViewCompat.setTransitionName(mLogoView, mGame.gameFullId);
そしてテーマファイル:
<resources>
<style name="Theme.MyApp.NoActionBar" parent="Theme.MyApp.NoActionBar.Base">
<item name="Android:windowContentTransitions">true</item>
<item name="Android:windowAllowEnterTransitionOverlap">true</item>
<item name="Android:windowAllowReturnTransitionOverlap">true</item>
<item name="Android:windowSharedElementEnterTransition">@Android:transition/move</item>
<item name="Android:windowSharedElementExitTransition">@Android:transition/move</item>
</style>
</resources>
ご協力いただきありがとうございます
終了するアクティビティで、getWindow().setExitTransition(null);
を呼び出します
入力アクティビティで、getWindow().setEnterTransition(null);
を呼び出します
これにより、終了するアクティビティのフェードアウトと開始するアクティビティのフェードインが防止され、明らかな点滅効果が除去されます。
表示されている「白い点滅」は、2つのアクティビティが遷移中にアルファアニメーションを行ったり来たりした結果です。アクティビティA
がアクティビティB
を開始すると、アクティビティA
がフェードしますアウトとアクティビティB
はフェードインします。
移行中にステータスバーやナビゲーションバーがフェードしないようにする(したがって、「点滅」効果を少し減らす)場合は、 this post をご覧ください。
デフォルトのテーマの背景色を変更することでこの問題を解決しました。これが誰かの時間節約に役立つことを願っています。
<item name="Android:windowBackground">@color/black</item>
<item name="Android:colorBackground">@color/black</item>
ヘルパーでメソッドを作成します
public static Transition makeEnterTransition() {
Transition fade = new Fade();
fade.excludeTarget(Android.R.id.navigationBarBackground, true);
fade.excludeTarget(Android.R.id.statusBarBackground, true);
return fade;
}
このように始めているアクティビティでそれを実行します
getWindow().setEnterTransition(TransitionUtils.makeEnterTransition());
ソース https://github.com/alexjlockwood/custom-Lollipop-transitions/
私は同様の点滅の問題を抱えており、ここで言及した例の多くを試しましたが、私にとっては問題を解決しませんでした。私にとってうまくいったのは、2番目のアクティビティテーマのウィンドウの背景を透明に変更することでした。 (@Webdmaは黒を使用していましたが、私の場合は画面を白ではなく黒にフラッシュしました)
<item name="Android:windowBackground">@Android:color/transparent</item>
同様の問題がありました。 @Alexの提案に従って、ステータスバーとナビゲーションバーの点滅の問題を遷移から除外することで解決しましたが、アクティビティを切り替えるときに画面がまだ点滅していました。 「finish();」を削除したときstartActivity()の後のステートメント。画面の点滅が停止しました。呼び出しアクティビティが終了したことが原因の可能性があります。これが誰かを助けることを願っています。
上記のいくつかの有用な回答。私が理解している限り、これはアクティビティ遷移の重複が原因です。この問題を克服するために、両方のアクティビティのonCreate()
メソッドで次の値を使用しました。
getWindow().setAllowEnterTransitionOverlap(false);
getWindow().setAllowReturnTransitionOverlap(false);
これらのコードを、移行要素を行う両方のアクティビティのonCreateに追加します
Fade fade = new Fade();
View decor = getWindow().getDecorView();
fade.excludeTarget(decor.findViewById(R.id.action_bar_container),true);
fade.excludeTarget(Android.R.id.statusBarBackground,true);
fade.excludeTarget(Android.R.id.navigationBarBackground,true);
getWindow().setEnterTransition(fade);
getWindow().setExitTransition(fade);
これにより、ナビゲーションとステータスバーからアニメーションが除外されるため、点滅がなくなります
私の状況では、2番目のアクティビティには、このタグでアクティビティテーマで定義されたステータスバーがありませんでした。
<item name="Android:windowFullscreen">true</item>
ポートレートモードでステータスバーを非表示にすることは必須ではないため、このタグを削除し、必要に応じてステータスバーを手動で非表示/表示し、点滅が消えました。
これをstyle.xmlに追加します。これにより、画面が点滅するのを防ぎます
<item name="Android:windowIsTranslucent">true</item>
要素は、明示的に指定しない限り、両方のアクティビティでフェードインおよびフェードアウトします。これにはステータスとナビゲーションバーが含まれます。
特定のケースでは、ツールバーとこれら2つのビューを共有要素リストに追加します。
List<Pair> viewPairs = new ArrayList<>();
viewPairs.add(Pair.create(findViewById(Android.R.id.statusBarBackground), Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME));
viewPairs.add(Pair.create(findViewById(Android.R.id.navigationBarBackground), Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME));
// Add your views...
Pair[] array = new Pair[viewPairs.size()];
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(), viewPairs.toArray(array)).toBundle();
// ...
ActivityCompat.startActivity(activity, intent, options.toBundle());