Mencegah transisi Aktivitas agar tidak mengganggu transisi elemen bersama:
Pada aktivitas yang keluar, panggil getWindow (). SetExitTransition (null);
Pada aktivitas yang masuk, panggil getWindow (). SetEnterTransition (null);
Dari https://stackoverflow.com/a/34907685/967131
Saya menduga ini mungkin memiliki efek samping, tetapi tidak tahu pasti. Itu mati sederhana dan bekerja sekalipun.
Cegah elemen tertentu agar tidak berkedip:
Saya mulai dengan jawaban Alex Lockwood dan melakukan sedikit percobaan untuk membuatnya bekerja. Inti dari hal itu benar, walaupun saya tidak memerlukan kode yang disarankannya untuk Aktivitas penerima, tetapi saya mengalami beberapa masalah dengan menyebutnya dalam Fragmen (bukan Aktivitas) dan dengan menetapkan bilah alat sebagai bilah tindakan.
Oh, soal Fragmen? Saya melihat banyak komentar yang mencoba mengambil referensi ke bilah status dan bilah navigasi adalah nol. Hal yang sama terjadi pada saya juga, sampai saya menyadari bahwa saya tidak akan menemukan yang ada di layout Fragment ... mereka berada di atas level itu. Karenanya, kode di bawah ini untuk mendapatkan tampilan dekorasi dari Aktivitas dan cari itu. Kemudian saya menemukan mereka tanpa masalah.
Pada akhirnya, saya mengembangkan metode utilitas ini:
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();
}
Catatan R.string.transition_appbarlayout dan R.id.appbarlayout . ID ini sewenang-wenang, asalkan cocok dengan apa yang digunakan kode Anda. Dalam XML saya, saya tata letak bilah tindakan khusus seperti itu (diedit ke bagian terpenting):
<?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>
Jika Anda tidak menggunakan Bilah Alat seperti ini, bagian itu dapat dihapus dari metode utilitas.
Maka Anda akan menyebutnya di Fragmen Anda seperti ini:
startActivity(intent, UIUtils.transitionOptions(getActivity(),
R.id.**my_view**,
R.string.**transition_my_view**));
Menggunakan nilai apa pun yang Anda inginkan, asalkan cocok dengan XML Anda.
Ini mencegah bilah status, bilah alat dan bilah navigasi (tombol back / home / apps terkini) berkedip selama transisi. Sisa dari transisi Aktivitas adalah normal.
Dalam kasus saya, tema aplikasi kami memiliki android:windowBackground
warna biru. Ini menyebabkan flash biru dalam transisi, yang cukup membuat frustrasi. Tetapi alih-alih melakukan perubahan yang memengaruhi seluruh aplikasi seperti itu, untuk saat ini saya akan menggunakan opsi pertama, cepat dan kotor.