Fresco: Android N์—์„œ SharedElementReturnTransition์„ ์ˆ˜ํ–‰ํ•œ ํ›„ ๊ณต์œ  ์š”์†Œ๊ฐ€ ์‚ฌ๋ผ์ง

์— ๋งŒ๋“  2016๋…„ 08์›” 31์ผ  ยท  70์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebook/fresco

SharedElement ์ „ํ™˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์‹  ํ”„๋ ˆ์Šค์ฝ” ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Android Lใ€M์—์„œ๋Š” ์ž˜ ์‹คํ–‰๋˜์ง€๋งŒ Android N์—์„œ๋Š” ์ž˜๋ชป๋ฉ๋‹ˆ๋‹ค.

๏ฟผ์ „ํ™˜ ์ „
screenshot0

์ „ํ™˜ ํ›„
screenshot0

bug help wanted

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

ํ™œ๋™ ํ˜ธ์ถœ์— ์ด ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋„์›€์ด ๋œ๋‹ค๋ฉด +1!!! @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);
                    }
                }
            }
        });

๋ชจ๋“  70 ๋Œ“๊ธ€

Fresco์˜ ๋ฐ๋ชจ ์•ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ „ํ™˜ ๋ถ€๋ถ„์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

activity_main.xml ๋ฐ activity_detail์—๋Š” transitionName์ด ๋™์ผํ•œ SimpleDraweeView๊ฐ€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด DetailActivity์˜ onCreate ๋ฉ”์†Œ๋“œ์—์„œ:

๋ณดํ˜ธ๋œ ๋ฌดํšจ onCreate(์ €์žฅ๋œ ์ธ์Šคํ„ด์Šค ์ƒํƒœ ๋ฒˆ๋“ค) {
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(์ €์žฅ๋œ ์ธ์Šคํ„ด์Šค ์ƒํƒœ);
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(์ƒˆ๋กœ์šด View.OnClickListener() {
@์šฐ์„ธํ•˜๋‹ค
๊ณต๊ฐœ ๋ฌดํšจ onClick(View v) {
Toast.makeText(DetailActivity.this, "dsasa", Toast.LENGTH_LONG).show();
}
});
}

addTransitionListener()๋Š” ๋กœ๊ทธ๋ฅผ ์ธ์‡„ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ์•„๋ฌด ์ž‘์—…๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ „ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์ž˜๋ชป๋œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ๋„ ์ผ์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

super.onCreate() ์ „์— 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์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ „ํ™˜ ์ˆ˜์‹ ๊ธฐ์— ๋กœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์œผ๋ฉฐ Android N์—์„œ๋Š” onTransitionStart ๋ฐ onTransitionEnd๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜์ง€ ์•Š์ง€๋งŒ Android M ๋ฐ L์—์„œ๋Š” ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
์ €๋Š” ์ตœ์‹  ๋ฒ„์ „์˜ Fresco ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ com.facebook์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. fresco:fresco :0.14.1 with com.facebook. ํ”„๋ ˆ์Šค์ฝ”:์ด๋ฏธ์ง€ ํŒŒ์ดํ”„๋ผ์ธ-okhttp3 :0.14.1
์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด Picasso ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ด ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. gridView, gridItem์€ ๋‹ค๋ฅธ Activity๋กœ ์ด๋™ํ•˜์ง€๋งŒ(์ด ๋ถ€๋ถ„์—์„œ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์ž„) ๋Œ์•„๊ฐ€๋ฉด ๋‹ค์‹œ ์ž…๋ ฅํ•˜์ง€ ์•Š๊ณ  ์ด๋ฏธ์ง€๊ฐ€ ๊นœ๋ฐ•์ด๊ณ  ๋‹ค์‹œ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค(์ž๋ฆฌ ํ‘œ์‹œ์ž ์ด๋ฏธ์ง€๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ด์ „์— ์žˆ๋˜ ์ด๋ฏธ์ง€๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Œ). ์ด๋ฏธ ๋กœ๋“œ๋จ). ์ด๊ฒƒ์€ Android N(7.0)์—์„œ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

Fresco์—์„œ Picasso๋กœ ์ „ํ™˜ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์•ˆํƒ€๊น๊ฒŒ๋„ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋‚˜์˜ค๋Š” ์ƒˆ Android OS ๋ฒ„์ „์—์„œ ์š”๊ตฌํ•˜๋Š” ๋งŒํผ ์ž์ฃผ ์œ ์ง€ ๊ด€๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๊ฐ€ 'needs-details'๋กœ ์ž˜๋ชป ํ‘œ์‹œ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” 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์—์„œ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์œผ๋ฉด ๋งค์šฐ ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ 7.x์˜ emu์—์„œ๋„ ๋™์ผํ•˜์ง€๋งŒ onWindowFocusChanged๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชฐ์ž…ํ˜•์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์™„๋ฃŒ๋˜๋ฉด ์ด๋ฏธ์ง€๊ฐ€ ์‚ฌ๋ผ์ง€์ง€๋งŒ ์ฆ‰์‹œ ๋‹ค์‹œ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. SimpleDraweeView๊ฐ€ ํฌํ•จ๋œ View์—์„œ requestLayout์„ ํ˜ธ์ถœํ•˜๋ฉด ๊นœ๋ฐ•์ž„์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์กฐ์–ธ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค

ํ™œ๋™ ํ˜ธ์ถœ์— ์ด ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋„์›€์ด ๋œ๋‹ค๋ฉด +1!!! @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);
                    }
                }
            }
        });

์—ฌ๊ธฐ์— ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค ... @antxyz onCreate ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ํ˜ธ์ถœ ๋Œ€์ƒ ํ™œ๋™์— ์ฝ”๋“œ๋ฅผ ๋„ฃ์—ˆ์ง€๋งŒ ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ „ํ™˜์„ ๋ฐ˜ํ™˜ํ•œ ํ›„์—๋„ ๊ณต์œ  ์š”์†Œ ์ด๋ฏธ์ง€๊ฐ€ ์—ฌ์ „ํžˆ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๋Š” ๋ฐ ๋„์›€์ด ๋ ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์†Œํ”„ํŠธํ‚ค๋ณด๋“œ๋ฅผ ์—ด๋ฉด 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 ์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„์ง ๊ณ ์ณ์ง€์ง€ ์•Š์€ ๊ฒƒ์ด ์•„์‰ฝ์Šต๋‹ˆ๋‹ค.
๊ณต์œ  ์š”์†Œ๊ฐ€ RecyclerView ์•ˆ์˜ ํ•ญ๋ชฉ์ธ ๊ฒฝ์šฐ API 24+์—์„œ ์—ฌ์ „ํžˆ ์ด๊ฒƒ์„ ๊ฒฝํ—˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ํ‹ฐ์ผ“์— ๋‚˜์—ด๋œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ํšจ๊ณผ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค(๋ณด๊ธฐ๊ฐ€ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ณด์ด์ง€ ์•Š์Œ/์‚ฌ๋ผ์ง์œผ๋กœ ์„ค์ •๋˜์ง€ ์•Š์Œ).
Enter ๋ฐ Return ์ „ํ™˜ ๋ชจ๋‘์— 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()๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜ธ์ถœ ํ™œ๋™์—์„œ SharedElementCallback.onSharedElementEnd() ์— ์ค‘๋‹จ์ ์„ ๋„ฃ์œผ๋ฉด SimpleDraweeView ์˜ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

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

๋ณด๊ธฐ ์ž์ฒด๊ฐ€ RecyclerView ์žˆ์„ ๋•Œ SimpleDraweeView ์˜ doDetach() ๋ฐ doAttach() ๋ฉ”์„œ๋“œ์™€ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๋งˆ์ง€๋ง‰์œผ๋กœ ์ด๊ฒƒ์€ ๋งค์šฐ ๊นจ๋—ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ–ˆ์Šต๋‹ˆ๋‹ค(์ „ํ™˜์ด ์ƒ์„ฑ๋˜๋Š” ํ™œ๋™์— ์ถ”๊ฐ€๋จ).

        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 ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. Android 7์˜ Genymotion์—์„œ ์‹คํ–‰๋˜๋Š” Showcase ์•ฑ์—์„œ ์ด ํŠน์ • ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ์šด์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌ์‚ฌ์ดํด๋Ÿฌ๋ทฐ์˜ ์•„์ดํ…œ ๋ทฐ๋Š” ์–ด๋–ค ๋ชจ์Šต์ธ๊ฐ€์š”? ์ œ ๊ฒฝ์šฐ์—๋Š” SimpleDraweeView๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” FrameLayout์ด์—ˆ์Šต๋‹ˆ๋‹ค.

@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์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ simpleDraweeView.setLegacyVisibilityHandlingEnabled(true); ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ ˆ๊ฑฐ์‹œ ๊ฐ€์‹œ์„ฑ ์ฒ˜๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ „ํ™˜์ด ์‹œ์ž‘๋˜๋Š” ์ฒซ ๋ฒˆ์งธ DraweeView ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(Showcase ์ƒ˜ํ”Œ ์•ฑ์˜ ์ „ํ™˜ ์˜ˆ์ œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Œ). .

์ด๊ฒƒ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”์ง€ ํ™•์ธํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ด ์ˆ˜์ • ์‚ฌํ•ญ์ด ํฌํ•จ๋œ ์ƒˆ๋กœ์šด Fresco ๋ฒ„์ „์„ ๊ณง ์ถœ์‹œํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

๋„ค, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋จ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ๋œ ๋ฒ„์ „์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ํฌํ•จ๋œ Fresco v1.4.0์„ ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. simpleDraweeView.setLegacyVisibilityHandlingEnabled(true); ํ˜ธ์ถœํ•˜๋ฉด ์ด์ œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•˜๋„๋ก Showcase ์ „ํ™˜ ์ƒ˜ํ”Œ ์„ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ์ˆ˜์ • ๋•๋ถ„์— ์ œ ๊ฒฝ์šฐ์—๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ setGlobalLegacyVisibilityHandlingEnabled ๋ฅผ true ์— ๋„ฃ์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์„ฑ๋Šฅ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

Android N์—์„œ ๊ฐ€์‹œ์„ฑ ์ฒ˜๋ฆฌ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋ฉฐ ๋‚ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ (์ผ์ข…์˜) ๋™์ž‘์„ N ์ด์ „์œผ๋กœ ๋˜๋Œ๋ฆฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์ด๋ฏธ์ง€์— ๋Œ€ํ•ด ์ด ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋‹ค๋ฅธ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์•„์ง ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ๋™์ž‘์„ ์„ค์ •ํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ถ€์ž‘์šฉ์ด ์—†๋Š” ๊ฒƒ์œผ๋กœ ํ™•์ธ๋˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ผœ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ž์œ ๋กญ๊ฒŒ true ํ•˜๊ณ  ๋ฐœ์ƒํ•œ ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ๋ณด๊ณ ํ•˜์„ธ์š”.

ezgif com-resize

์ด ์ˆ˜์ •์€ ๋ฌด์ž‘์œ„๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. setGlobalLegacyVisibilityHandlingEnabled๋ฅผ true๋กœ ์„ค์ •ํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋ช‡ ๋ฒˆ ํด๋ฆญํ•˜๋ฉด ๋ฐ˜ํ™˜๋œ ์ด๋ฏธ์ง€๊ฐ€ ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋ ˆ์Šค์ฝ” 1.5.0, ์˜ค๋ ˆ์˜ค

ํŽธ์ง‘: ๋ฉฐ์น  ๋” ๊ฐœ๋ฐœํ•˜๊ณ  ์ผ๋ถ€ ๋ณด๊ธฐ๋ฅผ ์ด๋™ํ•œ ํ›„ ๋‚ด Oreo ํ”ฝ์…€ ์žฅ์น˜์—์„œ ๋” ์ด์ƒ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์—๋ฎฌ๋ ˆ์ดํŠธ๋œ Nexus 5x API 24์—์„œ ์ด๋ฏธ์ง€๋Š” ์ข…๋ฃŒ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํ›„์— ํ•ญ์ƒ ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

setLegacyVisibilityHandlingEnabled ์™€ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. true ์„ค์ •ํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ž‘๋™ํ•˜์ง€๋งŒ ๋•Œ๋กœ๋Š” ๋ฌด์ž‘์œ„๋กœ ๋ฐ˜ํ™˜ ์ „ํ™˜ ํ›„ ์ด๋ฏธ์ง€๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

@marcosalis ๋Š” Oreo ๋˜๋Š” Nougat์—์„œ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š” @oprisnik ์ €๋Š” Samsung S7(Nougat)๊ณผ API 26์˜ ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ๋ฌด์ž‘์œ„๋กœ ์žฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ์‹œ๊ฐ„๋‚˜๋ฉด ๋‹ค์‹œ ํ•ด๋ด์•ผ๊ฒ ๋„ค์š”

@oprisnik
๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์— ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(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์ด View ๊ฐ€์‹œ์„ฑ ๋™์ž‘์„ ๋ณ€๊ฒฝํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์ •ํ•˜๊ธฐ ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค. ์ด ๋™์ž‘์€ Fresco์˜ ๊ฐ€์‹œ์„ฑ ์ฒ˜๋ฆฌ(๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์— ํ•„์š”ํ•จ)๋ฅผ ๊นจ๋œจ๋ฆฌ๊ณ  ์ €๋„ ๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— ์ด์— ๋Œ€ํ•ด ์กฐ์‚ฌํ•  ์‹œ๊ฐ„์ด ๋งŽ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. . ๊ทธ๋Ÿฌ๋‚˜ ์ด ์Šค๋ ˆ๋“œ์—์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋Œ€์•ˆ์ด ์–ธ๊ธ‰๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ๊ฐ€์‹œ์„ฑ์„ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•˜๋Š” @MartB ์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•).

๋ˆ„๊ตฐ๊ฐ€ ์ด๊ฒƒ์„ ์กฐ์‚ฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด pull reuqests๋ฅผ ์–ธ์ œ๋‚˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! :)

@oprisnik , react-native-maps ๋ชจ๋“ˆ๋„ ์ด ๋ฌธ์ œ์˜ ์˜ํ–ฅ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.
ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์ด ์ค„ ์„ RootDrawable.java ํŒŒ์ผ์— ์ฃผ์„์œผ๋กœ ํ‘œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.
ํ•ด๋‹น ์ค„์„ ์ฃผ์„ ์ค„๋กœ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ํฐ ๋ฌธ์ œ๋ฅผ ๊ธฐ์–ต/์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@efkan ๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋งŽ์€ ์ˆ˜์˜ Android ๊ธฐ๊ธฐ(Android Nougat 7.1 API 25 ์ด์ƒ)์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

๊ทธ๋“ค์˜ ์†”๋ฃจ์…˜์€ ๋‚ด๊ฐ€ ๊ฐ€์ง„ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

@efkan ์ •ํ™•ํžˆ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋Œ€์ฒด ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ฐพ์„ ๋•Œ๋„ ์ด ๋ฌธ์ œ๋ฅผ ์กฐ์‚ฌํ–ˆ์ง€๋งŒ ๋ฌด์‹œํ–ˆ๋˜ ๊ธฐ์–ต์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒ€์‚ฌ๋ฅผ ์ œ๊ฑฐํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๋Š” ๊ธฐ๋ณธ ๋น„ํŠธ๋งต์ด ํ•ด์ œ๋˜์–ด(๋ณด๊ธฐ๊ฐ€ ๋” ์ด์ƒ ํ‘œ์‹œ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—) BitmapDrawable ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ฆฌ๋ ค๊ณ  ํ•˜๋ฉด java.lang.RuntimeException: Canvas: trying to use a recycled bitmap ... ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜จ์ „์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ImageView ์ž์ฒด์— ๋“œ๋กœ์–ด๋ธ”์˜ ๋“œ๋กœ์–ด๋ธ” ๊ฐ€์‹œ์„ฑ์„ ์ œ๋Œ€๋กœ ๋ณต์›ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋™์ผํ•œ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๋“œ๋กœ์–ด๋ธ”์ด ๊ฐ€์‹œ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ˆ˜๋™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜๋ฉฐ ๊ธฐ๋ณธ ๋น„ํŠธ๋งต ์—ฌ์ „ํžˆ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

@oprisnik ์ด ๋ชจ๋“  ์„ค๋ช…์—

์ด๊ฒƒ์ด ์ž‘๋™ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์„ GenericDraweeHierarchyBuilder ์„ค์ •์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ณ  RootDrawable ( GenericDraweeHierarchy ์—์„œ ์ƒ์„ฑ๋จ)์˜ ๊ฐ€์‹œ์„ฑ ํ™•์ธ์„ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค RootDrawable , https://github.com/facebook/fresco/blob/master/drawee/src/main/java/com/facebook/drawee/generic/GenericDraweeHierarchy.java#L155 ์ฐธ์กฐ).

์ด ์„ค์ •์„ ์ถ”๊ฐ€ํ•œ PR์„ ์ž์œ ๋กญ๊ฒŒ ์ œ์ถœํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ™œ์„ฑํ™”ํ•˜๊ณ  ๋ถ€์ž‘์šฉ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ผํ•œ ๋ฌธ์ œ๋Š” Android 7.1(๋˜๋Š” ๊ทธ ์ด์ƒ)์ด ์„ค์น˜๋œ ๊ธฐ๊ธฐ์—์„œ๋งŒ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
์œ„์˜ ์†”๋ฃจ์…˜ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ด ๋ฌธ์ œ๋Š” ๋„คํŠธ์›Œํฌ๊ฐ€ 10kb/s๋กœ ์ œํ•œ๋  ๋•Œ ํ•ญ์ƒ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

@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

์žฅ์น˜: ๋ ˆ๋…ธ๋ฒ„, ์•ˆ๋“œ๋กœ์ด๋“œ 7.1.1

_์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.

@babyblue1314 ๋™์˜์ƒ์ด๋‚˜ ์ „ํ™˜ ๊ด€๋ จ ์ฝ”๋“œ์— ์ „ํ™˜์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ํ™•์‹คํ•ฉ๋‹ˆ๊นŒ?

@oprisnik ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ด ์ „ํ™˜ ๋ฌธ์ œ๊ฐ€ ์ œ ๋ฌธ์ œ์™€ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฉ๊ธˆ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.
ํ˜„์ƒ์ด ๋‚˜์™€ ๋น„์Šทํ•ด์„œ ๋ดค๋”๋‹ˆ.....
์ƒˆ ๋ฌธ์ œ๋ฅผ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@babyblue1314 ์˜ˆ, ์ด๊ฒƒ์€ ๋งค์šฐ ๊ด€๋ จ์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@oprisnik ๋งˆ์นจ๋‚ด ๋‚ด ๋ฌธ์ œ์˜ ์›์ธ์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.
ํ˜น์‹œ ๋‹ค๋ฅธ ๋ถ„๋“ค์ด ์˜คํ•ดํ•˜์‹ค๊นŒ๋ด ์ œ๊ฐ€ ์„ค๋ช…์„ ๋“œ๋ฆฌ๊ณ ์ž ์™”์Šต๋‹ˆ๋‹ค.
๋‚ด ๋ฌธ์ œ๋Š” ์‚ฌ์ง„ ํ˜•์‹๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
PNG ํ˜•์‹์œผ๋กœ imageRequestBuilder.setProgressiveRenderingEnabled(true) ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ด ๋ฌธ์ œ๊ฐ€ ํ•ญ์ƒ ์žฌํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฉ”์„œ๋“œ๋ฅผ PNG ํ˜•์‹์œผ๋กœ imageRequestBuilder.setProgressiveRenderingEnabled(false) ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
@oprisnik ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ธฐ๋‹ค๋ ค์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์ฃผ์„ธ์š”...

Fresco 1.9.0์€ ๋ฌธ์ œ๋ฅผ ์ œ๋Œ€๋กœ ์ˆ˜์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ด ์Šค๋ ˆ๋“œ์˜ ๋ช…์ œ๋ฅผ ํ˜ผํ•ฉํ•˜๋ฉด ์žฅ์น˜์— ๋”ฐ๋ผ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚ด ์ฝ”๋“œ์—์„œ ๋‘ ๊ฐ€์ง€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ์—์„œ ์•ˆ์ „ํ•˜๊ณ  ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค๋ฃจ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. @oprisnik ๋ฌธ์ œ๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์‹œ๊ฐ„์„ ํ• ์• ํ•˜๊ณ  ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ฐพ์œผ๋ฉด PR์„ ์ œ์ถœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ๋ถˆํ–‰ํžˆ๋„ ์ด ์Šค๋ ˆ๋“œ์—์„œ ์–ธ๊ธ‰ํ•œ ๋ชจ๋“  ์†”๋ฃจ์…˜์ด ์–ด๋–ค ์‹์œผ๋กœ๋“  ์‹คํŒจํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ข‹์€ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์•„์ง ์—†์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ๊ฑฐ๋‚˜ PR์„ ์ œ์ถœํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ react-native-maps ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ์ด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋™์‹œ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?
๋ฌธ์ œ๊ฐ€ ์–ด๋””์— ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฌธ์ œ๋ฅผ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ์ง„์ „์ด ์žˆ์Šต๋‹ˆ๊นŒ? 4์›” ์ดํ›„๋กœ ์•„๋ฌด ์†Œ์‹๋„ ๋“ค๋ฆฌ์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ์—ฌ๊ธฐ์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ๋” ์กฐ์‚ฌํ•  ์‹œ๊ฐ„์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ž์œ ๋กญ๊ฒŒ ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ œ์ถœํ•˜์„ธ์š”!

์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๋Š” ImageView๊ฐ€ ์ „ํ™˜์—์„œ ๋Œ์•„์˜ฌ ๋•Œ ๊ธฐ๋ณธ Drawable์˜ ๊ฐ€์‹œ์„ฑ์„ ์ œ๋Œ€๋กœ ๋ณต์›ํ•˜์ง€ ๋ชปํ•˜๋Š” Android ํ”„๋ ˆ์ž„์›Œํฌ ๋ฒ„๊ทธ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ Android ๋ฒ„๊ทธ ๋ณด๊ณ ์„œ๋ฅผ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค. https://issuetracker.google.com/issues/111293868

๋˜ํ•œ ๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ•˜๋Š” (๋น„ ํ”„๋ ˆ์Šค์ฝ”) ์ƒ˜ํ”Œ ์•ฑ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. https://github.com/oprisnik/VisibilityPlayground

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ์กฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Fresco๋Š” ์ˆ˜๋™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๊ณ  ์šฐ๋ฆฌ๋Š” Drawable ๊ฐ€์‹œ์„ฑ์— ์˜์กดํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์‹œ ์š”์ฒญํ•˜๋ฏ€๋กœ ์œ„์—์„œ ์„ค๋ช…ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•๋ณด๋‹ค ๋” ๋‚˜์€ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ๋ชจ๋ฅด๊ณ  ํ”„๋ ˆ์Šค์ฝ”๋กœ ์ „ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ˆ˜๋งŽ์€ gif๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ  ํ›Œ๋ฅญํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ ํƒ์ƒ‰์„ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜์— ์˜์กดํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ํ•ต์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ๋ฐ˜ํ™˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์—์„œ ์ด๋ฏธ์ง€๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ๋ฌดํšจํ™”ํ•˜๊ฑฐ๋‚˜ View.setVisibility๊ฐ€ ๋“œ๋กœ์–ด๋ธ”์„ ํ‘œ์‹œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Drawable.setVisible(true, true) ์ง์ ‘ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
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 ์ž…๋‹ˆ๋‹ค.

์˜ˆ, ์ด๊ฒƒ์€ View ๊ฐ€์‹œ์„ฑ(์ •ํ™•ํžˆ ImageView)์ด Drawable์— ์ „ํŒŒ๋˜์ง€ ์•Š๋Š” Android ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋ฒ„๊ทธ์ด๋ฏ€๋กœ ์ˆ˜๋™์œผ๋กœ ๊ฐ€์‹œ์„ฑ์„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ๊ฐ€์‹œ์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฌ๊ธฐ์—์„œ Android ๋ฒ„๊ทธ ๋ณด๊ณ ์„œ์— ๋ณ„ํ‘œ๋ฅผ ํ‘œ์‹œ ํ•˜์„ธ์š” .

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰