Transisi berkedip setelah perubahan orientasi

MEMPERBARUI

Saya telah menemukan bug dengan Google https://issuetracker.google.com/issues/63663775

Saya mencoba menggunakan makeSceneTransitionAnimation dalam Aplikasi Android saya saat ini.

Saya memiliki Sumber Activity, yang berisi Fragment, dan di dalam Fragmen ada RecyclerView.

Ketika saya mengklik gambar di RecyclerView saya beralih ke Target Activity saya yang berisi Fragmen yang menampilkan gambar dengan benar dengan Animasi yang dapat diterima.

Menekan tombol kembali akan membalikkan animasi dengan benar.

Cara di atas berfungsi dengan baik dalam orientasi Potret dan Lanskap.

Masalah BERKEDIP terjadi ketika saya mengubah orientasi saat melihat Fragmen target lalu menekan Tombol Kembali.

Ada masalah lain seperti gambar tidak langsung kembali ke posisi semula, dan pada perangkat lama saya melihat garis horizontal seperti gangguan dari televisi analog yang tidak disetel dengan baik.

Ini adalah BLINKING yang sangat buruk, layar perangkat menjadi HITAM sepenuhnya selama kurang lebih 500ms.

Saya telah mengunduh dan menerapkan contoh aplikasi transisi elemen bersama Google dan tampaknya memiliki "Fitur" yang sama.

Saya telah mencoba beberapa solusi dan tidak ada yang berhasil, seperti ini.

Berikut salah satu yang menunjukkan masalah tersebut.

LOGCAT DITAMBAHKAN

07-21 12:57:18.097 1962-1967/com.incentive.yellowpages I/zygote64: Do partial code cache collection, code=30KB, data=21KB
07-21 12:57:18.099 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=30KB, data=23KB
07-21 12:57:18.099 1962-1967/com.incentive.yellowpages I/zygote64: Increasing code cache capacity to 128KB
07-21 12:57:20.540 1962-2058/com.incentive.yellowpages D/OkHttp: --> GET http://www.spyur.am/en/home/search-1/?company_name=Happy http/1.1
07-21 12:57:20.688 1962-1967/com.incentive.yellowpages I/zygote64: Do partial code cache collection, code=61KB, data=55KB
07-21 12:57:20.688 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=61KB, data=55KB
07-21 12:57:20.688 1962-1967/com.incentive.yellowpages I/zygote64: Increasing code cache capacity to 256KB
07-21 12:57:21.084 1962-2058/com.incentive.yellowpages D/OkHttp: <-- 200 OK http://www.spyur.am/en/home/search-1/?company_name=Happy (543ms, unknown-length body)
07-21 12:57:22.197 1962-1967/com.incentive.yellowpages I/zygote64: Do full code cache collection, code=124KB, data=93KB
07-21 12:57:22.197 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=98KB, data=59KB
07-21 12:57:22.377 1962-1967/com.incentive.yellowpages I/zygote64: Do partial code cache collection, code=101KB, data=79KB
07-21 12:57:22.378 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=101KB, data=79KB
07-21 12:57:22.378 1962-1967/com.incentive.yellowpages I/zygote64: Increasing code cache capacity to 512KB
07-21 12:57:22.378 1962-1967/com.incentive.yellowpages I/zygote64: Compiler allocated 4MB to compile boolean org.jsoup.parser.HtmlTreeBuilderState$7.process(org.jsoup.parser.Token, org.jsoup.parser.HtmlTreeBuilder)
07-21 12:57:22.701 1962-1967/com.incentive.yellowpages I/zygote64: Compiler allocated 4MB to compile void android.view.View.<init>(android.content.Context, android.util.AttributeSet, int, int)
07-21 12:57:24.495 1962-1967/com.incentive.yellowpages I/zygote64: Do full code cache collection, code=245KB, data=178KB
07-21 12:57:24.495 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=216KB, data=130KB
07-21 12:57:25.040 1962-2058/com.incentive.yellowpages D/OkHttp: --> GET http://www.spyur.am/en/companies/happy-print-printing-house/34896 http/1.1
07-21 12:57:25.101 1962-1962/com.incentive.yellowpages D/ViewRootImpl[DetailActivity]: changeCanvasOpacity: opaque=true
07-21 12:57:25.437 1962-2058/com.incentive.yellowpages D/OkHttp: <-- 200 OK http://www.spyur.am/en/companies/happy-print-printing-house/34896 (396ms, unknown-length body)
07-21 12:57:26.111 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 0
07-21 12:57:26.123 1962-1967/com.incentive.yellowpages I/zygote64: Do partial code cache collection, code=251KB, data=168KB
07-21 12:57:26.124 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=249KB, data=168KB
07-21 12:57:26.124 1962-1967/com.incentive.yellowpages I/zygote64: Increasing code cache capacity to 1024KB
07-21 12:57:26.173 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 1
07-21 12:57:26.177 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 2
07-21 12:57:26.186 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 3
07-21 12:57:26.226 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 4
07-21 12:57:26.232 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 5
07-21 12:57:26.238 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 6
07-21 12:57:26.244 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 7
07-21 12:57:26.265 1962-1967/com.incentive.yellowpages I/zygote64: Compiler allocated 8MB to compile void android.widget.TextView.<init>(android.content.Context, android.util.AttributeSet, int, int)
07-21 12:57:26.437 1962-1962/com.incentive.yellowpages D/ViewRootImpl[DetailActivity]: changeCanvasOpacity: opaque=false
07-21 12:57:26.579 1962-1967/com.incentive.yellowpages I/zygote64: Compiler allocated 6MB to compile void android.view.ViewRootImpl.performTraversals()
07-21 12:57:27.754 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 0
07-21 12:57:27.761 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 1
07-21 12:57:27.765 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 2
07-21 12:57:27.772 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 3
07-21 12:57:27.784 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 4
07-21 12:57:27.788 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 5
07-21 12:57:27.792 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 6
07-21 12:57:27.796 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 7
07-21 12:57:29.889 1962-1962/com.incentive.yellowpages D/ViewRootImpl[DetailActivity]: changeCanvasOpacity: opaque=false
07-21 12:57:30.117 1962-1962/com.incentive.yellowpages D/ViewRootImpl[DetailActivity]: changeCanvasOpacity: opaque=false
07-21 12:57:30.756 1962-1962/com.incentive.yellowpages W/AutofillManager: Session 409360048 could not be restored
07-21 12:57:30.922 1962-1967/com.incentive.yellowpages I/zygote64: Do full code cache collection, code=498KB, data=362KB
07-21 12:57:30.923 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=445KB, data=262KB

person Hector    schedule 04.07.2017    source sumber
comment
Mungkin di sini: github.com/saulmm/Android-Material-Examples   -  person RonTLV    schedule 14.07.2017
comment
Bisakah Anda memposting video dengan perilaku tersebut?   -  person azizbekian    schedule 14.07.2017
comment
@azizbekian Saya telah menambahkan tautan ke video, BLINK terjadi pada 0,06 (atau setelahnya)   -  person Hector    schedule 14.07.2017
comment
Jawaban @azizbekian memang menghentikan perilaku BLINK namun pendekatan ini tidak dapat diterima untuk situasi khusus saya. Dengan menjaga tampilan lanskap dalam potret sementara transisi selesai membuat bagian atas dan bawah layar KOSONG yang hampir sama buruknya dengan gejala asli BERKEDIP seluruh layar. Alangkah baiknya jika memahami mengapa BLINK terjadi. Saya tidak dapat menerima BLINK yang terjadi hanya karena layar telah dibuat ulang karena perubahan orientasi.   -  person Hector    schedule 21.07.2017
comment
By keeping the landscape view in portrait... - bisakah Anda menjelaskan apa artinya ini? ...leaves the top and bottom of the screen BLANK - mungkin beberapa video?   -  person azizbekian    schedule 21.07.2017
comment
@azizbekian pertama-tama saya harus mengakui bahwa saya tidak dapat membuat proyek github Anda dibangun dan diterapkan ke perangkat O saya, jadi saya hanya menggunakan GIF yang Anda lampirkan. Proyek Anda tampaknya Java dan Kotlin, Kotlin bukanlah opsi yang dapat saya gunakan. Di GIF Anda tampak bahwa ketika orientasi layar terjadi dan transisi selesai, perangkat Anda dalam keadaan Potret dengan tampilan layar masih menampilkan tampilan lanskap. Mungkin ini kesalahan saya karena GIF Anda tidak menampilkan peristiwa Klik di layar sehingga tidak mungkin mengetahui kapan kembali ditekan.   -  person Hector    schedule 21.07.2017
comment
@Hector, proyek tidak dipertahankan. Baru saja memeriksa dan melihat bahwa tidak lagi dibangun. Memutakhirkan beberapa plugin, mendorong perubahan. Sekarang dibuat dan berjalan di Android O.   -  person azizbekian    schedule 21.07.2017
comment
@azizbekian Saya baru saja membuat dan menerapkan aplikasi Yellow Pages Anda ke perangkat O saya (PIXEL XL) dan memiliki fitur BLINK seperti yang ditunjukkan di sini youtu.be/tGA_DGx6lbU   -  person Hector    schedule 21.07.2017
comment
@Hector, wow, itu sangat menarik. Sayangnya saya tidak memiliki perangkat dengan O dan emulator sangat tidak responsif, macet dan memuat ulang tanpa alasan. Apakah ada sesuatu di logcat?   -  person azizbekian    schedule 21.07.2017
comment
@azizbekian Saya telah menambahkan semua logcat dari video   -  person Hector    schedule 21.07.2017
comment
Saya tidak suka baris ini: zygote64: Compiler mengalokasikan 8MB untuk dikompilasi.... Sepertinya Android O terlalu ketat.   -  person azizbekian    schedule 21.07.2017


Jawaban (3)


Inilah masalahnya: Anda memulai Activity2 dalam mode potret dan kembali ke Activity1 dalam mode lanskap. Namun karena Anda telah melakukan perubahan orientasi, hierarki tampilan Activity1 dimusnahkan dan dibuat, sehingga tidak ada lagi View tempat transisi awal dimulai.

Yang dapat Anda lakukan adalah memetakan ulang tampilan dari yang lama ke yang baru menggunakan Activity#setExitSharedElementCallback() API. Namun ada sedikit pekerjaan yang harus dilakukan untuk menangani situasi tersebut, yang telah saya jelaskan selangkah demi selangkah di ini jawaban.

Pilihan terbaik bagi Anda adalah memeriksa Alex Lockwood's aplikasi di github dengan fungsi yang Anda butuhkan, akan lebih mudah bagi Anda untuk memahami cara menangani situasi ini.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    setExitSharedElementCallback(new SharedElementCallback() {
        @Override
        public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {

            if (we are coming back to Activity1) {
                View newSharedElement = findViewById(R.id.your_imageview);
                if (newSharedElement != null) {
                    names.clear();
                    names.add("transition name");
                    sharedElements.clear();
                    sharedElements.put("transition name", newSharedElement);
                }
            } else {
                // we are leaving Activity1
            }
        }
    });
}

Pada dasarnya, Anda membersihkan peta dan menambahkan pasangan "tampilan nama transisi" baru ke dalamnya. Anda dapat melihat bagaimana if (we are coming back to Activity1) pemeriksaan dilakukan di sini.


Inilah fiturnya, yang diterapkan di salah satu aplikasi saya.

masukkan deskripsi gambar di sini

person azizbekian    schedule 14.07.2017
comment
youtu.be/CigNib7UI3g video ini menunjukkan bahwa aplikasi Alex memiliki masalah yang sama persis pada perubahan orientasi - person Hector; 14.07.2017
comment
Saya menghargai pekerjaan yang Anda terapkan pada contoh aplikasi Anda. Yang pasti tidak ada BLINK namun Pendekatan yang Anda ambil tidak dapat diterima untuk aplikasi khusus saya. Metode Anda untuk mempertahankan UI lanskap saat kembali ke orientasi potret menampilkan banyak tampilan layar kosong. - person Hector; 16.07.2017
comment
Seperti yang dikatakan @Hector, aplikasi sampel AlexLockwood memiliki masalah kedipan. Saya bisa melihatnya di Nexus 5X, tapi tidak di Samsung Galaxy Note 5. Saya menyarankan Anda untuk menguji aplikasi Anda di Nexus. Ini mungkin bukan bug Nexus 5X, karena aplikasi Google Foto tidak terpengaruh pada 5X, jadi ada cara untuk membuatnya berfungsi, tersembunyi di suatu tempat... - person Tim Autin; 30.11.2017

Saya pikir masalahnya ada pada batas tata letak ImageView karena transisi adegan menghitung perbedaan antara posisi awal dan akhir dan kemudian menganimasikan perbedaannya, tetapi di sini posisi akhir diubah karena perubahan orientasi, dapatkah Anda mencoba dan membuat ulang tata letak akhir segera setelah Anda tekan balik jika terjadi perubahan orientasi mungkin saya salah tetapi dapat memikirkan skenario ini saja, dapatkah Anda memberikan kode yang sama? (ini terlalu besar untuk ditambahkan sebagai komentar jadi harus ditambahkan sebagai jawaban.)

person Ankit Khare    schedule 14.07.2017

Ini sepertinya hanya terjadi di Oreo. Ini dapat direproduksi pada emulator API 26 menggunakan proyek sampel Google yang tersedia di sini: https://github.com/googlesamples/android-ActivitySceneTransitionBasic/#readme

Saya berhasil memperbaiki masalah di aplikasi saya dengan menambahkan ini:

<item name="android:windowIsTranslucent">true</item>

Untuk gaya aktivitas detail saya.

person Tim Autin    schedule 20.12.2017