Fresco: ذهب عنصر المشاركة بعد انتهاء SharedElementReturnTransition في Android N.

تم إنشاؤها على ٣١ أغسطس ٢٠١٦  ·  70تعليقات  ·  مصدر: facebook/fresco

أستخدم أحدث كود فريسكو للقيام بعمل SharedElement Transition ، فهو يعمل جيدًا في Android L 、 M , ولكن في Android N ، يحدث خطأ

قبل الانتقال
screenshot0

بعد الانتقال
screenshot0

bug help wanted

التعليق الأكثر فائدة

ما عليك سوى إضافة هذا الرمز في نشاط الاتصال , + 1 إذا كان هذا يمكن أن يساعدك !!! تضمين التغريدة


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);
                    }
                }
            }
        });

ال 70 كومينتر

هل يمكنك من فضلك إظهار كيف تقوم بجزء الانتقال باستخدام تطبيق Fresco التجريبي؟

النشاط_main.xml و activity_detail لهما نفس SimpleDraweeView بنفس اسم الانتقال
وفي طريقة DetailActivity's onCreate على النحو التالي:

محمية باطلة عند الإنشاء (حزمة 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 (saveInstanceState) ؛
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 (new View.OnClickListener () {
@تجاوز
public void onClick (View v) {
Toast.makeText (DetailActivity.this، "dsasa"، Toast.LENGTH_LONG) .show () ؛
}
}) ؛
}

لا يقوم addTransitionListener () بأي شيء سوى طباعة السجل

فهل أستخدم طريقة خاطئة للقيام بعملية النقل؟

هذا يحدث لي ايضا

لدي ما يلي في طريقة onCreate () قبل 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);

أواجه نفس المشكلة. لا يعمل setSharedElementReturnTransition على Android N. لقد أضفت سجلات إلى مستمعي النقل ولم يتم تشغيل onTransitionStart و onTransitionEnd على Android N ، ولكن على Android M & L يعمل بشكل جيد.
أنا أستخدم أحدث إصدار من مكتبة Fresco com.facebook. في الهواء الطلق: في الهواء الطلق : 0.14.1 مع com.facebook. فريسكو: Imagepipeline-okhttp3 : 0.14.1
ليس لدي هذه المشكلة إذا كنت أستخدم مكتبة بيكاسو لتحميل الصورة.
السيناريو مشابه: GridView ، gridItem ينتقل بعيدًا إلى نشاط آخر (كل شيء على ما يرام في هذا الجزء) ولكن عندما أعود ، لا توجد إعادة إدخال ، تومض الصورة ويتم إعادة تحميلها (صورة العنصر النائب غير مرئية ولا الصورة التي كانت محملة بالفعل). يحدث هذا فقط على Android N (7.0)

أي تعديل حدث في هذه القضية؟

تحولت من فريسكو إلى بيكاسو وتم حل المشكلة. من المؤسف أن هذه المكتبة لا يتم الاحتفاظ بها كثيرًا كما هو مطلوب بواسطة إصدارات نظام التشغيل Android الجديدة التي تظهر.

يبدو أنه تم وضع علامة غير صحيحة على هذه المشكلة على أنها "تفاصيل الاحتياجات". توجد هذه المشكلة أيضًا على Android 7.1.1 (مستوى API 25).

شكرا ، سوف نلقي نظرة

كما أنني أواجه نفس المشكلة ، لذا أجري +1 مني لإصلاحها.

نفس الشيء هنا

افعلها. افعلها. ؛-)

نعم ، من فضلك افعلها.

لو سمحت...

+1

أتساءل لماذا هذه ليست أولوية عالية ..

+1

عندما أقوم بالتمرير إلى موضع العنصر المشترك في onActivityReenter يعود العنصر المختفي على الرغم من وميض أبيض بسيط:

    <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);
        }
    }

إذا كان شخص ما يعرف إصلاحًا أفضل ، فسأكون ممتنًا إذا كان بإمكانك مشاركته.

مرحبًا ، أواجه نفس المشكلة ولكن فقط على Android 7.1.1 API 25

إذا كانت هناك أي تحديثات حول هذه المشكلة ، فسأكون ممتنًا للغاية لها.

نفس الشيء هنا على emu مع 7.x ، لكنني أستخدم onWindowFocusChanged لتكون غامرة ، عند الانتهاء ، ستختفي الصورة ولكن ستعيد عرضها على الفور.

نفس الشيء هنا. طلب الاتصال يبدو أن التخطيط على العرض الذي يحتوي على SimpleDraweeView يعمل على إصلاحه ببعض الوميض. يرجى تقديم النصيحة

ما عليك سوى إضافة هذا الرمز في نشاط الاتصال , + 1 إذا كان هذا يمكن أن يساعدك !!! تضمين التغريدة


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);
                    }
                }
            }
        });

نفس المشكلة هنا ... antxyz لقد وضعت الكود الخاص بك في كل من أنشطة الاتصال والاستدعاء على طريقة الإنشاء ولكن دون نجاح. تظل صورة العنصر المشترك غير مرئية بعد إعادة الانتقال.

لا أعرف ما إذا كان يمكن أن يساعد في العثور على حل ، لكنني لاحظت أنه عند فتح لوحة المفاتيح ، يصبح SimpleDraweeView مرئيًا.

كنت أواجه نفس المشكلة وتم إصلاحها بعد هاتين المكالمتين:

  1. قبل 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. داخل onCreate للنشاط الجديد:
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 أي تحديثات على هذا؟ إنه لأمر مؤسف أنه لم يتم إصلاحه بعد.
ما زلت أعاني من ذلك مع API 24+ ، عندما يكون العنصر المشترك عنصرًا داخل RecyclerView .
لم تنجح أي من الحلول المدرجة في هذه التذكرة بالنسبة لي (لم يتم تعيين العرض أبدًا على غير مرئي / ذهب في المقام الأول).
أنا أستخدم DraweeTransition.createTransitionSet() لكل من انتقال الإدخال والإرجاع.
في بعض الأحيان تختفي الصورة حتى يتم تمرير نظرة عامة على إعادة التدوير ، وأحيانًا تعود مع وميض بعد فترة (قد يكون ذلك بسبب استدعاء notifyDataSetChanged ()).

لست متأكدًا مما إذا كان هذا مفيدًا ، ولكن هذا ما يحدث في Fresco وفقًا للسجلات عند إغلاق النشاط الثاني وعودة العنصر المشترك إلى موضعه:

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

يحدث هذا عندما يتم عرض الصورة النقطية مرة أخرى.
عندما لا يتم عرض الصورة النقطية ، لا يقع الحدثان الأخيران:

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

marcosalis عند العودة إلى النشاط الأول (باستخدام recyclerView). هل يؤدي ذلك دائمًا إلى تشغيل notifyDataSetChanged ()؟

erikandre شكرا لك على الإجابة ؛)
بعد بعض الاختبارات ، يمكنني التأكد من عدم استدعاء notifyDataSetChanged () ، حتى عندما يتم عرض الصورة النقطية من تلقاء نفسها.

هذه هي حالة SimpleDraweeView إذا وضعت نقطة توقف في SharedElementCallback.onSharedElementEnd() في نشاط الاستدعاء.

 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}}}

أعتقد أنه قد يكون له علاقة بالطرق doDetach() و doAttach() في SimpleDraweeView ، عندما يكون العرض نفسه في RecyclerView .
أخيرًا ، نجح هذا الأمر بالنسبة لي (تمت إضافته إلى النشاط الذي تم إنشاء النقل منه) ، على الرغم من أنه ليس نظيفًا للغاية:

        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 رائع أنك عثرت على حل بديل! حاولت إعادة إنتاج هذه المشكلة بالذات في تطبيق Showcase الذي يعمل على Genymotion مع Android 7 ولكن لم يحالفني الحظ.

كيف تبدو عروض العناصر الخاصة بإعادة التدوير؟ في حالتي كان مجرد إطار FrameLayout يغلف SimpleDraweeView.

marcosalis لقد نجح الحل الذي

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();
                        }
                    }
            );

لقد عثرت للتو على نفس المشكلة أثناء اللعب مع التحولات بين الأنشطة. لا يبدو أن أي من الحلول المقترحة أعلاه تعمل. (API 25) إليك ما يبدو عليه: https://vimeo.com/225497240

أعتقد أننا توصلنا إلى حل بديل ونأمل أن يتوفر إصلاح قريبًا.

يمكن العثور على الحل البديل في dc7ec2436fc9b639fe1a39398712c360b16da468.

في الوقت الحالي ، يجب عليك إعداد أول DraweeView حيث يبدأ الانتقال من استخدام معالجة الرؤية القديمة من خلال استدعاء simpleDraweeView.setLegacyVisibilityHandlingEnabled(true); (كما ترون في مثال النقل في نموذج التطبيق Showcase) .

هل يمكنك التحقق مما إذا كان هذا يحل المشكلات من أجلك؟ سنقوم بإصدار إصدار جديد من Fresco يتضمن هذا الإصلاح قريبًا جدًا.

نعم شكرا! أكد أن هذا يحل المشكلة. نتطلع إلى نسخة محدثة.

لقد أصدرنا Fresco v1.4.0 ، والذي يتضمن الإصلاح كما هو مذكور أعلاه. فقط اتصل بـ simpleDraweeView.setLegacyVisibilityHandlingEnabled(true); وستعمل الآن.

لقد قمنا أيضًا بتحديث نموذج انتقال العرض لتعكس هذه التغييرات.

شكرًا على هذا الإصلاح ، لقد نجح الأمر بشكل مثالي في حالتي. سؤال واحد ، لماذا لا تضع setGlobalLegacyVisibilityHandlingEnabled في true افتراضيًا؟ هل هناك أي مشكلة في الأداء؟

تغير التعامل مع الرؤية مع Android N وتغييري (نوعًا ما) يعيد السلوك إلى ما قبل N. قد يؤدي تغيير هذا السلوك لجميع الصور إلى مشكلات أخرى غير متوقعة ولهذا قررنا عدم تشغيله افتراضيًا حتى الآن. بمجرد التحقق من عدم وجود آثار جانبية ، سننظر في تشغيله افتراضيًا.
لا تتردد في تعيينه على true والإبلاغ عن أي مشكلات تواجهك.

ezgif com-resize

يبدو أن هذا الإصلاح لا يعمل بشكل عشوائي. أنا أقوم بتعيين setGlobalLegacyVisibilityHandlingEnabled إلى true ، ولكن بعد بضع نقرات ، تصبح الصورة التي تم إرجاعها فارغة.

فريسكو 1.5.0 ، أوريو

تحرير: بعد تطوير بضعة أيام وتحريك بعض طرق العرض ، وجدت أن المشكلة لم تعد تحدث على الإطلاق على جهاز Oreo pixel الخاص بي. في Nexus 5x API 24 الذي تمت محاكاته ، تكون الصورة فارغة دائمًا بعد خروج الرسوم المتحركة.

أواجه نفس المشكلة مع setLegacyVisibilityHandlingEnabled . يعمل تعيينه على true معظم الأوقات ولكن في بعض الأحيان ، بشكل عشوائي ، تختفي الصورة بعد انتقال الإرجاع.

marcosalis هل يحدث هذا فقط على Oreo أو على

مرحبًا oprisnik لقد تمكنت من إعادة إنتاجه بشكل عشوائي على Samsung S7 (Nougat) وعلى محاكي على API 26. أخبرني إذا كان بإمكاني المساعدة في تصحيحه.

شكرًا ، سأحاول التأنيب عندما يكون لدي المزيد من الوقت

تضمين التغريدة
يمكن أن يؤكد أنه لا يبدو أنه يقوم بعمله في معظم الأوقات (API24 + API25)

ومع ذلك ، تمكنت من جعله يعمل إلى حد ما باستخدام الاختراق التالي:

        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();
                        });
                    }
                }
            }
        });

كنت قادرا على التوبيخ. بالنسبة لي ، نادرًا ما يحدث ذلك. سأتحقق مما إذا كان بإمكاني العثور على حل بديل لإصلاح ذلك.

مرحبا oprisnik ،
هل وجدت حلاً مختلفًا؟

ليس بعد ، من الصعب إصلاح هذا لأن Google غيّرت سلوك رؤية العرض ، مما يكسر معالجة رؤية Fresco (التي نحتاجها لإدارة الذاكرة) ولن يكون لدي أيضًا الكثير من الوقت للنظر في هذا في المستقبل القريب . ومع ذلك ، هناك العديد من البدائل المذكورة في سلسلة الرسائل هذه والتي تعمل على حل المشكلة (مثل الحل البديل من

إذا رغب شخص ما في النظر في هذا الأمر ، فإن طلبات السحب مرحب بها دائمًا! :)

oprisnik ، react-native-maps module تتأثر أيضًا بهذه المشكلة.
لقد قمت بتمييز هذه السطور كتعليق في ملف RootDrawable.java كحل بديل.
هل تتذكر / تعرف أي مشكلة كبيرة تتعلق بوضع علامة على هذه السطور كخطوط تعليق؟

يبدو أن مواجهة مشكلة الأحدث ).

لقد أدى حلهم إلى إصلاح جميع المشكلات التي كنت أواجهها.

efkan لا أعرف بالضبط. أتذكر أنني نظرت في هذا أيضًا عندما كنت أبحث عن حلول بديلة ، لكنني رفضته. أعتقد أن إحدى المشكلات المتعلقة بإزالة هذه الشيكات هي أنه تم إصدار الصورة النقطية الأساسية (نظرًا لأن العرض لم يعد مرئيًا) ومحاولة رسمه ستؤدي إلى ظهور java.lang.RuntimeException: Canvas: trying to use a recycled bitmap ... نظرًا لأن BitmapDrawable لا إجراء أي فحوصات سلامة.

ImageView نفسه على نفس الخطأ حيث لا يستعيد بشكل صحيح رؤية Drawable لأي عنصر رسم ، لكنه لا يزال يعمل نظرًا لأن معظم Drawables لا تقوم بفحص الرؤية ولا توجد إدارة يدوية للذاكرة - والصورة النقطية الأساسية ستظل صالحة.

oprisnik شكرا على كل هذه التفسيرات.

من أجل اختبار ما إذا كان هذا يعمل ، فمن السهل إلى حد ما إضافة هذا كإعداد إلى GenericDraweeHierarchyBuilder واعتمادًا على ذلك ، تجاهل التحقق من الرؤية في RootDrawable (الذي تم إنشاؤه في GenericDraweeHierarchy ، راجع https://github.com/facebook/fresco/blob/master/drawee/src/main/java/com/facebook/drawee/generic/GenericDraweeHierarchy.java#L155).

لا تتردد في إرسال بيان عام يضيف هذا الإعداد بحيث يمكنك تمكينه لتطبيقاتك ومعرفة ما إذا كانت هناك آثار جانبية.

تظهر المشكلة نفسها فقط على الأجهزة التي تعمل بنظام Android 7.1 (أو أعلى).
لا يعمل أي من الحلول المذكورة أعلاه.
تظهر المشكلة دائمًا عندما تكون الشبكة محدودة بـ 10 كيلوبايت / ثانية.

@ babyblue1314 - التغيير RootDrawable المذكور أعلاه أيضًا لا يصلح لك؟

oprisnik شكرا
Em ... أفترض أن تغيير RootDrawable المذكور أعلاه لا يصلح لي.
لا أعرف ما إذا كنت أخطأ في استخدامه. هذا هو الشكل الذي تبدو عليه:

قبل استخدام تغيير RootDrawable:

بعد استخدام تغيير RootDrawable:

_ يجب أن أذكر أن الشبكة محدودة بـ 10kb / s. _
والأكثر من ذلك ، أن هذا لا يظهر فقط في ListView ولكن أيضًا في RecyclerView و GridView ، كما هو موضح أدناه:

الرمز الخاص بي هو:

  1. ListViewAdapter (أو RecyclerViewAdapter أو 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);

فريسكو 1.5.0

الجهاز: Lenovo، android 7.1.1

_ من فضلك دعني أعرف إذا كنت بحاجة إلى مزيد من المعلومات.

@ babyblue1314 لا أرى أي انتقال في مقاطع الفيديو الخاصة بك أو الشفرة المتعلقة بالانتقال. هل أنت متأكد أنك تتحدث عن نفس المشكلة؟

oprisnik آسف ، لقد أدركت للتو أن مشكلة الانتقال هذه مختلفة عن مشكلتي.
رأيت أن الظاهرة شبيهة بظهري ، لذا .......
هل يجب أن أبدأ إصدارًا جديدًا؟

@ babyblue1314 نعم من فضلك ، هذا يبدو غير مرتبط تمامًا.

oprisnik لقد وجدت أخيرًا سبب مشكلتي.
في حالة سوء فهم الآخرين ، أنا هنا لأقدم بعض التفسيرات.
مشكلتي لها علاقة بتنسيق الصورة.
إذا استخدمت الطريقة imageRequestBuilder.setProgressiveRenderingEnabled(true) بتنسيق PNG ، فيمكن دائمًا إعادة إنتاج مشكلتي.
إذا قمت بتغيير الطريقة إلى imageRequestBuilder.setProgressiveRenderingEnabled(false) بتنسيق PNG ، فسيعمل كل شيء بشكل جيد.
oprisnik شكرا مرة أخرى على صبرك!

الرجاء إصلاح هذه المشكلة ...

Fresco 1.9.0 لا يصلح المشكلة بشكل صحيح.
يعمل مزيج من المقترحات في هذا الموضوع على إصلاحه اعتمادًا على الجهاز:

لذلك أنا أستخدم كلا الحلين في الكود الخاص بي لأكون آمنًا في الكود الخاص بي وآمل أن يغطي كل شيء. oprisnik سأقضي بعض الوقت لمحاولة فهم المشكلة بشكل أفضل ، إذا وجدت إصلاحًا ،

نعم ، لسوء الحظ ، ما زلنا لا نملك حلًا جيدًا لهذه المشكلة لأن جميع الحلول المذكورة في هذا الموضوع تفشل بطريقة أو بأخرى. إذا كان لدى شخص ما فكرة عن كيفية إصلاح هذا بشكل صحيح ، فالرجاء إخبارنا أو ، والأفضل من ذلك ، إرسال PR :)

لا تزال هذه المشكلة على مكون خرائط التفاعل الأصلي. أتخيل أنها مشكلة متزامنة؟
هل لديك فكرة أين المشكلة؟

أي تقدم في تحديد المشكلة؟ يبدو أننا لم نسمع أي شيء منذ أبريل.

ما زلنا لا نملك الوقت لإجراء مزيد من التحقيق فيما يحدث هنا. لا تتردد في النظر في المشكلة وتقديم طلب سحب!

كما ذكرنا سابقًا ، يبدو أن المشكلة الأساسية هي خلل في إطار عمل Android حيث لا يستعيد ImageView رؤية Drawable الأساسي بشكل صحيح عند العودة من الانتقال.

لقد قمت بتقديم تقرير خطأ Android هنا: https://issuetracker.google.com/issues/111293868

لقد أنشأت أيضًا نموذجًا لتطبيق (غير فريسكو) يوضح المشكلة: https://github.com/oprisnik/VisibilityPlayground

سنحقق في ما إذا كان هناك حل بديل لهذه المشكلة. ومع ذلك ، تتطلب Fresco إدارة يدوية للذاكرة ونعتمد على رؤية Drawable لإعادة طلب الصورة ، لذلك لست متأكدًا مما إذا كان هناك إصلاح أفضل من الحلول الموضحة أعلاه.

لقد تحولت إلى لوحة جدارية غير مدركة لهذه المشكلة. أقدم الكثير من الصور المتحركة وهي تقوم بعمل رائع ، لكنني أيضًا أعتمد على هذه الرسوم المتحركة للتنقل. لقد تمكنت من استخدام الاختراقات المذكورة أعلاه ، ولكن في حركة العودة ، ستختفي الصورة.

في الواقع إبطال أو لا يمكن لـ View.setVisibility إظهار drawable ، تحتاج إلى استدعاء Drawable.setVisible (صحيح ، صحيح) مباشرة.
أقوم بإضافة هذه الرموز في A Activity # OnCreate ، فهو يعمل بشكل جيد:

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 في نموذج التطبيق غير الجداري ، يمكنك تعيين الانتقال إلى ChangeBounds . هل يحدث الخطأ إذا قمت بإزالة هذا الخط؟ أعتقد أنه تمت استعادة الرؤية بشكل صحيح عندما يكون ChangeImageTransform قيد التشغيل. هل من الممكن الحصول على صور جدارية للعمل مع ChangeImageTransform ؟

RainFool صحيح. simpleDraweeView.getVisibility () هو VISIBLE ، لكن simpleDraweeView.getDrawable (). isVisible () هو false .

نعم ، هذا خطأ في إطار عمل Android حيث لا يتم نشر رؤية العرض (ImageView على وجه الدقة) إلى Drawable ، لذلك يتعين عليك تحديث الرؤية يدويًا. يرجى تمييز تقرير خطأ Android بنجمة هنا حتى يصبح هذا أكثر وضوحًا: https://issuetracker.google.com/issues/111293868

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات