Fresco: Bagikan Elemen Hilang setelah melakukan SharedElementReturnTransition di Android N

Dibuat pada 31 Agu 2016  ·  70Komentar  ·  Sumber: facebook/fresco

Saya menggunakan kode fresco terbaru untuk melakukan pekerjaan Transisi SharedElement, itu berjalan dengan baik di Android L、M, Tapi di Android N, itu salah

sebelum transisi
screenshot0

setelah transisi
screenshot0

bug help wanted

Komentar yang paling membantu

Cukup tambahkan kode ini dalam aktivitas menelepon,+1 jika ini dapat membantu Anda!!! @oprisnik


setExitSharedElementCallback(new SharedElementCallback() {

            <strong i="6">@Override</strong>
            public void onSharedElementEnd(List<String> sharedElementNames,
                                           List<View> sharedElements,
                                           List<View> sharedElementSnapshots) {

                super.onSharedElementEnd(sharedElementNames, sharedElements,
                        sharedElementSnapshots);

                for (View view : sharedElements) {
                    if (view instanceof SimpleDraweeView) {
                        view.setVisibility(View.VISIBLE);
                    }
                }
            }
        });

Semua 70 komentar

Bisakah Anda menunjukkan bagaimana Anda melakukan bagian transisi menggunakan aplikasi demo Fresco?

activity_main.xml dan activity_detail memiliki SimpleDraweeView yang sama dengan nama transisi yang sama
dan dalam metode onCreate DetailActivity seperti di bawah ini:

protected void onCreate(Bundle saveInstanceState) {
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
getWindow().setSharedElementEnterTransition(DraweeTransition.createTransitionSet(ScalingUtils.ScaleType.CENTER_CROP, ScalingUtils.ScaleType.FIT_CENTER));
getWindow().setSharedElementReturnTransition(DraweeTransition.createTransitionSet(ScalingUtils.ScaleType.FIT_CENTER, ScalingUtils.ScaleType.CENTER_CROP));
addTransitionListener();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
mBaselineJpegView = (SimpleDraweeView) findViewById(R.id.baseline_jpeg);
mBaselineJpegView.setImageURI(Uri.parse("https://www.gstatic.com/webp/gallery/1.sm.jpg"));
mBaselineJpegView.setOnClickListener(Tampilan baru.OnClickListener() {
@Mengesampingkan
public void onClick(Lihat v) {
Toast.makeText(DetailActivity.this, "dsasa", Toast.LENGTH_LONG).show();
}
});
}

addTransitionListener() tidak melakukan apa-apa hanya mencetak log

jadi apakah saya menggunakan cara yang salah untuk melakukan transisi?

Ini juga terjadi pada saya.

Saya memiliki metode onCreate() berikut sebelum super.onCreate()

supportRequestWindowFeature(Window.FEATURE_CONTENT_TRANSITIONS);
Transition fade = new Fade();
fade.excludeTarget(android.R.id.statusBarBackground, true);
fade.excludeTarget(android.R.id.navigationBarBackground, true);
Window window = getWindow();
window.setEnterTransition(fade);
window.setReturnTransition(fade);
window.setExitTransition(fade);
TransitionSet transitionSet = DraweeTransition
                    .createTransitionSet(ScalingUtils.ScaleType.CENTER_CROP,
ScalingUtils.ScaleType.CENTER_CROP);
window.setSharedElementEnterTransition(transitionSet);
window.setSharedElementExitTransition(transitionSet);

Saya mengalami masalah yang sama. setSharedElementReturnTransition tidak berfungsi di Android N. Saya telah menambahkan log ke pendengar transisi dan onTransitionStart dan onTransitionEnd tidak dipicu di Android N, tetapi di Android M & L berfungsi dengan baik.
Saya menggunakan versi terbaru dari perpustakaan Fresco com.facebook. fresco: fresco : 0.14.1 dengan com.facebook. fresco:imagepipeline-okhttp3 :0.14.1
Saya tidak memiliki masalah ini jika saya menggunakan perpustakaan Picasso untuk memuat gambar.
Skenarionya serupa: gridView, gridItem menavigasi ke Aktivitas lain (semuanya baik-baik saja di bagian ini) tetapi ketika saya kembali, tidak ada masuk kembali, gambar berkedip dan dimuat ulang (gambar placeholder tidak terlihat atau gambar yang sebelumnya sudah dimuat). Ini hanya terjadi di Android N (7.0)

Setiap pembaruan tentang masalah ini?

Beralih dari Fresco ke Picasso dan masalah teratasi. Sayang sekali perpustakaan ini tidak dipelihara sesering yang dibutuhkan oleh versi OS Android baru yang keluar.

Tampaknya masalah ini salah ditandai sebagai 'perincian kebutuhan'. Masalah ini juga ada di Android 7.1.1 (API level 25).

Terima kasih, kami akan melihat

Saya juga mengalami masalah yang sama, jadi +1 dari saya untuk memperbaikinya.

sama disini

Lakukan. Lakukan. ;-)

Ya, silakan lakukan.

Tolong...

+1

Bertanya-tanya mengapa ini bukan prioritas tinggi..

+1

Ketika saya menggulir ke posisi elemen bersama di onActivityReenter item yang hilang akan kembali meskipun dengan sedikit kedipan putih:

    <strong i="7">@Override</strong>
    public void onActivityReenter(int resultCode, Intent data) {
        super.onActivityReenter(resultCode, data);

        final int position = data.getIntExtra(EXTRA_GIF_POSITION, -1);
        if (resultCode == RESULT_OK && position != -1) {
            gifRecyclerView.getLayoutManager().scrollToPosition(position);
        }
    }

Jika seseorang mengetahui perbaikan yang lebih baik, saya akan sangat menghargai jika Anda dapat membagikannya.

Halo, saya mengalami masalah yang sama tetapi hanya di Android 7.1.1 API 25

Jika ada pembaruan tentang masalah ini, saya akan sangat menghargainya.

sama di sini di emu dengan 7.x, tapi saya menggunakan onWindowFocusChanged menjadi imersif, ketika selesai terjadi gambar akan hilang tetapi ditampilkan kembali secara instan.

Sama disini. Memanggil requestLayout pada Tampilan yang berisi SimpleDraweeView tampaknya memperbaikinya dengan beberapa kedipan. Mohon saran

Cukup tambahkan kode ini dalam aktivitas menelepon,+1 jika ini dapat membantu Anda!!! @oprisnik


setExitSharedElementCallback(new SharedElementCallback() {

            <strong i="6">@Override</strong>
            public void onSharedElementEnd(List<String> sharedElementNames,
                                           List<View> sharedElements,
                                           List<View> sharedElementSnapshots) {

                super.onSharedElementEnd(sharedElementNames, sharedElements,
                        sharedElementSnapshots);

                for (View view : sharedElements) {
                    if (view instanceof SimpleDraweeView) {
                        view.setVisibility(View.VISIBLE);
                    }
                }
            }
        });

masalah yang sama di sini... @antxyz Saya telah memasukkan kode Anda ke dalam metode onCreate aktivitas panggilan dan panggilan tetapi tidak berhasil. Gambar elemen bersama masih tidak terlihat setelah mengembalikan transisi.

Saya tidak tahu Apakah ini dapat membantu menemukan solusi, tetapi saya perhatikan bahwa ketika softkeyboard dibuka, SimpleDraweeView menjadi terlihat.

Saya mengalami masalah yang sama dan diperbaiki setelah dua panggilan ini:

  1. Tepat sebelum startActivity(... :
    setExitSharedElementCallback(new SharedElementCallback() {
                <strong i="9">@Override</strong>
                public void onSharedElementEnd(List<String> names,
                                               List<View> elements,
                                               List<View> snapshots) {
                    super.onSharedElementEnd(names, elements, snapshots);
                    for (final View view : elements) {
                        if (view instanceof SimpleDraweeView) {
                            view.post(() -> view.setVisibility(View.VISIBLE));
                        }
                    }
                }
            });
  1. Di dalam onCreate dari aktivitas baru:
setEnterSharedElementCallback(new SharedElementCallback() {
                <strong i="15">@Override</strong>
                public void onSharedElementEnd(List<String> names,
                                               List<View> elements,
                                               List<View> snapshots) {
                    super.onSharedElementEnd(names, elements, snapshots);
                    for (final View view : elements) {
                        if (view instanceof SimpleDraweeView) {
                            view.post(() -> view.setVisibility(View.VISIBLE));
                        }
                    }
                }
            });

@oprisnik ada pembaruan tentang ini? Sayang sekali belum diperbaiki.
Saya masih mengalami ini dengan API 24+, ketika elemen yang dibagikan adalah item di dalam RecyclerView .
Tidak ada solusi yang tercantum pada tiket ini yang berfungsi untuk saya (tampilan tidak pernah disetel ke tidak terlihat/hilang sejak awal).
Saya menggunakan DraweeTransition.createTransitionSet() untuk transisi masuk dan kembali.
Terkadang gambar menghilang hingga recyclerview di-scroll, terkadang muncul kembali dengan kedipan setelah beberapa saat (mungkin karena notifyDataSetChanged() dipanggil).

Tidak yakin apakah ini membantu, tetapi inilah yang terjadi di Fresco menurut log ketika aktivitas kedua ditutup dan elemen bersama kembali ke posisinya:

V/unknown:AbstractDraweeController: controller c6a03e3 9: onDetach
V/unknown:AbstractDraweeController: controller c6a03e3 9: release: image: CloseableReferenceWithFinalizer f25d513
V/unknown:AbstractDraweeController: controller f84c24e 4: onAttach: request needs submit
V/unknown:AbstractDraweeController: controller f84c24e 4: set_final_result @ onNewResult: image: CloseableReferenceWithFinalizer f25d513

Ini terjadi ketika bitmap ditampilkan lagi.
Ketika bitmap tidak ditampilkan, dua peristiwa terakhir tidak terjadi:

V/unknown:AbstractDraweeController: controller f84c24e 4: onAttach: request needs submit
V/unknown:AbstractDraweeController: controller f84c24e 4: set_final_result @ onNewResult: image: CloseableReferenceWithFinalizer f25d513

@marcosalis Saat kembali ke aktivitas pertama (dengan recyclerView). Apakah itu selalu memicu notifyDataSetChanged()?

@erikandre terima kasih atas jawabannya ;)
Setelah beberapa pengujian, saya dapat mengonfirmasi bahwa notifyDataSetChanged() tidak dipanggil, bahkan ketika bitmap ditampilkan sendiri.

Ini adalah status SimpleDraweeView jika saya menempatkan breakpoint di SharedElementCallback.onSharedElementEnd() dalam aktivitas panggilan.

 DraweeHolder{controllerAttached=false, holderAttached=true, drawableVisible=false}

PipelineDraweeController{super=PipelineDraweeController{isAttached=false, isRequestSubmitted=false, hasFetchFailed=false, fetchedImage=0, events=[...]}, dataSourceSupplier={request=ImageRequest{uri=https://OMITTED, cacheChoice=DEFAULT, decodeOptions=100-false-false-false-false-ARGB_8888-null, postprocessor=null, priority=HIGH, resizeOptions=null, rotationOptions=-1 defer:true, mediaVariations=null}}}

Saya pikir itu mungkin ada hubungannya dengan metode doDetach() dan doAttach() di SimpleDraweeView , ketika tampilan itu sendiri dalam RecyclerView .
Akhirnya, ini berhasil untuk saya (ditambahkan ke Aktivitas tempat transisi dihasilkan), meskipun tidak terlalu bersih:

        setExitSharedElementCallback(new SharedElementCallback() {
            <strong i="11">@Override</strong>
            public void onSharedElementEnd(List<String> names, List<View> elements, List<View> snapshots) {
                for (View view : elements) {
                    if (view instanceof SimpleDraweeView) {
                        view.post(() -> {
                                myAdapter.notifyDataSetChanged();
                        });
                    }
                }
            }
        });

@marcosalis Hebat Anda telah menemukan solusi! Saya mencoba mereproduksi masalah khusus ini di aplikasi Showcase yang berjalan di Genymotion dengan Android 7 tetapi tidak berhasil.

Seperti apa tampilan item untuk recyclerview? Dalam kasus saya itu hanya FrameLayout yang membungkus SimpleDraweeView.

@marcosalis solusi Anda bekerja untuk saya dengan sedikit perubahan, menghapus siklus for:

setExitSharedElementCallback(
                    new SharedElementCallback() {
                        <strong i="7">@Override</strong>
                        public void onSharedElementEnd(List<String> names, List<View> elements, List<View> snapshots) {
                            super.onSharedElementEnd(names, elements, snapshots);
                            notifyDataSetChanged();
                        }
                    }
            );

Saya baru saja menemukan masalah yang sama saat bermain-main dengan transisi antar-aktivitas. Tak satu pun dari solusi yang diusulkan di atas tampaknya berhasil. (API 25) Berikut tampilannya: https://vimeo.com/225497240

Saya pikir kami menemukan solusi dan mudah-mudahan perbaikan akan segera tersedia.

Solusinya dapat ditemukan di dc7ec2436fc9b639fe1a39398712c360b16da468.

Untuk saat ini, Anda harus menyiapkan DraweeView mana transisi dimulai dari menggunakan penanganan visibilitas warisan dengan memanggil simpleDraweeView.setLegacyVisibilityHandlingEnabled(true); (seperti yang Anda lihat dalam contoh transisi di aplikasi contoh Showcase kami) .

Bisakah Anda memeriksa apakah ini menyelesaikan masalah untuk Anda? Kami akan segera merilis versi Fresco baru yang mencakup perbaikan ini.

Ya, terima kasih! Dikonfirmasi bahwa ini menyelesaikan masalah. Menantikan versi yang diperbarui.

Kami telah merilis Fresco v1.4.0 , yang menyertakan perbaikan seperti yang disebutkan di atas. Panggil saja simpleDraweeView.setLegacyVisibilityHandlingEnabled(true); dan itu akan berfungsi sekarang.

Kami juga telah memperbarui contoh transisi Etalase untuk mencerminkan perubahan ini.

Terima kasih untuk perbaikan ini, ini bekerja dengan sempurna dalam kasus saya. Satu pertanyaan, mengapa tidak memasukkan setGlobalLegacyVisibilityHandlingEnabled ke true secara default? Ada masalah kinerja?

Penanganan visibilitas berubah dengan Android N dan perubahan saya (semacam) mengembalikan perilaku kembali ke pra-N. Mengubah perilaku ini untuk semua gambar dapat menyebabkan masalah tak terduga lainnya dan itulah mengapa kami memutuskan untuk tidak mengaktifkannya secara default. Setelah kami memverifikasi bahwa tidak ada efek samping, kami akan mempertimbangkan untuk mengaktifkannya secara default.
Jangan ragu untuk menyetelnya ke true dan laporkan kembali masalah apa pun yang Anda temui.

ezgif com-resize

Perbaikan ini tampaknya tidak bekerja secara acak. Saya menyetel setGlobalLegacyVisibilityHandlingEnabled ke true, tetapi setelah beberapa klik, gambar yang dikembalikan kosong.

Fresco 1.5.0, Oreo

Sunting: Setelah mengembangkan beberapa hari lagi dan memindahkan beberapa tampilan, saya menemukan masalah tidak terjadi sama sekali lagi pada perangkat piksel Oreo saya. Pada Nexus 5x API 24 yang saya tiru, gambar selalu kosong setelah animasi keluar.

Saya mengalami masalah yang sama dengan setLegacyVisibilityHandlingEnabled . Mengaturnya ke true berfungsi sebagian besar waktu tetapi kadang-kadang, hanya secara acak, gambar menghilang setelah transisi kembali.

@marcosalis apakah itu hanya terjadi di Oreo atau juga di Nougat?

Hai @oprisnik Saya telah berhasil mereproduksinya secara acak pada Samsung S7 (Nougat) dan pada emulator pada API 26. Beri tahu saya jika saya dapat membantu untuk men-debug-nya.

Terima kasih, saya akan mencoba repro ketika saya punya sedikit waktu lagi

@oprisnik
Dapat mengonfirmasi bahwa sepertinya tidak melakukan tugasnya hampir sepanjang waktu (API24 + API25)

Namun saya berhasil membuatnya berfungsi menggunakan peretasan berikut:

        setExitSharedElementCallback(new SharedElementCallback() {
            <strong i="8">@Override</strong>
            public void onSharedElementEnd(List<String> names,
                                           List<View> elements,
                                           List<View> snapshots) {
                super.onSharedElementEnd(names, elements, snapshots);
                for (final View view : elements) {
                    if (view instanceof SimpleDraweeView) {
                        view.post(() -> {
                            view.setVisibility(View.VISIBLE);
                            view.requestLayout();
                        });
                    }
                }
            }
        });

Saya bisa repro. Bagi saya itu hanya terjadi jarang sekalipun. Saya akan memeriksa apakah saya dapat menemukan solusi lain untuk memperbaikinya.

Halo @oprisnik ,
Apakah Anda menemukan solusi yang berbeda?

Belum, ini sulit untuk diperbaiki karena Google mengubah perilaku Lihat visibilitas, yang merusak penanganan visibilitas Fresco (yang kami perlukan untuk manajemen memori) dan saya juga tidak akan punya banyak waktu untuk melihat ini dalam waktu dekat . Namun, ada beberapa alternatif yang disebutkan di utas ini yang memperbaiki masalah (seperti solusi dari @MartB yang secara manual mengatur visibilitas).

Jika seseorang ingin melihat ini, pull reuqests selalu diterima! :)

@oprisnik , react-native-maps juga terpengaruh dari masalah ini.
Saya telah menandai baris ini sebagai komentar di file RootDrawable.java sebagai solusi.
Apakah Anda ingat/tahu masalah besar yang terkait menandai baris tersebut sebagai baris komentar?

Mengalami masalah yang sama seperti @efkan sepertinya memengaruhi sejumlah besar perangkat Android (Android Nougat 7.1 API 25 dan yang lebih baru).

Solusi mereka telah memperbaiki semua masalah yang saya alami.

@efkan saya tidak tahu persis. Saya ingat bahwa saya melihat ini juga ketika saya mencari perbaikan alternatif, tetapi mengabaikannya. Saya pikir satu masalah dengan menghapus pemeriksaan ini adalah bahwa bitmap yang mendasarinya telah dirilis (karena Tampilan tidak terlihat lagi) dan mencoba menggambarnya akan menghasilkan java.lang.RuntimeException: Canvas: trying to use a recycled bitmap ... karena BitmapDrawable tidak melakukan pemeriksaan kewarasan.

ImageView sendiri memiliki bug yang sama di mana ia tidak mengembalikan visibilitas Drawable dengan benar dari semua drawable, tetapi masih berfungsi karena sebagian besar Drawable tidak melakukan pemeriksaan visibilitas dan tidak ada manajemen memori manual - dan Bitmap yang mendasarinya akan tetap berlaku.

@oprisnik thanx untuk semua penjelasan ini.

Untuk menguji apakah ini berfungsi, cukup mudah untuk menambahkan ini sebagai pengaturan ke GenericDraweeHierarchyBuilder dan tergantung pada itu, abaikan pemeriksaan visibilitas di RootDrawable (yang dibuat di GenericDraweeHierarchy , lihat https://github.com/facebook/fresco/blob/master/drawee/src/main/Java/com/facebook/drawee/generic/GenericDraweeHierarchy.java#L155).

Jangan ragu untuk mengirimkan PR yang menambahkan pengaturan ini sehingga Anda dapat mengaktifkannya untuk aplikasi Anda dan melihat apakah ada efek sampingnya.

Masalah yang sama hanya muncul pada perangkat dengan Android 7.1 (atau lebih tinggi).
Tidak ada solusi di atas yang berfungsi.
Masalah selalu muncul ketika jaringan dibatasi hingga 10kb/dtk.

@babyblue1314 - Perubahan RootDrawable disebutkan di atas juga tidak memperbaikinya untuk Anda?

@oprisnik Terima kasih atas balasan cepat Anda!
Em…Saya kira begitu, perubahan RootDrawable yang disebutkan di atas juga tidak memperbaikinya untuk saya.
Saya tidak tahu apakah saya salah menggunakannya. Berikut tampilannya:

Sebelum menggunakan perubahan RootDrawable:

Setelah menggunakan perubahan RootDrawable:

_ Saya harus menyebutkan bahwa jaringan dibatasi hingga 10kb/s. _
Dan terlebih lagi, ini tidak hanya muncul di ListView tetapi juga RecyclerView dan GridView, seperti yang ditunjukkan di bawah ini:

Kode saya adalah:

  1. ListViewAdapter (atau RecyclerViewAdapter atau GridViewAdapter):
SimpleDraweeView thumbnail = cholder.getView(R.id.thumbnail);

GenericDraweeHierarchyBuilder hierarchyBuilder = new GenericDraweeHierarchyBuilder(thumbnail.getContext().getResources());
GenericDraweeHierarchy hierarchy = hierarchyBuilder.build();
hierarchy.getTopLevelDrawable().setVisible(true, false);
thumbnail.setHierarchy(hierarchy);

ImageLoaderUtil.loadImage(thumbnail, item.getLogourl(), 696, 288);
  1. ImageLoaderUtil:
Uri uri = Uri.parse(url);
ImageRequestBuilder imageRequestBuilder = ImageRequestBuilder.newBuilderWithSource(uri);
imageRequestBuilder.setRotationOptions(RotationOptions.autoRotate()); 
imageRequestBuilder.setImageDecodeOptions(new ImageDecodeOptions(ImageDecodeOptions.newBuilder()
.setBitmapConfig(Bitmap.Config.RGB_565)));
imageRequestBuilder.setResizeOptions(new ResizeOptions(reqWidth, reqHeight));
ImageRequest imageRequest = imageRequestBuilder.build();

PipelineDraweeControllerBuilder draweeControllerBuilder = Fresco.newDraweeControllerBuilder();
draweeControllerBuilder.setOldController(simpleDraweeView.getController());
draweeControllerBuilder.setImageRequest(imageRequest);
draweeControllerBuilder.setTapToRetryEnabled(false); 

DraweeController draweeController = draweeControllerBuilder.build();
simpleDraweeView.setController(draweeController);

Lukisan dinding 1.5.0

Perangkat: Lenovo, android 7.1.1

_Tolong beri tahu saya jika Anda membutuhkan informasi lebih lanjut.

@babyblue1314 Saya tidak melihat transisi apa pun di video Anda atau kode terkait transisi. Apakah Anda yakin bahwa Anda sedang membicarakan masalah yang sama?

@oprisnik Maaf, saya baru menyadari bahwa masalah transisi ini berbeda dengan masalah saya.
Saya melihat fenomenanya mirip dengan saya, jadi ……
Haruskah saya memulai masalah baru?

@babyblue1314 ya tolong, ini sepertinya tidak berhubungan.

@oprisnik akhirnya saya menemukan penyebab masalah saya.
Dalam kasus kesalahpahaman orang lain, saya di sini untuk memberikan beberapa penjelasan.
Masalah saya berkaitan dengan format gambar.
Jika saya menggunakan metode imageRequestBuilder.setProgressiveRenderingEnabled(true) dengan format PNG, masalah saya selalu dapat mereproduksi.
Jika saya mengubah metode ke imageRequestBuilder.setProgressiveRenderingEnabled(false) dengan format PNG, semuanya berfungsi dengan baik.
@oprisnik Sekali lagi terima kasih atas kesabaran Anda!

Tolong perbaiki masalah ini...

Fresco 1.9.0 tidak memperbaiki masalah dengan benar.
Campuran proposisi di utas ini memperbaikinya tergantung pada perangkat:

Jadi saya menggunakan kedua solusi dalam kode saya agar aman dalam kode saya dan mudah-mudahan itu mencakup semuanya. @oprisnik Saya akan meluangkan waktu untuk mencoba dan memahami masalahnya dengan lebih baik, jika saya menemukan perbaikan, saya akan mengirimkan PR.

Ya, sayangnya kami masih belum memiliki perbaikan yang baik untuk masalah ini karena semua solusi yang disebutkan di utas ini gagal dalam satu atau lain cara. Jika seseorang memiliki ide tentang cara memperbaikinya dengan benar, beri tahu kami atau, lebih baik lagi, kirimkan PR :)

Namun, masalah ini pada komponen react-native-maps. Saya membayangkan itu masalah bersamaan?
Apakah Anda punya ide di mana masalahnya?

Ada kemajuan dalam menentukan masalah? Sepertinya kita belum mendengar apa-apa sejak April.

Kami masih tidak punya waktu untuk menyelidiki lebih lanjut apa yang terjadi di sini. Jangan ragu untuk melihat masalah ini dan mengirimkan permintaan tarik!

Seperti yang disebutkan sebelumnya, masalah mendasar tampaknya adalah bug kerangka kerja Android di mana ImageView tidak mengembalikan visibilitas Drawable yang mendasarinya dengan benar saat kembali dari transisi.

Saya telah mengajukan laporan bug Android di sini: https://issuetracker.google.com/issues/111293868

Saya juga telah membuat aplikasi sampel (non-Fresco) yang menguraikan masalah ini: https://github.com/oprisnik/VisibilityPlayground

Kami akan menyelidiki apakah ada solusi untuk masalah ini. Namun, Fresco memerlukan manajemen memori manual dan kami mengandalkan visibilitas Drawable untuk meminta ulang gambar, jadi saya tidak yakin apakah ada perbaikan yang lebih baik daripada solusi yang dijelaskan di atas.

Saya beralih ke lukisan dinding tidak menyadari masalah ini. Saya membuat banyak gif dan melakukan pekerjaan dengan baik, tetapi saya juga bergantung pada animasi ini untuk navigasi. Saya sudah dapat menggunakan peretasan yang disebutkan di atas, tetapi pada animasi kembali, gambar akan hilang.

Sebenarnya invalidate atau View.setVisibility tidak dapat menampilkan drawable, Anda perlu memanggil Drawable.setVisible(true, true) secara langsung .
Saya menambahkan kode ini di A Activity#OnCreate, ini berfungsi dengan baik:

ActivityCompat.setExitSharedElementCallback(this, new SharedElementCallback() {
            <strong i="7">@Override</strong>
            public void onSharedElementEnd(List<String> sharedElementNames, List<View> sharedElements, List<View> sharedElementSnapshots) {
                super.onSharedElementEnd(sharedElementNames, sharedElements, sharedElementSnapshots);
                if (FP.empty(sharedElements)) {
                    return;
                }
                for (View view : sharedElements) {
                    if (view instanceof SimpleDraweeView) {
                        ((SimpleDraweeView) view).getDrawable().setVisible(true, true);
                    }
                }
            }
        });

@oprisnik Di aplikasi sampel non-fresco Anda, Anda mengatur transisi ke ChangeBounds . Apakah bug terjadi jika Anda menghapus baris ini? Saya kira visibilitas dipulihkan dengan benar ketika ChangeImageTransform sedang dimainkan. Apakah mungkin agar gambar fresco berfungsi dengan ChangeImageTransform ?

@RainFool benar. simpleDraweeView.getVisibility() adalah VISIBLE , tetapi simpleDraweeView.getDrawable().isVisible() adalah false .

Ya, ini adalah bug dalam kerangka kerja Android di mana visibilitas View (ImageView tepatnya) tidak disebarkan ke Drawable, jadi Anda harus memperbarui visibilitas secara manual. Beri bintang pada laporan bug Android di sini agar lebih terlihat: https://issuetracker.google.com/issues/111293868

Apakah halaman ini membantu?
0 / 5 - 0 peringkat