アクティビティの遷移が共有要素の遷移を妨害しないようにします。
終了するアクティビティで、getWindow()。setExitTransition(null);を呼び出します。
Enteringアクティビティで、getWindow()。setEnterTransition(null);を呼び出します。
https://stackoverflow.com/a/34907685/967131から
これには副作用があるのではないかと思いますが、確かではありません。それは非常にシンプルでありながら機能します。
特定の要素が点滅するのを防ぐ:
私はアレックスロックウッドの答えから始めて、それを機能させるためにかなりの実験を行いました。コアは正しいですが、受信側のアクティビティに対して彼が提案するコードは必要ありませんでしたが、(アクティビティではなく)フラグメントでそれを呼び出して、ツールバーをアクションバーとして設定することで、いくつかの問題に遭遇しました。
ああ、フラグメントの事?ステータスバーとナビゲーションバーへの参照を取得しようとすると無効になるというコメントがたくさんありました。同じことが私にも起こりました。フラグメントのレイアウトでそれらを見つけられないことに気づくまで、それらはそのレベルより上でした。したがって、以下のコードはアクティビティから装飾ビューを取得して検索します。その後、問題なく見つけました。
最後に、私はこのユーティリティメソッドを開発しました。
public static Bundle transitionOptions(Activity activity, int transitionViewResId, int transitionNameResId) {
if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) {
return null;
}
View decorView = activity.getWindow().getDecorView();
View statusBar = decorView.findViewById(android.R.id.statusBarBackground);
View navigationBar = decorView.findViewById(android.R.id.navigationBarBackground);
View appBarLayout = decorView.findViewById(**R.id.appbarlayout**);
View transitionView = decorView.findViewById(transitionViewResId);
String transitionName = activity.getString(transitionNameResId);
List<Pair<View, String>> pairs = new ArrayList<>();
pairs.add(Pair.create(statusBar, Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME));
pairs.add(Pair.create(navigationBar, Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME));
if (appBarLayout != null) {
pairs.add(Pair.create(appBarLayout, activity.getString(**R.string.transition_appbarlayout**)));
}
pairs.add(Pair.create(transitionView, transitionName));
//noinspection unchecked - we're not worried about the "unchecked" conversion of List<Pair> to Pair[] here
return ActivityOptionsCompat.makeSceneTransitionAnimation(activity, pairs.toArray(new Pair[pairs.size()]))
.toBundle();
}
R.string.transition_appbarlayoutおよびR.id.appbarlayoutに注意してください。これらのIDは、コードが使用するものと一致する限り、任意です。私のXMLでは、カスタムアクションバーを次のようにレイアウトしています(エッセンシャルに編集されています)。
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.AppBarLayout
android:id="**@+id/appbarlayout**"
android:transitionName="**@string/transition_appbarlayout**">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"/>
</android.support.design.widget.AppBarLayout>
このようなツールバーを使用しない場合、その部分をユーティリティメソッドから削除できます。
次に、フラグメントで次のように呼び出します。
startActivity(intent, UIUtils.transitionOptions(getActivity(),
R.id.**my_view**,
R.string.**transition_my_view**));
XMLと一致する限り、任意の値を使用します。
これにより、ステータスバー、ツールバー、およびナビゲーションバー(戻る/ホーム/最近のアプリボタン)が移行中に点滅するのを防ぎます。残りのアクティビティ遷移は正常です。
私の場合、アプリのテーマはandroid:windowBackground
青色です。これにより、移行中に青いフラッシュが発生し、非常にイライラします。しかし、そのようなアプリ全体に影響を与える変更を行うのではなく、今のところ、最初の迅速でダーティなオプションを使用します。