Fresco: ๊ณต์œ  ์š”์†Œ ์ „ํ™˜

์— ๋งŒ๋“  2015๋…„ 03์›” 28์ผ  ยท  57์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebook/fresco

๊ณต์œ  ์š”์†Œ ์ „ํ™˜์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Android 5.0์ด ์„ค์น˜๋œ ๋ชจํ† ๋กœ๋ผ ๊ธฐ๊ธฐ์—์„œ ํ…Œ์ŠคํŠธ๋จ

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

๋‹ค์Œ์€ ์ž˜ ์ž‘๋™ํ•˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
https://github.com/bumptech/glide

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

์ž์„ธํ•œ ๋‚ด์šฉ์„ ์•Œ๋ ค ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ํ•˜๋ ค๊ณ  ํ–ˆ์œผ๋ฉฐ ๊ทธ ๋Œ€์‹ ์— ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ฌ์Šต๋‹ˆ๊นŒ?

์ƒˆ๋กœ์šด Android ๋ฒ„์ „์ธ lollipop์—์„œ๋Š” ImageView๋ฅผ ํ™œ๋™ ๊ฐ„์˜ ๊ณต์œ  ์š”์†Œ ์ „ํ™˜์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ด๋ฏธ์ง€๋Š” ํ•œ ํ™œ๋™์—์„œ ๋‹ค์Œ ํ™œ๋™์œผ๋กœ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค. SimpleDraweeView๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋ƒฅ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธํ•  ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•ฑ ํ…Œ๋งˆ:

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowContentTransitions">true</item>
        <item name="android:windowAllowEnterTransitionOverlap">true</item>
        <item name="android:windowAllowReturnTransitionOverlap">true</item>
    </style>

Activity1 Layout.xml:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/image"
        android:layout_width="@dimen/size_1"
        android:layout_height="@dimen/size_1"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"/>

</RelativeLayout>

Activity2 Layout.xml:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/image"
        android:layout_width="@dimen/size_2"
        android:layout_height="@dimen/size_2"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"
        android:transitionName="image_transition"/>

</RelativeLayout>

๋‘ ๋ฒˆ์งธ ํ™œ๋™์„ ์‹œ์ž‘ํ•˜๋Š” ์ฝ”๋“œ:

    Intent intent = new Intent(activity1, Activity2.class);
    ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(activity1, simpleDraweeView1, "image_transition");
    activity1.startActivity(intent, options.toBundle());

์ด ์ฝ”๋“œ๋Š” ์ด๋ฏธ์ง€๊ฐ€ ํ™œ๋™ 1์˜ ์™ผ์ชฝ ์ƒ๋‹จ ๋ชจ์„œ๋ฆฌ์—์„œ ํ™œ๋™ 2์˜ ์˜ค๋ฅธ์ชฝ ํ•˜๋‹จ ๋ชจ์„œ๋ฆฌ๋กœ ์ด๋™ํ•˜๊ณ  ํฌ๊ธฐ๊ฐ€ ์กฐ์ •๋˜๋Š” ํ™œ๋™ ์‚ฌ์ด๋ฅผ ์ „ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•˜๋Š” ์œ ์‚ฌํ•œ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ–ˆ์ง€๋งŒ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์• ๋‹ˆ๋ฉ”์ด์…˜.

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋„ˆ๋ฌด ํ˜„์‹ค์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค https://github.com/facebook/fresco/issues/99

๋‚˜๋Š” ์ด๊ฒƒ์ด ์ „ํ™˜ํ•  ๋•Œ ๋ณด๊ธฐ๊ฐ€ ๊ฐ€์ ธ์˜ค๋Š” ์—ฐ๊ฒฐ/๋ถ„๋ฆฌ ์ด๋ฒคํŠธ์™€ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์กฐ์‚ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. Fresco์—์„œ ๊ณต์œ  ์š”์†Œ ์ „ํ™˜์ด ์†์ƒ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€๋Š” ๋งค์šฐ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ๋„ ์ผ์–ด๋‚ฌ๋‹ค. TranstitionName xml ์†์„ฑ์„ SimpleDraweeView๋กœ ์„ค์ •ํ•  ๋•Œ setImageUri() ๋ฉ”์„œ๋“œ๊ฐ€ ์ž‘๋™์„ ๋ฉˆ์ท„์Šต๋‹ˆ๋‹ค.

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

FadeDrawable์ด ์‹ค์ œ ์ด๋ฏธ์ง€๋ฅผ ์• ๋‹ˆ๋ฉ”์ด์…˜ํ™”ํ•œ ํ›„ ๋กœ๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
com.facebook.samples.comparison D/ViewRootImpl๏น• changeCanvasOpacity: opaque=false

์•„๋งˆ๋„ changeCanvasOpacity๋กœ ์ธํ•ด ์ด๋ฏธ์ง€๊ฐ€ ๊ทธ๋ ค์ง€์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฒ„๊ทธ๊ฐ€ ์ˆ˜์ •๋˜์—ˆ๋‚˜์š”? ์ œ ํ”„๋กœ์ ํŠธ์—๋„ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. :)

ํŒจํ‚ค์ง€ org.goodev.droidddle.drawee;

import com.facebook.drawee.generic.GenericDraweeHierarchy;
import com.facebook.drawee.view.SimpleDraweeView;

import android.content.Context;
android.graphics.Matrix ๊ฐ€์ ธ์˜ค๊ธฐ;
๊ฐ€์ ธ์˜ค๊ธฐ android.util.AttributeSet;

๊ณต๊ฐœ ํด๋ž˜์Šค TranslateDraweeView ํ™•์žฅ SimpleDraweeView {
๊ณต๊ฐœ TranslateDraweeView(์ปจํ…์ŠคํŠธ ์ปจํ…์ŠคํŠธ) {
์Šˆํผ(์ปจํ…์ŠคํŠธ);
}

public TranslateDraweeView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public TranslateDraweeView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

public TranslateDraweeView(Context context, GenericDraweeHierarchy hierarchy) {
    super(context, hierarchy);
}

// looks like overwrite this method can fix this issue
// but still don't figure out why
public void animateTransform(Matrix matrix) {
    invalidate();
}

}

@goodev ๋ฎ์–ด ์“ฐ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

@shumin0809 ์ด ๋ฐฉ๋ฒ•์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ „ํ™˜์„ ์œ„ํ•œ ๊ณต๊ฐœ ์ˆจ๊น€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

SharedElementTransitions์—์„œ ์—ฌ์ „ํžˆ ๋‹ค๋ฅด์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋Š” ๋™์ž‘์„ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋™์ผํ•œ ๋ฌธ์ œ์ธ์ง€, ๊ด€๋ จ ๋ฌธ์ œ์ธ์ง€, ์•„๋‹ˆ๋ฉด ๋ณ„๋„์˜ ๋ฌธ์ œ์ธ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

_ ๋ณต์ œ _
SharedElementTransition์— ๋Œ€ํ•œ ๊ฝค ํ‘œ์ค€์ ์ธ ์„ค์ •:

  • ๋งŽ์€ ์ด๋ฏธ์ง€๋ฅผ SimpleDraweeViews๋กœ ํ‘œ์‹œํ•˜๋Š” GridLayoutManager๊ฐ€ ์žˆ๋Š” ์กฐ๊ฐ์˜ RecyclerView, ๋ทฐํ™€๋” ๋ฐ”์ธ๋“œ ๋ฉ”์„œ๋“œ์—์„œ ๋™์ ์œผ๋กœ transitionName ์„ค์ •(์—ฌ๊ธฐ์„œ uri๋„ ์„ค์ •ํ•จ)
  • OnClick์€ ๋‹จ์ผ SimpleDrawee ๋ณด๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์กฐ๊ฐ์œผ๋กœ ์ „ํ™˜์„ ์‹œ์ž‘ํ•˜๊ณ  ๋™์ผํ•œ transitionName๋„ ๋™์ ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

_ ์˜ˆ์ƒ _
์ผ๋ฐ˜ ImageView(scaleType ์ผ์น˜ ์ œ๊ณต)์˜ ๊ฒฝ์šฐ ํ”„๋ž˜๊ทธ๋จผํŠธ ๊ฐ„ ๊ณต์œ  ๋ฆฌ์†Œ์Šค์˜ ์›ํ™œํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜

_ ๊ด€์ฐฐ _
SharedElementTransition์ด ๋ฐœ์ƒํ•˜์ง€๋งŒ ๋Œ€์ƒ ์ด๋ฏธ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚˜๊ธฐ ์ „์— ๊นœ๋ฐ•์ž„์ด ์žˆ์Šต๋‹ˆ๋‹ค(๋Œ€์ƒ ์ด๋ฏธ์ง€๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ผ์ฐ ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค)

_ ์ฐธ๊ณ  _
์›น ๋ฐ ๋””์Šคํฌ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์œผ๋ฉฐ ์ „ํ™˜์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ด๋ฏธ์ง€๊ฐ€ ๋กœ๋“œ๋˜๊ณ  ์บ์‹œ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์ƒ ์กฐ๊ฐ์˜ ์ฝ”๋“œ๊ฐ€ ์ •ํ™•ํžˆ ๋™์ผํ•œ URI๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ(๊ทธ๋ฆฌ๊ณ  ๋งŽ์€ ๊ฒƒ์„ ๋ฐฐ์› ์ง€๋งŒ) ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

_Setup _
๊ธฐ๊ธฐ: Android 5.1.1(API 22)์„ ์‹คํ–‰ํ•˜๋Š” Nexus 5 ๋ฐ Nexus 7(2013)
์ตœ์‹  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ๋„๊ตฌ: fresco(0.5.0), Android Studio(1.3 Preview 3 EAP.0), compileSdk(22), ๋นŒ๋“œ ๋„๊ตฌ(22.0.1)

_ ์‹คํ˜„ _
์ด ๊ฒŒ์‹œ๋ฌผ์„ ์ž‘์„ฑํ•˜๋Š” ๋™์•ˆ ๊ด€๋ จ์„ฑ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋Š” 2๊ฐ€์ง€ ์‚ฌํ•ญ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๋‘ ๊ฐœ์˜ Drawee๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋‚˜๋Š” ํ”„๋ ˆ์Šค์ฝ” ์กฐ๊ฐ์„ ์ฝ”๋“œ ์–ด๋”˜๊ฐ€์— ์ปจํ…์ŠคํŠธ๋กœ ์ „๋‹ฌํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋‘ ์กฐ๊ฐ์— ๊ฐ๊ฐ ๊ณ ์œ ํ•œ ์บ์‹œ๊ฐ€ ์žˆ์Œ์„ ์˜๋ฏธํ• ๊นŒ์š”?

@jorgemf - ๊ฒŒ์‹œ๋œ ์ฝ”๋“œ์— ํ™œ๋™ 1 ๋ ˆ์ด์•„์›ƒ์— ์„ค์ •๋œ ์ผ์น˜ํ•˜๋Š” transitionName ์†์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? https://developer.android.com/training/material/animations.html

_ ๊ณต์œ  ์š”์†Œ๋กœ ํ™œ๋™ ์‹œ์ž‘ _
...
4 - android:transitionName ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๋ ˆ์ด์•„์›ƒ์˜ ๊ณต์œ  ์š”์†Œ์— ๊ณตํ†ต ์ด๋ฆ„์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ ์ „ํ™˜์„ ์—ฐ๊ธฐํ•ด์•ผ โ€‹โ€‹ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์˜ค๋Š˜ ์ด๊ฒƒ์„ ๋ณผ ๊ฒƒ์ด๋‹ค:
http://www.androiddesignpatterns.com/2015/03/activity-postponed-shared-element-transitions-part3b.html

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€์žˆ๋‹ค. fresco 0.5.3 ๋ฐ SimpleDraweeView๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ attr " android:transitionName "์ด ์žˆ๋Š” ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ Fresco๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์™ธ๋ถ€ ์†”๋ฃจ์…˜์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@jorgemf Activity1 Layout.xml์—์„œ "android-background"๋ฅผ ์„ค์ •ํ•˜๋ฉด ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
๋‚ด ํ…Œ์ŠคํŠธ์—์„œ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. android:background= "@ android:color/transparent "

@LuizGadao ๋ฐฐ๊ฒฝ์„ ์„ค์ •ํ•˜๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ชจ๋“  ์ด์ ์„ ์žƒ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ธํ„ฐ๋„ท์—์„œ ๋‹ค์šด๋ฐ›์€ ์ด๋ฏธ์ง€๋ฅผ ์›ํ•˜๋Š” ๋งŒํผ ๋ฌด์˜๋ฏธํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ •์  ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐฐ๊ฒฝ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ผ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ…Œ์ŠคํŠธํ•œ ํ›„ Picasso๊ฐ€ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ „ํ˜€ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@jorgemf ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ž‘๋™์„์œ„ํ•œ ํ•ดํ‚น ์ผ๋ฟ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@LuizGadao ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• XML์˜ ์˜ˆ๋ฅผ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ๋ฌธ์ œ๋ฅผ ์‹ ๊ณ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์–‘ํ•ดํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ต์‹ฌ ํŒ€์— ์•Œ๋ ธ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ 30์ผ ์ด๋‚ด์— ๋‹ต๋ณ€์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ถ”์‹ :
@goodev์—์„œ ์ œ๊ณตํ•˜๋Š” TranslateDraweeView๋Š” XiaoMi2, HuaWei P8๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ์žฅ์น˜์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ReenterTransition์ด ์ž˜๋ชป๋œ ์œ„์น˜์—์„œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

boxcounter๊ฐ€ ๋งํ–ˆ๋“ฏ์ด Tra slateDraweeView๋Š” HTC One M8์—์„œ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ChangeImageTransform Transition์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ChangeImageTransform์ด ๊ธฐ๋ณธ์ ์œผ๋กœ DraweeView๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ImageView์˜ Matrix์— ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ณต์œ  ์š”์†Œ ์ „ํ™˜์ด ์‹คํŒจํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งŒ๋‚œ ๋ฌธ์ œ๋Š” ๊ณต์œ  ์š”์†Œ๊ฐ€ ์›๋ž˜ "centerCrop"์ธ ๋™์•ˆ "fitCenter"๋กœ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํ”„๋กœ์ ํŠธ์—์„œ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ
https://github.com/JackFan-Z/ActivitySharedElementTransition.git

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ
ํ”„๋ ˆ์Šค์ฝ”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋ˆ„๊ตฐ๊ฐ€ ์ง„์งœ ๋ฌธ์ œ๊ฐ€ ์–ด๋””์— ์žˆ๋Š”์ง€ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ž˜๋ชป๋œ ์ „ํ™˜ ์‹œ์ž‘ ์ƒํƒœ
2015-10-01 11 26 34

์ „ํ™˜ ์ „
2015-10-01 11 26 50

@JackFan-Z
์ „ํ™˜์˜ ์š”์†Œ ๊ณต์œ ๋Š” ์ตœ์ข… ๋ณด๊ธฐ๋ฅผ ์ดˆ๊ธฐ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ์ตœ์ข… ๊ฐ’์œผ๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜ํ•ฉ๋‹ˆ๋‹ค.

ChangeImageTransform ์™€ ๊ฒฐํ•ฉ๋œ ์ผ๋ฐ˜ ImageView๋Š” ์ด๋ฏธ์ง€ ๋งคํŠธ๋ฆญ์Šค์˜ ์‹œ์ž‘ ๋ฐ ๋ ๊ฐ’์„ ์บก์ฒ˜ํ•œ ๋‹ค์Œ ์ด๋ฏธ์ง€ ๋งคํŠธ๋ฆญ์Šค ๋ณ€๊ฒฝ์— ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ DraweeView ๋Š” ์ด๋ฏธ์ง€ ๋งคํŠธ๋ฆญ์Šค์™€ ๊ด€๋ จ๋œ ํŠน์ • ๊ธฐ๋Šฅ์„ ์žฌ์ •์˜ํ•˜๋ฏ€๋กœ ChangeImageTransform ๋Š” ์ด๋ฏธ์ง€์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ฒฐ๊ตญ ChangeBounds๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ DraweeView์˜ ์ด๋ฏธ์ง€ ๋งคํŠธ๋ฆญ์Šค๋ฅผ ์กฐ์ž‘ํ•  ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. setActualImageMatrix ๋„ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ ๊ธฐ๋ณธ ImageView์˜ ๊ธฐ๋ณธ setImageMatrix ์ฒ˜๋Ÿผ ์ •ํ™•ํ•˜๊ฒŒ ์ž‘๋™ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  DraweeViewHierarchy ์„ค์ •ํ•œ ํ›„ ํ–‰๋ ฌ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋ถˆํŽธํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ onAnimationUpdate ํ˜ธ์ถœ๋งˆ๋‹ค ์ƒˆ๋กœ์šด DraweeViewHierarchy ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

DraweeView๊ฐ€ ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ ๊ฐ€๋Šฅํ•œ ํ•ด๊ฒฐ์ฑ…์€ ๊ธฐ๋ณธ Bitmap์„ ๋˜๋Œ๋ฆฌ๊ณ  ChangeImageTransform ์ „ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ImageView๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@soapsign
๊ท€ํ•˜์˜ ์˜๊ฒฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ๋‚ด ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์—์„œ ๊ณต์œ  ์š”์†Œ์™€ ๋™์ผํ•œ ๋น„ํŠธ๋งต์„ ์‚ฌ์šฉํ•˜๋Š” ๋”๋ฏธ ImageView๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ์ง๋ฉดํ•œ ๋ฌธ์ œ๊ฐ€ ํ”„๋ ˆ์Šค์ฝ”์™€ ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ SimpleDraweeView๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ์‰ฝ๊ฒŒ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ํ™•์‹คํ•ฉ๋‹ˆ๋‹ค.

ChangeImageTransform ๋Š” ๊ณ ์œ  ์ฐจ์›์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€ํ™˜ ํ–‰๋ ฌ์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. DraweeView ์˜ ๊ตฌํ˜„์€ width ๋ฐ height ๋Œ€ํ•ด -1๊ณผ ๋™์ผํ•œ ๊ณ ์œ  ์น˜์ˆ˜๋ฅผ ๊ฐ–๋Š” DraweeHierarchy ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” Drawee ์ด๋ฏธ ์˜ฌ๋ฐ”๋ฅธ ์Šค์ผ€์ผ ์œ ํ˜• ์Šค์ผ€์ผ๋ง์„ ์ ์šฉํ•˜๋ฏ€๋กœ ๋ทฐ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ImageView ๋Š” ํ•˜๋‚˜์˜ ์ถ•์ฒ™ ์œ ํ˜•๋งŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ฉด ๋“œ๋กœ์–ด๋ธ” ๊ณ„์ธต์€ ๊ฐ ์ด๋ฏธ์ง€ ๋ถ„๊ธฐ(์ž๋ฆฌ ํ‘œ์‹œ์ž, ์‹คํŒจ ์ด๋ฏธ์ง€, ์‹ค์ œ ์ด๋ฏธ์ง€ ๋“ฑ)์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ์ถ•์ฒ™ ์œ ํ˜•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ทฐ์— ์‹ค์ œ ๊ณ ์œ  ์น˜์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ํฌ๊ธฐ ์กฐ์ • ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ „ํ™˜ ์ž‘์—…์„ ์›ํ•˜๋ฉด ChangeBounds ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

" fresco:ImageMatrixSrc=actual "๊ณผ ๊ฐ™์€ ์ƒˆ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

@boxcounter ํ˜„์žฌ ์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ œ์•ˆ์— ๋Œ€ํ•œ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)

@massimocarli ChangeBounds๋Š” ๊ณต์œ  ์ด๋ฏธ์ง€๊ฐ€ ๋‘ ํ™œ๋™/๋ณด๊ธฐ์—์„œ ๋™์ผํ•œ ํฌ๊ธฐ์ผ ๋•Œ๋งŒ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ „ํ™˜ ์ค‘์— ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋ฏธ์ง€๊ฐ€ ์ž˜๋ ค์„œ ๋ณด๊ธฐ์— ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ์‹์œผ๋กœ ๋ฌด์—‡์„ ์ œ์•ˆํ•ฉ๋‹ˆ๊นŒ? ChangeImageTransform์ด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€๋งŒ DraweeView์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€...

@massimocarli ChangeBounds๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ๋‹ฌ์„ฑํ•˜๋ ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(ImageView ์‚ฌ์šฉ): https://gfycat.com/HideousEarlyAndalusianhorse

์ด๊ฒƒ์€ SimpleDraweeView๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ์Šต์ž…๋‹ˆ๋‹ค: https://gfycat.com/PracticalCorruptGrouper
์• ๋‹ˆ๋ฉ”์ด์…˜ ์ด๋ฏธ์ง€ ๋’ค์—์„œ ์›๋ณธ ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๊ฐ€ ์ž˜๋ชป ์กฐ์ •๋˜๋Š” ๋ฐฉ์‹์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค.

์ด๊ฒƒ์ด ๋ฐ”๋กœ ChangeBounds๋ฅผ ์ „ํ™˜์œผ๋กœ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์˜ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค. https://gfycat.com/SorrowfulExemplaryAntlion

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, ์ €๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ChangeBounds๊ฐ€ ์›ํ™œํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด๋‚˜ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค. ๊ณต์œ  ์š”์†Œ ์ „ํ™˜์€ ๋จธํ‹ฐ๋ฆฌ์–ผ ๋””์ž์ธ์ด ๋„์ž…ํ•œ ์ตœ๊ณ ์˜ ๊ฒƒ ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ ํ”„๋ ˆ์Šค์ฝ”๋Š” ์ง€๊ธˆ๊นŒ์ง€ ์‚ฌ์šฉํ•œ ๊ฐ€์žฅ ํ›Œ๋ฅญํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ๋‘˜ ๋‹ค ์›ํ™œํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ์„ธ์š”.

Fresco๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ์•Š์„ ๋•Œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ๋˜ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‹ค์Œ์€ ์ž˜ ์ž‘๋™ํ•˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
https://github.com/bumptech/glide

๋ชจ๋‘๋“ค ์•ˆ๋…•,

ChangeBounds ๋ฉ”์„œ๋“œ ์ž์ฒด๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ณต์œ  ์š”์†Œ ์ „ํ™˜์˜ ํ˜„์žฌ ์ƒํƒœ๊ฐ€ ๊ดœ์ฐฎ๋‹ค๋Š” Facebook์˜ ๋‹ต๋ณ€์— ๋†€๋ž์Šต๋‹ˆ๋‹ค.

๋งˆ์นจ๋‚ด ์ƒ˜ํ”Œ ํ”„๋กœ์ ํŠธ์—์„œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.
ChangeBounds ์ „ํ™˜์€ onMeasure()๋ฅผ ํ†ตํ•ด ๋ ˆ์ด์•„์›ƒ ์ž์ฒด๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š๊ณ  ํ˜„์žฌ ์–ด๋–ค drawee ๋ณด๊ธฐ์— ์˜ํ•ด ์žฌ์ •์˜๋˜์ง€ ์•Š๋Š” onSizeChanged()๋ฅผ ํ†ตํ•ด ์—…๋ฐ์ดํŠธ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋“œ๋กœ์–ด๋ธ”์˜ ๋ฐฐ์œจ์€ ์ „ํ™˜ ์ค‘์— ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ „ํ™˜ ์ค‘์— TopLevelDrawable์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” CustomDraweeView์ž…๋‹ˆ๋‹ค.

public class CustomDraweeView extends SimpleDraweeView {

    public CustomDraweeView(Context context, GenericDraweeHierarchy hierarchy) {
        super(context, hierarchy);
    }

    public CustomDraweeView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    <strong i="10">@Override</strong>
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        Drawable drawable = getTopLevelDrawable();
        if (drawable != null) {
            drawable.setBounds(0, 0, w, h);
        }
    }
}

ํ™•์žฅํ•ด์•ผ ํ•˜๋Š” transitionset์˜ xml์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<?xml version="1.0" encoding="utf-8"?>
<transitionSet
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:duration="<strong i="14">@android</strong>:integer/config_mediumAnimTime"
    android:transitionOrdering="together"
    tools:targetApi="LOLLIPOP" >
    <changeBounds
        android:interpolator="<strong i="15">@android</strong>:interpolator/accelerate_decelerate"/>
    <changeTransform
        android:interpolator="<strong i="16">@android</strong>:interpolator/accelerate_decelerate"/>
</transitionSet>

์ด ๋ฐฉ๋ฒ•์˜ ์œ ์ผํ•œ ๋‹จ์ ์€ ๋“œ๋กœ์–ด๋ธ”์˜ ํฌ๊ธฐ ์œ ํ˜•์ด ์กฐ๊ฐ ๋˜๋Š” ํ™œ๋™ ๊ฐ„์— ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๊ณต์œ  ์š”์†Œ ์ „ํ™˜์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ด๋ฅผ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@massimocarli @tyronen
Facebook์˜ ๋ˆ„๊ตฌ๋“ ์ง€ DraweeView๊ฐ€ ํ˜„์žฌ ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜์ง€ ์•Š๋Š” ์ด์œ ์™€ ์ด ์ˆ˜์ •์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋ฌด ๊ฒƒ๋„ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์œผ๋ฉด ์ด์— ๋Œ€ํ•œ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„! ์ƒˆ๋กœ์šด Fresco ๋ฆด๋ฆฌ์Šค 0.10์—์„œ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ScaleType ๊ฐ„์˜ ์‚ฌ์šฉ์ž ์ง€์ • ScaleType ๋ณ€ํ™˜์ด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ๋‚ด ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค
https://gist.github.com/burzumrus/a589aa7e36ca003ddaf2334218c50ad0

์‚ฌ์šฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๋‹ค

TransitionSet transitionSet = new TransitionSet();
transitionSet.addTransition(new ChangeBounds());
transitionSet.addTransition(new DraweeTransform(ScalingUtils.ScaleType.CENTER_CROP, ScalingUtils.ScaleType.FIT_CENTER));
getWindow().setSharedElementEnterTransition(transitionSet);

@burzumrus ๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค! ๊ตฌํ˜„ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ๋‚ด๊ฐ€ InterpolatingScaleType ์—์„œ ์—ผ๋‘์— ๋‘์—ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ Fresco์— ๋Œ€ํ•œ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

@plamenko ์ €๋Š” fresco 0.12๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ

getWindow().setSharedElementEnterTransition(DraweeTransition.createTransitionSet(
                    ScalingUtils.ScaleType.CENTER_CROP, ScalingUtils.ScaleType.CENTER_CROP));
getWindow().setSharedElementEnterTransition(DraweeTransition.createTransitionSet(
                    ScalingUtils.ScaleType.CENTER_CROP, ScalingUtils.ScaleType.CENTER_CROP));

์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฒซ ๋ฒˆ์งธ ํ™œ๋™์œผ๋กœ ๋Œ์•„๊ฐ€๋ฉด ์ด๋ฏธ์ง€๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

์กฐ๊ฐ ๊ฐ„ ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ ์ด๊ฒƒ์„ ์‹œ๋„ํ•œ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? v0.12์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
ํŽธ์ง‘ : RecyclerView๊ฐ€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
ํŽธ์ง‘ 2 : ๋ฌธ์ œ๋Š” ๋ถ€๋ชจ ์žฌ์ง€์ •์ด true๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ ChangeBounds ์ž์ฒด๊ฐ€ X ๋ฐ Y _window_ ์ขŒํ‘œ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ChangeBounds ์˜ setReparenting(true) ๋ฅผ ํ†ตํ•ด ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ ๋Œ€์‹  ChangeTransform ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ RecyclerView ๊ฒฝ์šฐ transitionSet.addTransition(new ChangeTransform()); ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. (๋ณต๊ท€ํ•˜๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ ์—ฌ์ „ํžˆ ๋‚˜์œ ๋ณด์ด์ง€๋งŒ ์ ์–ด๋„ ์ง„์ž… ์• ๋‹ˆ๋ฉ”์ด์…˜ ์Šค์ผ€์ผ ํƒ€์ž…์ด ๋ณ€ํ™”์—๋Š” ์˜ํ–ฅ์ด์—†๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ ๋Š” (๊ดœ์ฐฎ startValues.view ๋กœ endValues.view ์—์„œ createAnimator(...) ๋กœ ํ•ด๊ฒฐํ•  ์ด๊ฒƒ์„)๊ณผ๋ฅผ ์ด๊ฒƒ.)

@Gericop ๋ฐ @ladia12 0.12๋Š” ์กฐ๊ฐ ๊ฐ„ ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
RecyclerView์—์„œ๋„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๋ฌธ์ œ๋Š” '๋ฐ”๊พธ๊ธฐ' ํ”„๋ž˜๊ทธ๋จผํŠธ ํŠธ๋žœ์žญ์…˜๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. '์ถ”๊ฐ€' ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์—ฌ๊ธฐ์— ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ ์กฐ๊ฐ ๊ฐ„ ์ „ํ™˜์˜ ์˜ˆ(ํ”„๋ ˆ์Šค์ฝ” ์—†์Œ)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(github์—์„œ ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Œ).
http://www.androidauthority.com/using-shared-element-transitions-activities-fragments-631996/

@sperochon ๋‚˜๋Š” replace๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  RecyclerView์— ์žˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ž‘๋™์‹œํ‚ค๋ ค๋ฉด ๋ช‡ ๊ฐ€์ง€๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์ถ”๊ฐ€ ChangeTransform ํ†ตํ•ด ์ „์ด ์„ธํŠธ transitionSet.addTransition(new ChangeTransform());

    • ์ด๊ฒƒ์€ ChangeBounds ๊ฐ€ RecyclerView ์—์„œ ์‹œ์ž‘ ๋ณด๊ธฐ์˜ ์ž˜๋ชป๋œ ์œ„์น˜๋ฅผ ๋ณด๊ณ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(ํ•ญ์ƒ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ์˜ X, Y ์ขŒํ‘œ๋ฅผ ๋ฐ˜ํ™˜ํ•จ).

  • createAnimator(...) if (mFromScale == mToScale) ๋ฅผ if(mFromScale == mToScale && startBounds.equals(endBounds))

    • ํฌ๊ธฐ๊ฐ€ ๊ฐ™์ง€ ์•Š๋”๋ผ๋„ ๋‘ ๊ฐœ์˜ ๋“œ๋กœ์–ด๊ฐ€ ๋™์ผํ•œ ์Šค์ผ€์ผ ์œ ํ˜•์„ ๊ณต์œ ํ•˜๋Š” ๊ฒฝ์šฐ ๋ณ€ํ™˜์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • createAnimator(...) final GenericDraweeView draweeView = (GenericDraweeView) startValues.view; ๋ฅผ final GenericDraweeView draweeView = (GenericDraweeView) endValues.view; endValues ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค( startValues -> endValues ๋ณ€๊ฒฝ์— ์ฃผ์˜).

    • ์‹œ์ž‘ ์ง€๊ธ‰์ธ ๋Œ€์‹  ์ข…๋ฃŒ ์ง€๊ธ‰์ธ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

  • scaleType.setValue(fraction) ํ˜ธ์ถœ ํ›„ AnimatorUpdateListener ์—์„œ ๋‹ค์Œ ์ค„์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.
Drawable drawable = draweeView.getTopLevelDrawable();

if (drawable != null) {
    drawable.setBounds(0, 0, draweeView.getWidth(), draweeView.getHeight());
}

์ด ๋งˆ์ง€๋ง‰ ์ฝ”๋“œ ์กฐ๊ฐ์€ @Aohayou ์˜ ์†”๋ฃจ์…˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค( CustomDraweeView ์ž‘๋™์‹œํ‚ฌ ์ˆ˜ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์—).
lib ๋ฒ„์ „ v24.1.1์„ ์ง€์›ํ•˜๋Š” Android 5.0.2์—์„œ ์ด๊ฒƒ์„ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ์†”๋ฃจ์…˜์€ ๋™์ผํ•œ ํฌ๊ธฐ์˜ ์ด๋ฏธ์ง€ ์‚ฌ์ด์— ์• ๋‹ˆ๋ฉ”์ด์…˜์„ํ•˜์ง€ ์ž‘๋™ํ•˜๋Š”์ง€ํ•ฉ๋‹ˆ๋‹ค.

@Gericop ๋‹ค์Œ์€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๋ฐ๋ชจ์ž…๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ github์— ์ปค๋ฐ‹ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์˜: Fresco๊ฐ€ ์ž‘๋™ํ•˜๋ ค๋ฉด ๋ฆฌ์‚ฌ์ดํด๋Ÿฌ ๋ณด๊ธฐ์˜ ๊ฐ ํ•ญ๋ชฉ์—์„œ ์ „ํ™˜ ์ด๋ฆ„์ด ๋‹ฌ๋ผ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ์‚ฌ์ดํด๋Ÿฌ ๋ณด๊ธฐ์—์„œ 1๊ฐœ์˜ ์ด๋ฏธ์ง€๋งŒ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด 1๊ฐœ์˜ ์ „ํ™˜ ์ด๋ฆ„์ด ์žˆ๋Š” 1๊ฐœ์˜ ์ด๋ฏธ์ง€๋งŒ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
https://github.com/sperochon/DemoFrescoFragment2Fragment

์ด ๋„์›€์„ ๋ฐ”๋ž๋‹ˆ๋‹ค!

@sperochon ์—ฌ๋Ÿฌ ์ด๋ฏธ์ง€๋กœ ์‹œ๋„ํ•ด๋ณด์„ธ์š”.
๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ์ˆ˜์ •๋˜์ง€ ์•Š์€ ์†Œ์Šค๋กœ ๋ฐ๋ชจ๋ฅผ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

device-2016-08-14-220810_1

์ด๊ฒƒ์€ ์™„์ „ํžˆ ์ž˜๋ชป๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—”๋“œ ๋ทฐ๋Š” ๋‹ค๋ฅธ ์œ„์น˜์—์„œ ์‹œ์ž‘๋˜๋ฉฐ ์Šค์ผ€์ผ ์œ ํ˜•์€ ์–ด๋–ค ์˜ํ–ฅ๋„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๊ทธ๋ ‡์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— "์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค"๋ผ๊ณ  ์–ด๋–ป๊ฒŒ ๋งํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

@Gericop ๋ฐฉ๊ธˆ ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ ์กฐ๊ฐ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ๋ ˆ์ด์•„์›ƒ์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ๋„ํ•ด ์ฃผ์„ธ์š”.

@sperochon API 23 ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ๋Š” ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์žฅ์น˜(API 21)์—์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ API 21 ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํ…Œ์ŠคํŠธํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์š”์ ์€ ํ˜„์žฌ ๊ตฌํ˜„์ด API 21์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์ง€๋งŒ(API 22์—์„œ๋Š” ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Œ) API 23์—์„œ๋Š” ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ๋ฐ๋ชจ๋Š” ๊ธฐ๋ณธ ChangeBounds ๋ฐ ChangeTransform ์ „ํ™˜๋งŒ ํ…Œ์ŠคํŠธํ•˜๊ณ  Facebook์—์„œ ์ œ๊ณตํ•œ DraweeTransition ๊ตฌํ˜„์€ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ๋‹น์‹  ๋ง์ด ๋งž์•˜์Šต๋‹ˆ๋‹ค... ๋‚ด ๊ธฐ๊ธฐ์—์„œ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.
์•ˆ๋“œ๋กœ์ด๋“œ 5.0 + ํ”„๋ ˆ์Šค์ฝ” v0.11/v0.12 -> KO
์•ˆ๋“œ๋กœ์ด๋“œ 6.0 + ํ”„๋ ˆ์Šค์ฝ” v0.11/v0.12 -> ํ™•์ธ
์ „์—๋Š” ๋ˆˆ์น˜์ฑ„์ง€ ๋ชปํ–ˆ๋Š”๋ฐ...

@Gericop @sperochon ์ด์— ๋Œ€ํ•ด ๋งค์ฒด์— ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ ์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„์›€์ด ๋˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

@ladia12 ๊ทธ ๊ฒŒ์‹œ๋ฌผ์€ ๋‚ด๊ฐ€ (์šฐ๋ฆฌ๊ฐ€) ์ง๋ฉดํ–ˆ๋˜ ๋ฌธ์ œ์™€ ์•„๋ฌด ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค... ๊ท€ํ•˜์˜ ๋ธ”๋กœ๊ทธ ํ•ญ๋ชฉ์€ _inter- Activity _ transition์— ๊ด€ํ•œ ๊ฒƒ์ด๊ณ , ์ œ ๋ฌธ์ œ๋Š” _inter- Fragment _์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์‹ค์ œ ๋ฒ„๊ทธ๋Š” API 21์ด ChangeBounds ๋ฐ/๋˜๋Š” ChangeTransform ์ „ํ™˜์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์— ์žˆ์Šต๋‹ˆ๋‹ค. Facebook์—์„œ ์ œ๊ณตํ•œ DraweeTransition ๋„ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ๋‚ด ์†”๋ฃจ์…˜์€ ์›๋ณธ ์ด๋ฏธ์ง€์™€ ๋Œ€์ƒ ์ด๋ฏธ์ง€์˜ ์น˜์ˆ˜(๋„ˆ๋น„ ๋ฐ/๋˜๋Š” ๋†’์ด)๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ ์ด๋ฅผ ๊ทน๋ณตํ•ฉ๋‹ˆ๋‹ค.

์ •๋ณด์šฉ:
์•ˆ๋“œ๋กœ์ด๋“œ 5.0 + ํ”„๋ ˆ์Šค์ฝ” v0.11/v0.12/0.13 -> KO
์•ˆ๋“œ๋กœ์ด๋“œ >= 5.1 + ํ”„๋ ˆ์Šค์ฝ” v0.11/0.12/0.13 -> ํ™•์ธ

@ladia12 ์ฒซ ํ™œ๋™ ๋ณต๊ท€ ์‹œ ์›๋ณธ ์ด๋ฏธ์ง€๊ฐ€ ์‚ฌ๋ผ์ง€๋Š” ๋ฌธ์ œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜์…จ๋‚˜์š”?

@dbrant ์ €๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์œผ์…จ์Šต๋‹ˆ๊นŒ?

#1446 ์ฐธ์กฐ

@ladia12 ์ฒซ ํ™œ๋™ ๋ณต๊ท€ ์‹œ ์›๋ณธ ์ด๋ฏธ์ง€๊ฐ€ ์‚ฌ๋ผ์ง€๋Š” ๋ฌธ์ œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜์…จ๋‚˜์š”?

@ladia12 ์ฒซ ํ™œ๋™ ๋ณต๊ท€ ์‹œ ์›๋ณธ ์ด๋ฏธ์ง€๊ฐ€ ์‚ฌ๋ผ์ง€๋Š” ๋ฌธ์ œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜์…จ๋‚˜์š”? ๋‚ด ์›๋ณธ ์ด๋ฏธ์ง€๋Š” recyclerview์˜ ๋ทฐํ™€๋”์— ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณต์œ  ์š”์†Œ ์ „ํ™˜์— Picasso๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ณ ์ณ์ง€์ง€ ์•Š์•˜์–ด
ํ”„๋ ˆ์Šค์ฝ”์—์„œ. ๊ทธ๋ž˜์„œ ํ”ผ์นด์†Œ๋Š” ๊ฐ€๋ณ๊ณ  ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค
ํ”„๋ ˆ์Šค์ฝ”์™€ ํ•จ๊ป˜.

2019๋…„ 6์›” 19์ผ ์ˆ˜์š”์ผ ์˜คํ›„ 5:11 bembem1011 [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

@ladia12 https://github.com/ladia12 ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐ ํ•˜์…จ๋‚˜์š” ?
์ฒซ ๋ฒˆ์งธ ํ™œ๋™์œผ๋กœ ๋Œ์•„๊ฐˆ ๋•Œ ์›๋ณธ ์ด๋ฏธ์ง€๊ฐ€ ์‚ฌ๋ผ์ง€๋‚˜์š”? ๋‚˜์˜
์›๋ณธ ์ด๋ฏธ์ง€๋Š” recyclerview์˜ ๋ทฐํ™€๋”์— ์žˆ์Šต๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/facebook/fresco/issues/22?email_source=notifications&email_token=AAXQ5WYUP5KBJYNBOZX7CCDP3ILM5A5CNFSM4A6ZMH32YY3PNVWWK3TUL52HS4DFVEXG43VMXHJ63LDNMV
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAXQ5W5EXO5SV4R2PXVTG7LP3ILM5ANCNFSM4A6ZMH3Q
.

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