Ada dua pendekatan yang dapat Anda gunakan yang saya tahu untuk mencegah bilah navigasi / status dari animasi selama transisi:
Pendekatan # 1: Kecualikan bilah status dan bilah navigasi dari transisi keluar / masuk fade standar jendela
Alasan mengapa bilah navigasi / status memudar masuk dan keluar selama transisi adalah karena secara default semua tampilan yang tidak dibagikan (termasuk latar belakang navigasi / status bilah) akan memudar / masuk masing-masing dalam aktivitas panggilan / aktivitas yang dipanggil masing-masing begitu transisi dimulai . Anda dapat, bagaimanapun, dengan mudah menyiasatinya dengan mengecualikan latar belakang navigasi / status bar dari Fade
transisi keluar / masuk standar jendela . Cukup tambahkan kode berikut ke onCreate()
metode Aktivitas Anda :
Transition fade = new Fade();
fade.excludeTarget(android.R.id.statusBarBackground, true);
fade.excludeTarget(android.R.id.navigationBarBackground, true);
getWindow().setExitTransition(fade);
getWindow().setEnterTransition(fade);
Transisi ini juga dapat dideklarasikan dalam tema aktivitas menggunakan XML (yaitu dalam res/transition/window_fade.xml
file Anda sendiri ):
<?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>
Pendekatan # 2: Tambahkan bilah status dan bilah navigasi sebagai elemen bersama
Pendekatan ini dibangun dari jawaban klmprt, yang hampir berhasil untuk saya ... walaupun saya masih perlu membuat beberapa modifikasi.
Dalam Aktivitas menelepon saya, saya menggunakan kode berikut untuk memulai Aktivitas:
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);
Sejauh ini pada dasarnya hal yang sama yang disarankan klmprt dalam jawabannya. Namun, saya juga perlu menambahkan kode berikut dalam onCreate()
metode Aktivitas saya yang disebut untuk mencegah bilah status dan bilah navigasi dari "berkedip" selama transisi:
@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;
}
});
}
Menambahkan bilah status dan latar belakang bilah navigasi sebagai elemen bersama akan memaksa mereka untuk digambar di atas transisi keluar / masuk fade default jendela, yang berarti bahwa mereka tidak akan pudar selama transisi. Diskusi lebih lanjut tentang pendekatan ini dapat ditemukan di pos Google+ ini .
Mencegah transisi Aktivitas agar tidak mengganggu transisi elemen bersama:
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:
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):
Jika Anda tidak menggunakan Bilah Alat seperti ini, bagian itu dapat dihapus dari metode utilitas.
Maka Anda akan menyebutnya di Fragmen Anda seperti ini:
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.sumber
Anda harus membagikannya
ActivityOptions.makeSceneTransitionAnimation.
Misalnya:
(permisi psuedo; saya tidak memiliki nilai android.R.id persis)
Anda dapat menjalankan transisi yang sesuai setelah membagikan tampilan.
sumber
Sejauh yang saya mengerti ini disebabkan oleh tumpang tindih kegiatan transisi. Untuk mengatasi masalah ini, saya telah menggunakan nilai-nilai berikut dalam
onCreate()
metode kedua aktivitas:sumber
Saya baru saja mengalami masalah yang sama ini, dan jawabannya tampaknya tidak ada bagian penting dari teka-teki. Ingat bahwa pada transisi elemen bersama, semuanya terjadi di Aktivitas Tujuan .
Untuk menghapus efek flashing, cukup tambahkan berikut ini ke aktivitas yang dipanggil:
Ini harus menyelesaikan masalah Anda!
sumber
getWindow().setEnterTransition(null);
pada transisi Memasuki dihapus overlay putih untuk saya.sumber
Inilah cara saya melakukannya. Saya berbagi
Status Bar
danNavigation Bar
dalamSharedElementTransition
bersama denganImageView
:sumber