Upgrade to Pro — share decks privately, control downloads, hide ads and more …

How to implement material design animation

7166bc2cbc462ab5fd1987a76d0fe709?s=47 takahirom
March 09, 2017

How to implement material design animation

アニメーションがカットされているため、動画版のほうが分かりやすいかもしれません : https://goo.gl/photos/FofgyPrdokrjKtxVA
https://droidkaigi.github.io/2017/timetable.html#session-41

7166bc2cbc462ab5fd1987a76d0fe709?s=128

takahirom

March 09, 2017
Tweet

Transcript

  1. )PXUPJNQMFNFOU NBUFSJBMEFTJHOBOJNBUJPO UBLBIJSPN

  2. ˖ :BIPP+"1"/ך"OESPJEؒٝآص، ˖ 劤せכ嬁「䃨峔 ׭׿ׄױ׋ַמ׹  ˖ "OESPJEָ㥨ֹ ˖ UBLBIJSPN

    !OFX@SVOOBCMF  ˖ 2JJUBהַ׮剅ְגְ׷ךד״׹׃ֻ ֶ격ְ׃תׅ 荈䊹稱➜
  3. – Motion Lead @Google. John Schlemmer “one of the main

    components of what makes material, material. ”
  4. ˖ ٌ٦ءّٝךꅾ銲䚍 ˖ ٌ٦ءّٝך⾱⵱ ˖ ؖ؎سٓ؎ٝה㹋鄲 ˖ "OESPJE劢弫ך畭劣דוֲ㹋鄲ׅ׷ַ ˖ תה׭

    湡如
  5. ז׈،صً٦ءׇׁّٝ׷ ַ

  6. ˖ ؽُ٦꟦ך搊挿ךؖ؎س ˖ ِ٦ؠ٦ָ乼⡲׾㸣✪ׅ׷ה⡦ָ饯ֹ׷ךַؼٝز׾爙ׅ ˖ 銲稆꟦ךꥡ㾴涸ծ瑞꟦涸זꟼ⤘ ˖ 胜䖓ד遤׻׸גְ׷Ⳣ椚؝ٝذٝخך《䖤ծ
 如ךؽُ٦ך铣׫鴥׫זוַ׵岣湡׾׉׵ׅ ˖

    ٍؙؗٓة٦ծ峤箺ծ嚂׃׫ ٌ٦ءّٝךꅾ銲䚍 .BUFSJBM%FTJHO(VJEFMJOF״׶
  7. ˖ ؽُ٦꟦ך搊挿ךؖ؎س ˖ ِ٦ؠ٦ָ乼⡲׾㸣✪ׅ׷ה⡦ָ饯ֹ׷ךַؼٝز׾爙ׅ ˖ 銲稆꟦ךꥡ㾴涸ծ瑞꟦涸זꟼ⤘ ˖ 胜䖓ד遤׻׸גְ׷Ⳣ椚؝ٝذٝخך《䖤ծ
 如ךؽُ٦ך铣׫鴥׫זוַ׵岣湡׾׉׵ׅ ˖

    ٍؙؗٓة٦ծ峤箺ծ嚂׃׫ ٌ٦ءّٝךꅾ銲䚍 罋ִ׷ֿה׾幾׵ׅ ⴓַ׶װֻׅ .BUFSJBM%FTJHO(VJEFMJOF״׶
  8. וֲװ׏ג وذٔ،ٕرؠ؎ٝד ،صً٦ءׇׁّٝ׷ַ

  9. ˖ 3FTQPOTJWF
 ̔⽯䏟ח⿾䘔׃ג鸞䏝ָ鸞ְ ٌ٦ءّٝך⾱⵱ .BUFSJBM%FTJHO(VJEFMJOF״׶ %SPJE,BJHJPDJBM"OESPJEBQQ״׶

  10. ˖ 3FTQPOTJWF
 ̔⽯䏟ח⿾䘔׃ג鸞䏝ָ鸞ְ ˖ /BUVSBM
 ̔荈搫ז⹛ֹ ٌ٦ءّٝך⾱⵱ .BUFSJBM%FTJHO(VJEFMJOF״׶

  11. ˖ 3FTQPOTJWF
 ̔⽯䏟ח⿾䘔׃ג鸞䏝ָ鸞ְ ˖ /BUVSBM
 ̔荈搫ז⹛ֹ ˖ "XBSF
 ̔➭ךوذٔ،ٕה䓼锃⹛⡲ ٌ٦ءّٝך⾱⵱

    .BUFSJBM%FTJHO(VJEFMJOF״׶
  12. ˖ 3FTQPOTJWF
 ̔⽯䏟ח⿾䘔׃ג鸞䏝ָ鸞ְ ˖ /BUVSBM
 ̔荈搫ז⹛ֹ ˖ "XBSF
 ̔➭ךوذٔ،ٕה䓼锃⹛⡲ ˖

    *OUFOUJPOBM
 ̔䠐㔳ָ֮׷ ٌ٦ءّٝך⾱⵱ .BUFSJBM%FTJHO(VJEFMJOF״׶ %SPJE,BJHJPDJBM"OESPJEBQQ״׶
  13. וֲ㹋鄲ׅ׷ַ

  14. NBUFSJBMFMFNFOU IUUQHJUJPFMFNFOU ؟ٝفٕ،فٔ⡲׶ת׃׋

  15. HJUJPFMFNFOU

  16. وذٔ،ٕرؠ؎ٝ
 ؖ؎سٓ؎ٝ׾
 ⯋ח⡲䧭 HJUJPFMFNFOU

  17. א׆אؖ؎سٓ؎ַٝ׵ 鷄׏ג׫״ֲ

  18. ˖ وذٔ،ٕرؠ؎ٝ ˖ ٌ٦ءّٝ ˖ أة؎ٕ ˖ ٖ؎،ؐز ˖ ؝ٝه٦طٝز

    ˖ ػة٦ٝ ˖ 㷕统ה䞔㜠䲿⣘ ˖ ِ٦ؠؽٔذ؍ ˖ ٔا٦أ وذٔ،ٕرؠ؎ٝؖ؎سٓ؎ٝ אך畍ַ׵圓䧭ׁ׸׷
  19. ؖ؎سٓ؎ٝⰻך铡僇ׅ׷鿇ⴓ ˖ وذٔ،ٕرؠ؎ٝ ˖ 넝䏝הءٍسؐ ˖ ٌ٦ءّٝ ˖ 竰竲儗꟦ה؎٦آؚٝ ˖

    麊⹛ ˖ وذٔ،ٕך㢌䕎 ˖ ؝ؚٖؔٓؿ؍ ˖ ؙٔؒ؎ذ؍ـזؕأةو؎ؤ ˖ ػة٦ٝ ˖ 歗⫷ך铣׫鴥׫ ˖ 歗꬗鼂獳
  20. ˖ وذٔ،ٕرؠ؎ٝ ˖ 넝䏝הءٍسؐ ˖ ٌ٦ءّٝ ˖ 竰竲儗꟦ה؎٦آؚٝ ˖ 麊⹛

    ˖ وذٔ،ٕך㢌䕎 ˖ ؝ؚٖؔٓؿ؍ ˖ ؙٔؒ؎ذ؍ـזؕأةو؎ؤ ˖ ػة٦ٝ ˖ 歗⫷ך铣׫鴥׫ ˖ 歗꬗鼂獳 ؖ؎سٓ؎ٝⰻך铡僇ׅ׷鿇ⴓ
  21. 넝䏝הءٍسؐ 䕦ח岣湡
 ةحف儗ח嵤ֹ♳ָ׏ג鋅ִ׷ %SPJE,BJHJPDJBM"OESPJEBQQ״

  22. 넝䏝הءٍسؐ ٖأهٝءـ넝䏝ה⹛涸넝䏝ؔؿإحز ؖ؎سٓ؎ٝ ةحف儗ח7JFX׾EQ♳ָ׷
 EQ⹛涸넝䏝ؔؿإحز 䬃׃גזְ儗ך 넝䏝 䬃׃גְ׷הֹך 넝䏝 'MPBUJOH"DUJPO#VUUPO

    EQ EQ #VUUPO EQ EQ $BSE EQ EQ
  23. ٖأهٝءـ넝䏝ה⹛涸넝䏝ؔؿإحز 㹋鄲 <ImageView android:id="@+id/shot" android:layout_width=“wrap_content" android:layout_height="wrap_content" android:elevation="@dimen/z_card" android:stateListAnimator="@animator/raise" android:foreground="@drawable/mid_grey_ripple" app:badgeGravity="end|bottom"

    app:badgePadding="@dimen/padding_normal" /> TUBUF-JTU"OJNBUPSכ"1*-FWFM劢弫ד搀鋔ׁ׸׷ "1*-FWFM "OESPJE TUBUF-JTU"OJNBUPS׾⢪ֲ ٖ؎،ؐز9.-ⰻ
  24. ٖأهٝءـ넝䏝ה⹛涸넝䏝ؔؿإحز 㹋鄲 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_enabled="true" android:state_pressed="true"> <objectAnimator android:duration="@android:integer/config_shortAnimTime" android:propertyName="translationZ"

    android:valueTo="@dimen/touch_raise" /> </item> <item> <objectAnimator android:duration="@android:integer/config_shortAnimTime" android:propertyName="translationZ" android:valueTo="0dp" /> </item> </selector> BOJNBUPS@SBJTFYNM
  25. ٖأهٝءـ넝䏝ה⹛涸넝䏝ؔؿإحز 㹋鄲 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_enabled="true" android:state_pressed="true"> <objectAnimator android:duration="@android:integer/config_shortAnimTime" android:propertyName="translationZ"

    android:valueTo="@dimen/touch_raise" /> </item> <item> <objectAnimator android:duration="@android:integer/config_shortAnimTime" android:propertyName="translationZ" android:valueTo="0dp" /> </item> </selector> 䬃׃גְ׷הֹך،صً٦ءّٝ׾ 䭷㹀ׅ׷ BOJNBUPS@SBJTFYNM
  26. ٖأهٝءـ넝䏝ה⹛涸넝䏝ؔؿإحز 㹋鄲 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_enabled="true" android:state_pressed="true"> <objectAnimator android:duration="@android:integer/config_shortAnimTime" android:propertyName="translationZ"

    android:valueTo="@dimen/touch_raise" /> </item> <item> <objectAnimator android:duration="@android:integer/config_shortAnimTime" android:propertyName="translationZ" android:valueTo="0dp" /> </item> </selector> USBOTJUJPO;׾EQחׅ׷ BOJNBUPS@SBJTFYNM
  27. ٖأهٝءـ넝䏝ה⹛涸넝䏝ؔؿإحز 㹋鄲 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_enabled="true" android:state_pressed="true"> <objectAnimator android:duration="@android:integer/config_shortAnimTime" android:propertyName="translationZ"

    android:valueTo="@dimen/touch_raise" /> </item> <item> <objectAnimator android:duration="@android:integer/config_shortAnimTime" android:propertyName="translationZ" android:valueTo="0dp" /> </item> </selector> BOJNBUPS@SBJTFYNM EQ ׮ה׮הך&MFWBUJPO  EQ ⹛涸넝䏝ؔؿإحز EQ חז׷
  28. ؖ؎سٓ؎ٝⰻך铡僇ׅ׷鿇ⴓ ˖ وذٔ،ٕرؠ؎ٝ ˖ 넝䏝הءٍسؐ ˖ ٌ٦ءّٝ ˖ 竰竲儗꟦ה؎٦آؚٝ ˖

    麊⹛ ˖ وذٔ،ٕך㢌䕎 ˖ ؝ؚٖؔٓؿ؍ ˖ ؙٔؒ؎ذ؍ـזؕأةو؎ؤ ˖ ػة٦ٝ ˖ 歗⫷ך铣׫鴥׫ ˖ 歗꬗鼂獳
  29. 竰竲儗꟦ 騃ꨄָꞿְקו،صً٦ءّٝ儗꟦ָꞿְ

  30. 竰竲儗꟦

  31. ˖ NT׾馄ִזְ״ֲחׅ׷ 竰竲儗꟦

  32. ˖ NT׾馄ִזְ״ֲחׅ׷ ˖ NTַ׵NTך꟦ד
 ⹛ַׅ騃ꨄח״׏ג锃侭 竰竲儗꟦

  33. ˖ NT׾馄ִזְ״ֲחׅ׷ ˖ NTַ׵NTך꟦ד
 ⹛ַׅ騃ꨄח״׏ג锃侭 ˖ ةـٖحزזוך畭劣ח
 ״׏ג׮㢌ִ׋קֲָ葺ְ
 㣐ְֹ畭劣קוꞿֻ 竰竲儗꟦

  34. ˖ NT׾馄ִזְ״ֲחׅ׷ ˖ NTַ׵NTך꟦ד
 ⹛ַׅ騃ꨄח״׏ג锃侭 ˖ ةـٖحزזוך畭劣ח
 ״׏ג׮㢌ִ׋קֲָ葺ְ
 㣐ְֹ畭劣קוꞿֻ ˖

    TFU%VSBUJPO ׾ⵃ欽ׅ׷ 竰竲儗꟦
  35. ؖ؎سٓ؎ٝⰻך铡僇ׅ׷鿇ⴓ ˖ وذٔ،ٕرؠ؎ٝ ˖ 넝䏝הءٍسؐ ˖ ٌ٦ءّٝ ˖ 竰竲儗꟦ה؎٦آؚٝ ˖

    麊⹛ ˖ وذٔ،ٕך㢌䕎 ˖ ؝ؚٖؔٓؿ؍ ˖ ؙٔؒ؎ذ؍ـזؕأةو؎ؤ ˖ ػة٦ٝ ˖ 歗⫷ך铣׫鴥׫ ˖ 歗꬗鼂獳
  36. ؎٦آؚٝ &BTJOH$VSWFTכ،صً٦ءّٝך
 أؾ٦سװ鷲僇䏝ծ㣐ֹׁזוח黝䘔ׁ׸׷

  37. ٌ٦ءّٝ؎٦آؚٝ ؖ؎سٓ؎ٝ Ͳ͜Ͱ࢖͏͔ ඪ४Χʔϒ4UBOEBSEDVSWF ը໘಺Ͱͷӡಈ ݮ଎Χʔϒ%FDFMFSBUJPODVSWF ը໘ʹೖΔӡಈ Ճ଎Χʔϒ"DDFMFSBUJPODVSWF ը໘͔Βग़Δӡಈ ٸΧʔϒ4IBSQDVSWF

    ͍ͭͰ΋ը໘ʹೖΕΔΦϒδΣΫτ ͷӡಈ
  38. ٌ٦ءّٝ؎٦آؚٝ 㹋鄲 Ͳ͏࣮૷͢Δ͔ ඪ४Χʔϒ4UBOEBSEDVSWF 'BTU0VU4MPX*O*OUFSQPMBUPS ݮ଎Χʔϒ%FDFMFSBUJPODVSWF -JOFBS0VU4MPX*O*OUFSQPMBUPS Ճ଎Χʔϒ"DDFMFSBUJPODVSWF 'BTU0VU-JOFBS*O*OUFSQPMBUPS ٸΧʔϒ4IBSQDVSWF

    1BUI*OUFSQPMBUPS$PNQBU DSFBUF G  G   ViewPropertyAnimatorΛ࢖ͬͨࢦఆํ๏ view.animate() .translationX(100) .setDuration(290) .setInterpolator(new FastOutSlowInInterpolator()) .start(); "1*-FWFM
  39. وذٔ،ٕرؠ؎ٝؖ؎سٓ؎ٝ ➙㔐《׶♳־׷،صً٦ءّٝ鿇ⴓ ˖ وذٔ،ٕرؠ؎ٝ ˖ 넝䏝הءٍسؐ ˖ ٌ٦ءّٝ ˖ 竰竲儗꟦ה؎٦آؚٝ

    ˖ 麊⹛ ˖ وذٔ،ٕך㢌䕎 ˖ ؝ؚٖؔٓؿ؍ ˖ ؙٔؒ؎ذ؍ـזؕأةو؎ؤ ˖ ػة٦ٝ ˖ 歗⫷ך铣׫鴥׫ ˖ 歗꬗鼂獳
  40. 麊⹛ 植㹋ך⚅歲הずׄ״ֲח♴倯ぢחꅾ⸂ָ֮׷ךד
 ♴ך倯ぢח花׵׿׌䕎חז׷

  41. 麊⹛ 㹋鄲

  42. 麊⹛ 㹋鄲

  43. 麊⹛ 㹋鄲 ext, TransformingActivity.class); nsCompat.makeSceneTransitionAnimation( iew,getString(R.string.transition_name)).toBundle(); ontext, intent, options); .BJO"DUJWJUZ

    5SBOTGPSNJOH"DUJWJUZ <ImageView android:layout_width="mat android:layout_height="wr android:transitionName="@ <style name="AppTheme.No ٖ؎،ؐز ذ٦و
  44. "DUJWJUZ0QUJPOT$PNQBUד 鼂獳⯋7JFXה鼂獳⯓ך7JFX׾
 穠ןאֽג"DUJWJUZ饯⹛ Intent intent = new Intent(context, TransformingActivity.class); Bundle

    options = ActivityOptionsCompat.makeSceneTransitionAnimation( context, fromView, getString(R.string.transition_name)).toBundle(); ActivityCompat.startActivity(context, intent, options); .BJO"DUJWJUZ
  45. 5SBOTGPSNJOH"DUJWJUZ <ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:transitionName="@string/transition_name"/> <style name="AppTheme.NoActionBar.Detail"> <item name="android:windowSharedElementEnterTransition">@transition/ default_share</item>

    <item name="android:windowSharedElementReturnTransition">@transition/ ٖ؎،ؐز ذ٦و ٖ؎،ؐزדUSBOTJUJPO/BNF׾䭷㹀
  46. <ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:transitionName="@string/transition_name"/> <style name="AppTheme.NoActionBar.Detail"> <item name="android:windowSharedElementEnterTransition">@transition/ default_share</item> <item

    name="android:windowSharedElementReturnTransition">@transition/ default_share</item> </style> ٖ؎،ؐز ذ٦و 5SBOTJUJPO <?xml version="1.0" encoding="utf-8"?> <transitionSet .. android:duration="350" android:interpolator="..."> <changeBounds/> ذ٦وד5SBOTJUJPO׾䭷㹀
  47. android:layout_height="wrap_content" android:transitionName="@string/transition_name"/> <style name="AppTheme.NoActionBar.Detail"> <item name="android:windowSharedElementEnterTransition">@transition/ default_share</item> <item name="android:windowSharedElementReturnTransition">@transition/ default_share</item>

    </style> ذ٦و 5SBOTJUJPO <?xml version="1.0" encoding="utf-8"?> <transitionSet .. android:duration="350" android:interpolator="..."> <changeBounds/> <pathMotion class="**.GravityArcMotion" /> </transitionSet> QBUI.PUJPO׾䭷㹀 ֿ׸ח״׶嘴ⰼ䕎חז׷ DIBOHF#PVOETד獳⹛ 㣐ֹׁ㢌⻉
  48. 麊⹛ 㹋鄲 QBUI.PUJPO׾ⵃ欽ׅ׷կ
 ׋׌׃垥彊ך"SD.PSUJPOؙٓأ׾ⵃ欽 ׅ׷ה♳ח花׵׬،صً٦ءّٝד ♶黝ⴖהׁ׸גְ׷⹛ֹהז׷ IUUQTEFWFMPQFSBOESPJEDPNSFGFSFODFBOESPJEUSBOTJUJPO"SD.PUJPOIUNM "1*-FWFM 5SBOTJUJPOך䭷㹀⢽ ❌

  49. 荈搫ז䓜׾⡲׷חכ <?xml version="1.0" encoding="utf-8"?> <transitionSet … android:duration="350" android:interpolator=“…”> <changeBounds/> <pathMotion

    class=“**.GravityArcMotion” /> </transitionSet>
  50. ˖ 1MBJEח֮׷"SD.PUJPOؙٓأ׾
 䭁䓸׃׋(SBWJUZ"SD.PUJPOؙٓأָ
 ֮׷
 QMBJE(SBWJUZ"SD.PUJPOKBWB 荈搫ז䓜׾⡲׷חכ <?xml version="1.0" encoding="utf-8"?> <transitionSet

    … android:duration="350" android:interpolator=“…”> <changeBounds/> <pathMotion class=“**.GravityArcMotion” /> </transitionSet>
  51. ˖ 1MBJEח֮׷"SD.PUJPOؙٓأ׾
 䭁䓸׃׋(SBWJUZ"SD.PUJPOؙٓأָ
 ֮׷
 QMBJE(SBWJUZ"SD.PUJPOKBWB 荈搫ז䓜׾⡲׷חכ ˟1MBJEהכ(PPHMFךوذٔ،ٕرؠ؎ٝך ؔ٦فٝا٦أך⿫罋㹋鄲דַאرؠ؎ٝصُ٦أ،فٔ <?xml version="1.0"

    encoding="utf-8"?> <transitionSet … android:duration="350" android:interpolator=“…”> <changeBounds/> <pathMotion class=“**.GravityArcMotion” /> </transitionSet>
  52. ˖ 1MBJEח֮׷"SD.PUJPOؙٓأ׾
 䭁䓸׃׋(SBWJUZ"SD.PUJPOؙٓأָ
 ֮׷
 QMBJE(SBWJUZ"SD.PUJPOKBWB ˖ ׋׌ծك٦أה׃גְ׷
 ؿٖ٦يٙ٦ؙך؝٦سָ〢ֻծ
 暴㹀ך勴⟝ך儗ח
 ֲתֻ،صً٦ءّٝ׃זְ׋׭ծ

    ⡲׶湫׃׋
 NBUFSJBMFMFNFOU (SBWJUZ"SD.PUJPOKBWB 荈搫ז䓜׾⡲׷חכ ˟1MBJEהכ(PPHMFךوذٔ،ٕرؠ؎ٝך ؔ٦فٝا٦أך⿫罋㹋鄲דַאرؠ؎ٝصُ٦أ،فٔ <?xml version="1.0" encoding="utf-8"?> <transitionSet … android:duration="350" android:interpolator=“…”> <changeBounds/> <pathMotion class=“**.GravityArcMotion” /> </transitionSet>
  53. ؖ؎سٓ؎ٝⰻך铡僇ׅ׷鿇ⴓ ˖ وذٔ،ٕرؠ؎ٝ ˖ 넝䏝הءٍسؐ ˖ ٌ٦ءّٝ ˖ 竰竲儗꟦ה؎٦آؚٝ ˖

    麊⹛ ˖ وذٔ،ٕך㢌䕎 ˖ ؝ؚٖؔٓؿ؍ ˖ ؙٔؒ؎ذ؍ـזؕأةو؎ؤ ˖ ػة٦ٝ ˖ 歗⫷ך铣׫鴥׫ ˖ 歗꬗鼂獳
  54. ةحف׃׋㜥䨽ַ׵
 ⰼ׾䲽ֻ״ֲח邌爙ׁ׸׷ وذٔ،ٕך㢌䕎 佝㼗㘗㢌䕎

  55. 4IBSFE&MFNFOU5SBOTJUJPOד
 $VTUPN5SBOTJUJPO׾ⵃ欽׃ג֮־׷ وذٔ،ٕך㢌䕎 佝㼗㘗㢌䕎㹋鄲

  56. 5SBOTGPSNJOH.BUFSJBM"DUJWJUZ -PHJO"DUJWJUZ ̔ <FrameLayout android:layout_width= android:layout_height= android:onClick="dism <LinearLayout android:id="@+id/co android:transitionNa

    …. 'BC5SBOTGPSNKBWB public class FabTransform extends Trans @Override final FabTransform sharedEnter = new Fa activity.getWindow().setSharedElementE -PHJO"DUJWJUZKBWB (context, LoginActivity.class); ptionsCompat = ActivityOptionsCompat onAnimation(context, g.transition_name_login)); 佝㼗㘗㢌䕎 㹋鄲⢽ "1*-FWFM 1MBJEך؝٦س״׶
  57. ̔ 'BC5SBOTGPSN public class F @Override public void captureV }

    @Override public void final FabTrans activity.getWi -PHJO"DUJWJUZ Intent intent = new Intent(context, LoginActivity.class); … ActivityOptionsCompat optionsCompat = ActivityOptionsCompat .makeSceneTransitionAnimation(context, fab, getString(R.string.transition_name_login)); ActivityCompat.startActivity(context, intent, optionsCompat.toBundle()); "DUJWJUZ0QUJPOT$PNQBUד 鼂獳⯋7JFXה鼂獳⯓ך7JFX׾
 穠ןאֽג"DUJWJUZ饯⹛ 5SBOTGPSNJOH.BUFSJBM"DUJWJUZ -PHJO"DUJWJU
  58. <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:onClick="dismiss"> <LinearLayout android:id="@+id/container" android:transitionName=“@string/transition_name_login"> …. 'BC5SBOTGPSNKBWB public

    class FabTransform extends Transition { @Override public void captureStartValues(TransitionValues transitionValues) { captureValues(transitionValues); } @Override public void captureEndValues(TransitionValues transitionValues) { final FabTransform sharedEnter = new FabTransform(color, icon); activity.getWindow().setSharedElementEnterTransition(sharedEnter); -PHJO"DUJWJUZKBWB ٖ؎،ؐزדUSBOTJUJPO/BNF׾䭷㹀 -PHJO"DUJWJUZ
  59. <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:onClick="dismiss"> <LinearLayout android:id="@+id/container" android:transitionName=“@string/transition_name_login"> …. 'BC5SBOTGPSNKBWB public

    class FabTransform extends Transition { @Override public void captureStartValues(TransitionValues transitionValues) { captureValues(transitionValues); } @Override public void captureEndValues(TransitionValues transitionValues) { final FabTransform sharedEnter = new FabTransform(color, icon); activity.getWindow().setSharedElementEnterTransition(sharedEnter); -PHJO"DUJWJUZKBWB 'BC5SBOTGPSNהְֲ $VTUPN5SBOTJUJPO׾䭷㹀 -PHJO"DUJWJUZ
  60. 'BC5SBOTGPSNKBWB public class FabTransform extends Transition { @Override public void

    captureStartValues(TransitionValues transitionValues) { captureValues(transitionValues); } @Override public void captureEndValues(TransitionValues transitionValues) { captureValues(transitionValues); } private void captureValues(TransitionValues transitionValues) { final View view = transitionValues.view; transitionValues.values.put(PROP_BOUNDS, new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom())); } @Override public Animator createAnimator(final ViewGroup sceneRoot, final TransitionValues startValues, final TransitionValues endValues) {
  61. 'BC5SBOTGPSNKBWB public class FabTransform extends Transition { @Override public void

    captureStartValues(TransitionValues transitionValues) { captureValues(transitionValues); } @Override public void captureEndValues(TransitionValues transitionValues) { captureValues(transitionValues); } private void captureValues(TransitionValues transitionValues) { final View view = transitionValues.view; transitionValues.values.put(PROP_BOUNDS, new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom())); } @Override public Animator createAnimator(final ViewGroup sceneRoot, final TransitionValues startValues, final TransitionValues endValues) { ⴱ׭ך⡘縧׾⥂㶷
  62. 'BC5SBOTGPSNKBWB public class FabTransform extends Transition { @Override public void

    captureStartValues(TransitionValues transitionValues) { captureValues(transitionValues); } @Override public void captureEndValues(TransitionValues transitionValues) { captureValues(transitionValues); } private void captureValues(TransitionValues transitionValues) { final View view = transitionValues.view; transitionValues.values.put(PROP_BOUNDS, new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom())); } @Override public Animator createAnimator(final ViewGroup sceneRoot, final TransitionValues startValues, final TransitionValues endValues) { USBOTJUJPO7BMVFTח⡘縧׾⥂㶷 ⴱ׭ך⡘縧׾⥂㶷
  63. 'BC5SBOTGPSNKBWB public class FabTransform extends Transition { @Override public void

    captureStartValues(TransitionValues transitionValues) { captureValues(transitionValues); } @Override public void captureEndValues(TransitionValues transitionValues) { captureValues(transitionValues); } private void captureValues(TransitionValues transitionValues) { final View view = transitionValues.view; transitionValues.values.put(PROP_BOUNDS, new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom())); } @Override public Animator createAnimator(final ViewGroup sceneRoot, final TransitionValues startValues, final TransitionValues endValues) { USBOTJUJPO7BMVFTח⡘縧׾⥂㶷 ⴱ׭ך⡘縧׾⥂㶷 穄׻׶ך⡘縧׾⥂㶷
  64. @Override public Animator createAnimator(final ViewGroup sceneRoot, final TransitionValues startValues, final

    TransitionValues endValues) { final Rect startBounds = (Rect) startValues.values.get(PROP_BOUNDS); final Rect endBounds = (Rect) endValues.values.get(PROP_BOUNDS); ... final View view = endValues.view; circularReveal = ViewAnimationUtils.createCircularReveal(view, view.getWidth() / 2, view.getHeight() / 2, startBounds.width() / 2, (float) Math.hypot(endBounds.width() / 2, endBounds.height() / 2)); ... final AnimatorSet transition = new AnimatorSet(); transition.playTogether(circularReveal, translate, colorFade, iconFade); transition.playTogether(fadeContents); ... return new AnimatorUtils.NoPauseAnimator(transition); } }
  65. @Override public Animator createAnimator(final ViewGroup sceneRoot, final TransitionValues startValues, final

    TransitionValues endValues) { final Rect startBounds = (Rect) startValues.values.get(PROP_BOUNDS); final Rect endBounds = (Rect) endValues.values.get(PROP_BOUNDS); ... final View view = endValues.view; circularReveal = ViewAnimationUtils.createCircularReveal(view, view.getWidth() / 2, view.getHeight() / 2, startBounds.width() / 2, (float) Math.hypot(endBounds.width() / 2, endBounds.height() / 2)); ... final AnimatorSet transition = new AnimatorSet(); transition.playTogether(circularReveal, translate, colorFade, iconFade); transition.playTogether(fadeContents); ... return new AnimatorUtils.NoPauseAnimator(transition); } } ⡲׏׋#PVOET׾《䖤
  66. @Override public Animator createAnimator(final ViewGroup sceneRoot, final TransitionValues startValues, final

    TransitionValues endValues) { final Rect startBounds = (Rect) startValues.values.get(PROP_BOUNDS); final Rect endBounds = (Rect) endValues.values.get(PROP_BOUNDS); ... final View view = endValues.view; circularReveal = ViewAnimationUtils.createCircularReveal(view, view.getWidth() / 2, view.getHeight() / 2, startBounds.width() / 2, (float) Math.hypot(endBounds.width() / 2, endBounds.height() / 2)); ... final AnimatorSet transition = new AnimatorSet(); transition.playTogether(circularReveal, translate, colorFade, iconFade); transition.playTogether(fadeContents); ... return new AnimatorUtils.NoPauseAnimator(transition); } } ⡲׏׋#PVOET׾《䖤 #PVOET׾⢪׏ג $JSDVMBS3FWFBM׾⡲䧭
  67. @Override public Animator createAnimator(final ViewGroup sceneRoot, final TransitionValues startValues, final

    TransitionValues endValues) { final Rect startBounds = (Rect) startValues.values.get(PROP_BOUNDS); final Rect endBounds = (Rect) endValues.values.get(PROP_BOUNDS); ... final View view = endValues.view; circularReveal = ViewAnimationUtils.createCircularReveal(view, view.getWidth() / 2, view.getHeight() / 2, startBounds.width() / 2, (float) Math.hypot(endBounds.width() / 2, endBounds.height() / 2)); ... final AnimatorSet transition = new AnimatorSet(); transition.playTogether(circularReveal, translate, colorFade, iconFade); transition.playTogether(fadeContents); ... return new AnimatorUtils.NoPauseAnimator(transition); } } 鼂獳⯋ך7JFXך#PVOEה鼂獳⯓ך#PVOE׾
 ⢪׏ג"OJNBUPS׾⡲׷ ⡲׏׋#PVOET׾《䖤 #PVOET׾⢪׏ג $JSDVMBS3FWFBM׾⡲䧭
  68. ؖ؎سٓ؎ٝⰻך铡僇ׅ׷鿇ⴓ ˖ وذٔ،ٕرؠ؎ٝ ˖ 넝䏝הءٍسؐ ˖ ٌ٦ءّٝ ˖ 竰竲儗꟦ה؎٦آؚٝ ˖

    麊⹛ ˖ وذٔ،ٕך㢌䕎 ˖ ؝ؚٖؔٓؿ؍ ˖ ؙٔؒ؎ذ؍ـזؕأةو؎ؤ ˖ ػة٦ٝ ˖ 歗⫷ך铣׫鴥׫ ˖ 歗꬗鼂獳
  69. ˖ ׮ה׮הךせ⵸כ.FBOJOHGVM USBOTJUJPO 䠐㄂ך֮׷鼂獳  ˖ ˑ⹛ֹך֮׷وذٔ،ٕדכծ鼂獳⚥ ח銲稆׾Ⱏ剣ׅ׷ֿהדծ乼⡲⚥ך ِ٦ؠ٦ך搊挿׾㼪ֹתׅկ˒ ؝ؚٖؔٓؿ؍

  70. ؝ؚٖؔٓؿ؍ 鸬竲䚍ؖ؎سٓ؎ٝ ˖ ؝ٝذٝخךׅץגך銲稆ָ
 Ⱏ剣ׁ׸׷㜥さ ˖ ؝ٝذٝخך銲稆ָקה׿וծ
 ת׋כת׏׋ֻⰟ剣ׁ׸זְ㜥さ "1*-FWFM

  71. ؝ؚٖؔٓؿ؍ 鸬竲䚍ؖ؎سٓ؎ٝ ։࢝࣌ؒ ऴྃ࣌ؒ $BSEͷԣ෯ NT NT $BSEͷॎ෯ NT NT

    4IBSFE&MFNFOUͷ
 YͷҐஔ NT NT 4IBSFE&MFNFOUͷ
 ZͷҐஔ NT NT දࣔ͞ΕΔ7JFXͷ ಁ໌౓ NT NT
  72. ؝ؚٖؔٓؿ؍ 鸬竲䚍㹋鄲 'BCָ䎢ָ׷،صً٦ءّٝהずׄ״ֲח 4IBSFE&MFNFOU5SBOTJUJPO׾ⵃ欽ׅ׷ 簚ה埆ך،صً٦ءّٝךꟚ㨣儗꟦ךؤٖ׾ 邌植ׅ׷׋׭ח$VTUPN5SBOTJUJPO׾⡲䧭 AnimatorSet animatorSet = new

    AnimatorSet(); … widthAnim.setDuration(275); heightAnim.setStartDelay(30); heightAnim.setDuration(345); animatorSet.playTogether(widthAnim, heightAnim); "1*-FWFM
  73. 4IBSFE&MFNFOU5SBOTJUJP׾ ⵃ欽ׅ׷ػة٦ָٝ㢳ְךד ׮ֲ㼰׃䱠׶♴־תׅ

  74. 鸬竲䚍׾㹋鄲ׅ׷׋׭ח "DUJWJUZ5SBOTJUJPOך㛇燉濼陎 "DUJWJUZ" "DUJWJUZ"#ח獳⹛ׅ׷㜥さ "DUJWJUZ# TUBSU"DUJWJUZ "1*-FWFM

  75. 鸬竲䚍׾㹋鄲ׅ׷׋׭ח "DUJWJUZ5SBOTJUJPOך㛇燉濼陎 "DUJWJUZ" "DUJWJUZ"#ח獳⹛ׅ׷㜥さ "DUJWJUZ# &YJU5SBOTJUJPO 4IBSFE&MFNFOU&YJU5SBOTJUJPO TUBSU"DUJWJUZ "1*-FWFM

  76. 鸬竲䚍׾㹋鄲ׅ׷׋׭ח "DUJWJUZ5SBOTJUJPOך㛇燉濼陎 "DUJWJUZ" "DUJWJUZ"#ח獳⹛ׅ׷㜥さ "DUJWJUZ# &YJU5SBOTJUJPO 4IBSFE&MFNFOU&YJU5SBOTJUJPO &OUFS5SBOTJUJPO 4IBSFE&MFNFOU&OUFS5SBOTJUJPO TUBSU"DUJWJUZ

    "1*-FWFM
  77. 鸬竲䚍׾㹋鄲ׅ׷׋׭ח "DUJWJUZ5SBOTJUJPOך㛇燉濼陎 "DUJWJUZ" "DUJWJUZ"#ח獳⹛ׅ׷㜥さ "DUJWJUZ# &YJU5SBOTJUJPO 4IBSFE&MFNFOU&YJU5SBOTJUJPO &OUFS5SBOTJUJPO 4IBSFE&MFNFOU&OUFS5SBOTJUJPO TUBSU"DUJWJUZ

    אך鼂獳דאך5SBOTJUJPOָ饥׷ "1*-FWFM
  78. 鸬竲䚍׾㹋鄲ׅ׷׋׭ח "DUJWJUZ5SBOTJUJPOך㛇燉濼陎 "DUJWJUZ" "DUJWJUZ#"ח䨱׷㜥さ "DUJWJUZ# 䨱׷نةٝ "1*-FWFM

  79. 鸬竲䚍׾㹋鄲ׅ׷׋׭ח "DUJWJUZ5SBOTJUJPOך㛇燉濼陎 "DUJWJUZ" "DUJWJUZ#"ח䨱׷㜥さ "DUJWJUZ# 3FUVSO5SBOTJUJPO 4IBSFE&MFNFOU3FUVSO5SBOTJUJPO 䨱׷نةٝ "1*-FWFM

  80. 鸬竲䚍׾㹋鄲ׅ׷׋׭ח "DUJWJUZ5SBOTJUJPOך㛇燉濼陎 "DUJWJUZ" "DUJWJUZ#"ח䨱׷㜥さ "DUJWJUZ# 3FFOUFS5SBOTJUJPO 4IBSFE&MFNFOU3FFOUFS5SBOTJUJPO 3FUVSO5SBOTJUJPO 4IBSFE&MFNFOU3FUVSO5SBOTJUJPO 䨱׷نةٝ

    "1*-FWFM
  81. 鸬竲䚍׾㹋鄲ׅ׷׋׭ח "DUJWJUZ5SBOTJUJPOך㛇燉濼陎 "DUJWJUZ" "DUJWJUZ#"ח䨱׷㜥さ "DUJWJUZ# 3FFOUFS5SBOTJUJPO 4IBSFE&MFNFOU3FFOUFS5SBOTJUJPO 3FUVSO5SBOTJUJPO 4IBSFE&MFNFOU3FUVSO5SBOTJUJPO 䨱׷نةٝ

    אך鼂獳דⴽךאך5SBOTJUJPOָ饥׷ "1*-FWFM
  82. 5SBOTJUJPOךرغحؚ ➙וך5SBOTJUJPOָ⹛ְגְ׷׿׌׏ֽ ̔Ⰻגך5SBOTJUJPOװ8JOEPX"OJNBUJPO ׾⳿⸂ׅ׷ ؟ٝفٕ،فٔךًصُ٦ַ׵
 ˑ%FCVH˒ד剣⸬⻉דֹתׅ

  83. 5SBOTJUJPOךرغحؚ ˖ ،صً٦ءָّٝ傍ֻג
 ״ֻⴓַ׵זְ
 ̔Ꟛ涪罏ぢֽؔفءّٝד
 "OJNBUPSⱄ欰儗꟦أ؛٦ٕ׾㢌刿ׅ׷

  84. 5SBOTJUJPOךرغحؚ <transitionSet> <targets> <target android:targetId="@id/image" /> </targets> <transition class="**.BlinkDebugTransition" />

    </transitionSet> ˖ 7JFXָ5SBOTJUJPOך㼎韋חז׏גְ׷
 ךַ״ֻⴓַ׵זְ
 ̔#MJOL%FCVH5SBOTJUJPOؙٓأ׾
 ⡲׏׋ךד׉׸ד5SBOTJUJPOָ
 ⹛ְגְ׷ַ然钠׃ג׫׷ה葺ְ
  85. 5SBOTJUJPOָ ֲתֻ⹛ַזְהֹךثؑحؙٔأز

  86. 5SBOTJUJPOָ ֲתֻ⹛ַזְהֹךثؑحؙٔأز ˖ UIFNFךXJOEPX"DUJWJUZ5SBOTJUJPOTָ剣⸬חז׏גְ׷ "QQ$PNQBU5IFNFזו鋵ךذ٦وָ5IFNF.BUFSJBMח ז׏גְ׸ל㉏겗ז׃

  87. 5SBOTJUJPOָ ֲתֻ⹛ַזְהֹךثؑحؙٔأز ˖ UIFNFךXJOEPX"DUJWJUZ5SBOTJUJPOTָ剣⸬חז׏גְ׷ "QQ$PNQBU5IFNFזו鋵ךذ٦وָ5IFNF.BUFSJBMח ז׏גְ׸ל㉏겗ז׃ <item name="android:windowContentTransitions">true</item>

  88. 5SBOTJUJPOָ ֲתֻ⹛ַזְהֹךثؑحؙٔأز ˖ UIFNFךXJOEPX"DUJWJUZ5SBOTJUJPOTָ剣⸬חז׏גְ׷ "QQ$PNQBU5IFNFזו鋵ךذ٦وָ5IFNF.BUFSJBMח ז׏גְ׸ל㉏겗ז׃ <item name="android:windowContentTransitions">true</item>

  89. 5SBOTJUJPOָ ֲתֻ⹛ַזְהֹךثؑحؙٔأز ˖ UIFNFךXJOEPX"DUJWJUZ5SBOTJUJPOTָ剣⸬חז׏גְ׷ "QQ$PNQBU5IFNFזו鋵ךذ٦وָ5IFNF.BUFSJBMח ז׏גְ׸ל㉏겗ז׃ <item name="android:windowContentTransitions">true</item>

  90. 5SBOTJUJPOָ ֲתֻ⹛ַזְהֹךثؑحؙٔأز ˖ UIFNFךXJOEPX"DUJWJUZ5SBOTJUJPOTָ剣⸬חז׏גְ׷ "QQ$PNQBU5IFNFזו鋵ךذ٦وָ5IFNF.BUFSJBMח ז׏גְ׸ל㉏겗ז׃ ˖ *NBHF7JFXךTDBMF5ZQFְׄ׏ג׫׋ <item name="android:windowContentTransitions">true</item>

  91. 5SBOTJUJPOָ ֲתֻ⹛ַזְהֹךثؑحؙٔأز ˖ UIFNFךXJOEPX"DUJWJUZ5SBOTJUJPOTָ剣⸬חז׏גְ׷ "QQ$PNQBU5IFNFזו鋵ךذ٦وָ5IFNF.BUFSJBMח ז׏גְ׸ל㉏겗ז׃ ˖ *NBHF7JFXךTDBMF5ZQFְׄ׏ג׫׋ ˖ 7JFXך胜兝ח׍ׯ׿ה葿אְגְ׷

    <item name="android:windowContentTransitions">true</item>
  92. 5SBOTJUJPOָ ֲתֻ⹛ַזְהֹךثؑحؙٔأز

  93. 5SBOTJUJPOָ ֲתֻ⹛ַזְהֹךثؑحؙٔأز ˖ 3FDZDMFS7JFXך"EBQUFSךٗ٦سװ歗⫷ך铣׫鴥׿ד
 ٖ؎،ؐز׾䖉׏גַ׵5SBOTJUJPO׾Ꟛ㨣ׇׁ׋ְ

  94. 5SBOTJUJPOָ ֲתֻ⹛ַזְהֹךثؑحؙٔأز ˖ 3FDZDMFS7JFXך"EBQUFSךٗ٦سװ歗⫷ך铣׫鴥׿ד
 ٖ؎،ؐز׾䖉׏גַ׵5SBOTJUJPO׾Ꟛ㨣ׇׁ׋ְ

  95. 5SBOTJUJPOָ ֲתֻ⹛ַזְהֹךثؑحؙٔأز ˖ 3FDZDMFS7JFXך"EBQUFSךٗ٦سװ歗⫷ך铣׫鴥׿ד
 ٖ؎،ؐز׾䖉׏גַ׵5SBOTJUJPO׾Ꟛ㨣ׇׁ׋ְ ˖ "DUJWJUZ$PNQBUQPTUQPOF&OUFS5SBOTJUJPO BDUJWJUZ 
 ד5SBOTJUJPOךꟚ㨣׾䖉א

  96. 5SBOTJUJPOָ ֲתֻ⹛ַזְהֹךثؑحؙٔأز ˖ 3FDZDMFS7JFXך"EBQUFSךٗ٦سװ歗⫷ך铣׫鴥׿ד
 ٖ؎،ؐز׾䖉׏גַ׵5SBOTJUJPO׾Ꟛ㨣ׇׁ׋ְ ˖ "DUJWJUZ$PNQBUQPTUQPOF&OUFS5SBOTJUJPO BDUJWJUZ 
 ד5SBOTJUJPOךꟚ㨣׾䖉א

    ˖ "DUJWJUZ$PNQBUTUBSU1PTUQPOFE&OUFS5SBOTJUJPO BDUJWJUZ  דꟚ㨣
 7JFX5SFF0CTFSWFS0O1SF%SBX-JTUFOFSה穈׫さ׻ׇ׷
  97. 5SBOTJUJPOָ ֲתֻ⹛ַזְהֹךثؑحؙٔأز

  98. 5SBOTJUJPOָ ֲתֻ⹛ַזְהֹךثؑحؙٔأز ˖ 4IBSFE&MFNFOU5SBOTJUJPOך㜥さח7JTJCJMJUZ׾
 竰䪫׃גְזְ5SBOTJUJPOחז׏גְ׷
 'BEFؙٓأָ⹛ַזְ ✳鹈꟦䝢׿׌

  99. 5SBOTJUJPOָ ֲתֻ⹛ַזְהֹךثؑحؙٔأز ˖ 4IBSFE&MFNFOU5SBOTJUJPOך㜥さח7JTJCJMJUZ׾
 竰䪫׃גְזְ5SBOTJUJPOחז׏גְ׷
 'BEFؙٓأָ⹛ַזְ ✳鹈꟦䝢׿׌ ˖ 4IBSFדזְ8JOEPX5SBOTJUJPOך㜥さח7JTJCJMJUZַ 5SBOTJUJPO4FU׾竰䪫׃׋5SBOTJUJPOחז׏גְ׷

  100. 5SBOTJUJPOָ ֲתֻ⹛ַזְהֹךثؑحؙٔأز ˖ 4IBSFE&MFNFOU5SBOTJUJPOך㜥さח7JTJCJMJUZ׾
 竰䪫׃גְזְ5SBOTJUJPOחז׏גְ׷
 'BEFؙٓأָ⹛ַזְ ✳鹈꟦䝢׿׌ ˖ 4IBSFדזְ8JOEPX5SBOTJUJPOך㜥さח7JTJCJMJUZַ 5SBOTJUJPO4FU׾竰䪫׃׋5SBOTJUJPOחז׏גְ׷

    ˖ ̔խ⯓玎铡僇׃׋#MJOL%FCVH5SBOTJUJPOװ
 ׉ך7JTJCJMJUZ׾竰䪫׃׋غ٦آّٝך
 #MJOL7JTJCJMJUZ%FCVH5SBOTJUJPO׾⢪׏גرغحؚ׃ג׫ג ֻ׌ְׁ
  101. 5SBOTJUJPOָ ֲתֻ⹛ַזְהֹךثؑحؙٔأز ˖ 4IBSFE&MFNFOU5SBOTJUJPOך㜥さח7JTJCJMJUZ׾
 竰䪫׃גְזְ5SBOTJUJPOחז׏גְ׷
 'BEFؙٓأָ⹛ַזְ ✳鹈꟦䝢׿׌ ˖ 4IBSFדזְ8JOEPX5SBOTJUJPOך㜥さח7JTJCJMJUZַ 5SBOTJUJPO4FU׾竰䪫׃׋5SBOTJUJPOחז׏גְ׷

    ˖ ̔խ⯓玎铡僇׃׋#MJOL%FCVH5SBOTJUJPOװ
 ׉ך7JTJCJMJUZ׾竰䪫׃׋غ٦آّٝך
 #MJOL7JTJCJMJUZ%FCVH5SBOTJUJPO׾⢪׏גرغحؚ׃ג׫ג ֻ׌ְׁ 醱꧟זךדծ؟ٝفٕ،فٔד׮ ת׌㸣樴חכ⹛ְגֶ׵׆姻湫穠圓㣐㢌
  102. ؝ؚٖؔٓؿ؍ 佝㼗朐ך⿾䘔 7JFX"OJNBUJPO6UJMTDSFBUF$JSDVMBS3FWFBM ד遤ֲ 5SBOTJUJPOד⢪ֲה1BVTF儗חؙٓحءُ 0QFSBUJPO/PU4VQQPSUFE&YDFQUJPO ׅ׷ ךדծ
 /P1BVTF"OJNBUPSؙٓأזו׾⡲׏ג
 ٓحف׃גⵃ欽ׅ׷

    "1*-FWFM ࢀߟ: https://halfthought.wordpress.com/2014/11/07/reveal-transition/
  103. ؖ؎سٓ؎ٝⰻך铡僇ׅ׷鿇ⴓ ˖ وذٔ،ٕرؠ؎ٝ ˖ 넝䏝הءٍسؐ ˖ ٌ٦ءّٝ ˖ 竰竲儗꟦ה؎٦آؚٝ ˖

    麊⹛ ˖ وذٔ،ٕך㢌䕎 ˖ ؝ؚٖؔٓؿ؍ ˖ ؙٔؒ؎ذ؍ـזؕأةو؎ؤ ˖ ػة٦ٝ ˖ 歗⫷ך铣׫鴥׫ ˖ 歗꬗鼂獳
  104. ˖ ءأذي،؎؝ٝ
 אך堣腉׾䭯אֿהָ⳿勻׷ ˖ فٗتؙز،؎؝ٝ
 ،فٔ׾ⴱ׭ג饯⹛׃׋儗ח邌爙 ׅ׷،فٔ،؎؝ٝ ؙٔؒ؎ذ؍ـזؕأةو؎ؤ ،؎؝ٝ

  105. ˖ "OJNBUFE7FDUPS%SBXBCMF׾⢪ֲ倯岀 ˖ -PUUJFזוך؟٦سػ٦ذ؍ך
 ٓ؎ـٓٔ׾⢪ֲ倯岀 ؙٔؒ؎ذ؍ـזؕأةو؎ؤ 㹋鄲倯岀

  106. ،؎؝ٝך⹛ַ׃倯 "OJNBUFE7FDUPS%SBXBCMF׾⢪ֲ倯岀 ˖ "OJNBUFE7FDUPS%SBXBCMF YNM ׾⡲׏ג"OESPJEך
 فٗآؙؑزח㼪Ⰵׅ׷ ˖ "OJNBUFE7FDUPS%SBXBCMFכוֲװ׏ג⡲׷ַ
 "OESPJE*DPO"OJNBUPSֶָׅׅ׭

    IUUQTSPNBOOVSJLHJUIVCJP"OESPJE*DPO"OJNBUPS Ⱗ⡤涸ז㼪Ⰵך➬倯חאְג铡僇׃גְֹתׅ
  107.  ⹛ַ׃׋ְ47(ؿ؋؎ٕ׾ "OESPJE*DPO"OJNBUPSח
 سٓحؚ٥،ٝس٥
 سٗحفׅ׷  ،صً٦ءׇׁّٝ׷ ˟ 1BUIך㢌刿ח״׷،صً٦ ءّٝ

    1BUI.PSUI כ㼎䘔 "1*-FWFMָחז׷ךד岣 䠐ׅ׷ ،؎؝ٝך⹛ַ׃倯 "OJNBUFE7FDUPS%SBXBCMF׾彊⪒ׅ׷ "1*-FWFM ،صً٦ءّٝ倯岀כ⟃♴ח֮׶תׅ
 2JJUB،صً٦ءّٝ،؎؝ָٝ⡲׸׷
 "OESPJE*DPO"OJNBUPS׾鍗׏ג׫׷
  108. ٌآُ٦ٕךCVJMEHSBEMFד剣⸬חׅ׷ android { … defaultConfig { … vectorDrawables.useSupportLibrary true }

    ،؎؝ٝך⹛ַ׃倯 "OJNBUFE7FDUPS%SBXBCMF׾㼪Ⰵׅ׷ "1*-FWFM
  109. ؙؒأه٦ز׃ג7FDUPS%SBXBCMFؿ؋؎ٕ׾
 剅ֹ⳿ׅ SFTESBXFBCMFؿٕؓتחⰅ׸׷ ،؎؝ٝך⹛ַ׃倯 "OJNBUFE7FDUPS%SBXBCMF׾㼪Ⰵׅ׷ "1*-FWFM

  110. "QQ$PNQBU"DUJWJUZ׾ⵃ欽ׅ׷ ٖ؎،ؐزד*NBHF7JFXחBQQTSD$PNQBUד歗⫷׾䭷㹀 ،؎؝ٝך⹛ַ׃倯 "OJNBUFE7FDUPS%SBXBCMF׾㼪Ⰵׅ׷ "1*-FWFM <ImageView app:srcCompat=“@drawable/avd_menu_back_menu_to_back" … />

  111. ،؎؝ٝך⹛ַ׃倯 "OJNBUFE7FDUPS%SBXBCMF׾㼪Ⰵׅ׷ "1*-FWFM ֮הכ*NBHF7JFXַ׵%SBXBCMF׾《䖤׃ג
 TUBSU ًاحس׾ㄎן⳿׃ג֮־׸ל0, "OJNBUBCMF JNBHF7JFXHFU%SBXBCMF  TUBSU

     ؟ٝفٕⰻ$SFBUJWF$VTUPNJ[BUJPO"DUJWJUZKBWB
  112. "OJNBUFE7FDUPS%SBXBCMFךعو׶ וֿ׹ "1*-FWFM Android4.xͱAndroid5.xͱAndroid 7.xͰ
 ಈ͘ͷΛ֬ೝ͢Δ͜ͱ 
 startOffsetΛೖΕΔͱAndroid 4.xͰΞχϝʔγϣϯ
 ͠ͳ͘ͳΔͷͰɺ


    ରࡦͱͯ͠Կ΋͠ͳ͍ΞχϝʔγϣϯڬΜͰ͝·͔͢ ࢀߟ: Android Open Source Projctͷissue Ξχϝʔγϣϯͷࢦఆ͕ѱ͍ͱtargetSDK NҎ্ͩͱ Ϋϥογϡ͢ΔͷͰ஫ҙ ࢀߟ: Plaidͷissue
  113. ؖ؎سٓ؎ٝⰻך铡僇ׅ׷鿇ⴓ ˖ وذٔ،ٕرؠ؎ٝ ˖ 넝䏝הءٍسؐ ˖ ٌ٦ءّٝ ˖ 竰竲儗꟦ה؎٦آؚٝ ˖

    麊⹛ ˖ وذٔ،ٕך㢌䕎 ˖ ؝ؚٖؔٓؿ؍ ˖ ؙٔؒ؎ذ؍ـזؕأةو؎ؤ ˖ ػة٦ٝ ˖ 歗⫷ך铣׫鴥׫ ˖ 歗꬗鼂獳
  114. 歗⫷ך铣׫鴥׫ ˖ فؚٖٗحءـؿ؍٦س؎ٝ
 ַ׏ְְֿؿؑ٦س؎ٝ ˖ ⱖ溪ך植⫷Ⳣ椚⚥ךفٔٝة
 ׫׋ְחז׷ ˖ ،صً٦ءّٝך劍꟦כ歗⫷铣 ׫鴥׫ך㜥さ


    ꞿ׭חׅ׷
  115. 歗⫷ך铣׫鴥׫ "1*-FWFM *NBHF7JFXTFU$PMPS'JMUFS׾⢪ֲ $PMPS'JMUFSחכTFU4BUVSBUJPO ًاحسָ֮׷ךדծ ׉׸׾،صً٦ءّٝךؿٖ٦ي׀החㄎן⳿ׅ final ObservableColorMatrix cm =

    new ObservableColorMatrix(); ObjectAnimator saturation = ObjectAnimator.ofFloat(cm, ObservableColorMatrix.SATURATION, 0f, 1f); saturation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { imageView.setColorFilter(new ColorMatrixColorFilter(cm)); } }); 1MBJEך؝٦س״׶ ؟ٝفٕⰻ"OJNBUPS6UJMTKBWB
  116. ؖ؎سٓ؎ٝⰻך铡僇ׅ׷鿇ⴓ ˖ وذٔ،ٕرؠ؎ٝ ˖ 넝䏝הءٍسؐ ˖ ٌ٦ءّٝ ˖ 竰竲儗꟦ה؎٦آؚٝ ˖

    麊⹛ ˖ وذٔ،ٕך㢌䕎 ˖ ؝ؚٖؔٓؿ؍ ˖ ؙٔؒ؎ذ؍ـזؕأةو؎ؤ ˖ ػة٦ٝ ˖ 歗⫷ך铣׫鴥׫ ˖ 歗꬗鼂獳
  117. 歗꬗鼂獳 ˖ وذٔ،ٕرؠ؎ٝדכ넝䏝׾
 㢌ִ׷ֿהח״׏ג
 鋵銲稆ַ׵㶨銲稆חؿؓ٦ؕأך 㢌⻉׾爙ׅ ˖ وذٔ،ٌٕ٦ءّٝ刼简׾ⵃ欽 ׅ׷

  118. 歗꬗鼂獳 ˖ وذٔ،ٕرؠ؎ٝדכ넝䏝׾
 㢌ִ׷ֿהח״׏ג
 鋵銲稆ַ׵㶨銲稆חؿؓ٦ؕأך 㢌⻉׾爙ׅ ˖ وذٔ،ٌٕ٦ءّٝ刼简׾ⵃ欽 ׅ׷ 䕦ָ׌׿׌׿慬ֻז׷

  119. 歗꬗鼂獳 "1*-FWFM ˖ ؕأةي5SBOTJUJPOⰻד&MFWBUJPO׾ 0CKFDU"OJNBUPSד㢌⻉ׇׁג֮־׸ל0, @Override public Animator createAnimator(ViewGroup sceneRoot,

    TransitionValues startValues, TransitionValues endValues) { return ObjectAnimator.ofFloat(endValues.view, View.TRANSLATION_Z, initialElevation, finalElevation); } ؟ٝفٕⰻ-JGU05SBOTJUJPOKBWB 1MBJEך؝٦س״׶
  120. ؖ؎سٓ؎ٝⰻך铡僇ׅ׷鿇ⴓ Ⰻ鿇鋅׸ת׃׋ ˖ وذٔ،ٕرؠ؎ٝ ˖ 넝䏝הءٍسؐ ˖ ٌ٦ءّٝ ˖ 竰竲儗꟦ה؎٦آؚٝ

    ˖ 麊⹛ ˖ وذٔ،ٕך㢌䕎 ˖ ؝ؚٖؔٓؿ؍ ˖ ؙٔؒ؎ذ؍ـזؕأةو؎ؤ ˖ ػة٦ٝ ˖ 歗⫷ך铣׫鴥׫ ˖ 歗꬗鼂獳
  121. "OESPJE劢弫ך畭劣פך㼎䘔 ˖ "OESPJE"1*-FWFM ˖ "OESPJEךتحءُن٦سח״׷ה
 ךِ٦ؠ٦ָ"OESPJE⟃♳ ˖ 갫锃ח㟓ִגְ׷ %BUBDPMMFDUFEEVSJOHBEBZQFSJPEFOEJOHPO'FCSVBSZ 

    %BTICPBSETIUUQTEFWFMPQFSBOESPJEDPNBCPVUEBTICPBSETJOEFYIUNM 植㖈ך朐屣
  122. "OESPJE劢弫ך畭劣פך㼎䘔 ˖ "OESPJE劢弫ךِ٦ؠ٦דכ
 ،صً٦ءׇׁّٝזְ ˖ ؟٦سػ٦ذ؍ך
 ♴⡘✼䳔ٓ؎ـٓٔ׾ⵃ欽ׅ׷ ˖ "OESPJE劢弫׾镘׭׷

  123. "OESPJE劢弫׾镘׭׷ ˖ 嚊銲 ˖ NJO4EL7FSTJPOחׅ׷ ˖ "OESPJE劢弫דכ؎ٝأز٦ٕדֹזֻׅ׷ ˖ ًٔحز ˖

    㹋鄲׃װֻׅז׷ ˖ رًٔحز ˖ ׉׸ז׶חِ٦ؠ٦ָ㽿׷ 㛇劤涸ח植朐דכַז׶ꨇ׃ְ
  124. "OESPJE劢弫ךِ٦ؠ٦דכ
 ،صً٦ءׇׁّٝזְ ˖ 嚊銲 ˖ "OESPJEךغ٦آّٝח״׏גJG俑זודⴓ䀄ׇׁ׷ ˖ 4VQQPSU-JCSBSZזודדֹ׸ל׉׸׾⢪ֲ ˖ ًٔحز

    ˖ ׉׿זח㹋鄲؝أزכ넝ֻזְ ˖ رًٔحز ˖ ♧鿇ךِ٦ؠ٦דכ⡤꿀ָ殯ז׷ 㧅䔲זٓ؎ַٝ׮
  125. ؟٦سػ٦ذ؍ך ♴⡘✼䳔ٓ؎ـٓٔ׾ⵃ欽ׅ׷ ˖ 嚊銲 ˖ ؟٦سػ٦ذ؍ךٓ؎ـٓٔ׾⢪ֲ ˖ ًٔحز ˖ Ⰻגךِ٦ؠ٦ד،صً٦ءّٝ〳腉

    ˖ رًٔحز ˖ 稢ְַ⹛ָֹ殯ז׏׋׶ծزٓـٕחז׏׋׶ծ
 ׉ך㜥さח儗꟦׾《׵׸ג׃תֲֿהָ֮׷ غٓٝأ葺ֻ《׶Ⰵ׸גְֻה葺ׁ׉ֲ
  126. תה׭

  127. תה׭ ˖ ،صً٦ءّٝכꅾ銲דׅ

  128. תה׭ ˖ ،صً٦ءّٝכꅾ銲דׅ ˖ ؖ؎سٓ؎ٝה㹋鄲׾鋅גְֹת׃׋ ˖ ؟ٝفٕ،فٔך؝٦س鋅ג׫גֻ׌ְׁ

  129. תה׭ ˖ ،صً٦ءّٝכꅾ銲דׅ ˖ ؖ؎سٓ؎ٝה㹋鄲׾鋅גְֹת׃׋ ˖ ؟ٝفٕ،فٔך؝٦س鋅ג׫גֻ׌ְׁ ˖ 4IBSFE&MFNFOU5SBOTJUJPOח״׷㹋鄲ָ㢳ְדׅ ˖

    عو׶וֿ׹ָ㢳ְדָׅծثٍٖٝآ׃ג׫גֻ׌ְׁ
  130. תה׭ ˖ ،صً٦ءّٝכꅾ銲דׅ ˖ ؖ؎سٓ؎ٝה㹋鄲׾鋅גְֹת׃׋ ˖ ؟ٝفٕ،فٔך؝٦س鋅ג׫גֻ׌ְׁ ˖ 4IBSFE&MFNFOU5SBOTJUJPOח״׷㹋鄲ָ㢳ְדׅ ˖

    عو׶וֿ׹ָ㢳ְדָׅծثٍٖٝآ׃ג׫גֻ׌ְׁ ˖ "OESPJE劢弫ך㼎䘔חאְגכծ搀椚׃גⰋגך04ד
 ⹛ַׁזֻג׮葺ְַ׮׃׸תׇ׿
  131. תה׭ ˖ ،صً٦ءّٝכꅾ銲דׅ ˖ ؖ؎سٓ؎ٝה㹋鄲׾鋅גְֹת׃׋ ˖ ؟ٝفٕ،فٔך؝٦س鋅ג׫גֻ׌ְׁ ˖ 4IBSFE&MFNFOU5SBOTJUJPOח״׷㹋鄲ָ㢳ְדׅ ˖

    عو׶וֿ׹ָ㢳ְדָׅծثٍٖٝآ׃ג׫גֻ׌ְׁ ˖ "OESPJE劢弫ך㼎䘔חאְגכծ搀椚׃גⰋגך04ד
 ⹛ַׁזֻג׮葺ְַ׮׃׸תׇ׿ ˖ وذٔ،ٕرؠ؎ٝך،صً٦ءّٝכדֹתׅ
  132. תה׭ ˖ ،صً٦ءّٝכꅾ銲דׅ ˖ ؖ؎سٓ؎ٝה㹋鄲׾鋅גְֹת׃׋ ˖ ؟ٝفٕ،فٔך؝٦س鋅ג׫גֻ׌ְׁ ˖ 4IBSFE&MFNFOU5SBOTJUJPOח״׷㹋鄲ָ㢳ְדׅ ˖

    عو׶וֿ׹ָ㢳ְדָׅծثٍٖٝآ׃ג׫גֻ׌ְׁ ˖ "OESPJE劢弫ך㼎䘔חאְגכծ搀椚׃גⰋגך04ד
 ⹛ַׁזֻג׮葺ְַ׮׃׸תׇ׿ ˖ وذٔ،ٕرؠ؎ٝך،صً٦ءّٝכדֹתׅ ˖ NBUFSJBMFMFNFOU IUUQHJUJPFMFNFOU ׾(JU)VCד
 4UBS׃גֻ׌ְׁ
  133. 5IBOLT

  134. 5IBOLT ˖ %FTJHOFSTPSBTIJO
 IUUQTHJUIVCDPNTPSBTIJO

  135. 5IBOLT ˖ %FTJHOFSTPSBTIJO
 IUUQTHJUIVCDPNTPSBTIJO

  136. 5IBOLT ˖ %FTJHOFSTPSBTIJO
 IUUQTHJUIVCDPNTPSBTIJO ˖ 1MBJE
 IUUQTHJUIVCDPNOJDLCVUDIFSQMBJE

  137. 5IBOLT ˖ %FTJHOFSTPSBTIJO
 IUUQTHJUIVCDPNTPSBTIJO ˖ 1MBJE
 IUUQTHJUIVCDPNOJDLCVUDIFSQMBJE ˖ "OESPJE0QFO4PVSDF1SPKFDU
 IUUQTTPVSDFBOESPJEDPNTPVSDFMJDFOTFTIUNM

  138. 5IBOLT ˖ %FTJHOFSTPSBTIJO
 IUUQTHJUIVCDPNTPSBTIJO ˖ 1MBJE
 IUUQTHJUIVCDPNOJDLCVUDIFSQMBJE ˖ "OESPJE0QFO4PVSDF1SPKFDU
 IUUQTTPVSDFBOESPJEDPNTPVSDFMJDFOTFTIUNM

    ˖ %SPJE,BJHJPDJBM"OESPJEBQQ
 IUUQTHJUIVCDPN%SPJE,BJHJDPOGFSFODFBQQ