web-dev-qa-db-ja.com

アクティビティ間の画像遷移の点滅画面

Lollipopの新しい共有要素を使用して、2つのアクティビティ間の画像遷移を実装しました。それは動作していますが、移行中に画面全体に奇妙な白い点滅が表示され、それを取り除く方法が見つかりません。以下に例を示します。 Status bar also blinking

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>  

ご協力いただきありがとうございます

51
Leguman

終了するアクティビティで、getWindow().setExitTransition(null);を呼び出します

入力アクティビティで、getWindow().setEnterTransition(null);を呼び出します

これにより、終了するアクティビティのフェードアウトと開始するアクティビティのフェードインが防止され、明らかな点滅効果が除去されます。

36
Kevin Lee

表示されている「白い点滅」は、2つのアクティビティが遷移中にアルファアニメーションを行ったり来たりした結果です。アクティビティAがアクティビティBを開始すると、アクティビティAがフェードしますアウトとアクティビティBはフェードインします。

移行中にステータスバーやナビゲーションバーがフェードしないようにする(したがって、「点滅」効果を少し減らす)場合は、 this post をご覧ください。

18
Alex Lockwood

デフォルトのテーマの背景色を変更することでこの問題を解決しました。これが誰かの時間節約に役立つことを願っています。

<item name="Android:windowBackground">@color/black</item>
<item name="Android:colorBackground">@color/black</item>
15
Webdma

ヘルパーでメソッドを作成します

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/

9
Rzodkiewka

私は同様の点滅の問題を抱えており、ここで言及した例の多くを試しましたが、私にとっては問題を解決しませんでした。私にとってうまくいったのは、2番目のアクティビティテーマのウィンドウの背景を透明に変更することでした。 (@Webdmaは黒を使用していましたが、私の場合は画面を白ではなく黒にフラッシュしました)

    <item name="Android:windowBackground">@Android:color/transparent</item>
3
Kasium

同様の問題がありました。 @Alexの提案に従って、ステータスバーとナビゲーションバーの点滅の問題を遷移から除外することで解決しましたが、アクティビティを切り替えるときに画面がまだ点滅していました。 「finish();」を削除したときstartActivity()の後のステートメント。画面の点滅が停止しました。呼び出しアクティビティが終了したことが原因の可能性があります。これが誰かを助けることを願っています。

2
Neanderthal

上記のいくつかの有用な回答。私が理解している限り、これはアクティビティ遷移の重複が原因です。この問題を克服するために、両方のアクティビティのonCreate()メソッドで次の値を使用しました。

getWindow().setAllowEnterTransitionOverlap(false);
getWindow().setAllowReturnTransitionOverlap(false);
2
Randeep

これらのコードを、移行要素を行う両方のアクティビティの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);

これにより、ナビゲーションとステータスバーからアニメーションが除外されるため、点滅がなくなります

1
Eldhopj

私の状況では、2番目のアクティビティには、このタグでアクティビティテーマで定義されたステータスバーがありませんでした。

<item name="Android:windowFullscreen">true</item>

ポートレートモードでステータスバーを非表示にすることは必須ではないため、このタグを削除し、必要に応じてステータスバーを手動で非表示/表示し、点滅が消えました。

1
JDenais

これをstyle.xmlに追加します。これにより、画面が点滅するのを防ぎます

    <item name="Android:windowIsTranslucent">true</item>
0
Rohan buddy

要素は、明示的に指定しない限り、両方のアクティビティでフェードインおよびフェードアウトします。これにはステータスとナビゲーションバーが含まれます。

特定のケースでは、ツールバーとこれら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());
0
gatti