Google рдирдП рдХрд╛рдо рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдПрдкреАрдЖрдИ рдЬрд╛рд░реА рдХрд░рдХреЗ рд╣рдорд╛рд░реЗ рдЬреАрд╡рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИред рдЬрд┐рд╕рдХреЗ рдмреАрдЪ рдирдпрд╛ рдореЛрд╢рдирд▓реЗрдЖрдЙрдЯ рдерд╛ред рд╣рдорд╛рд░реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдПрдирд┐рдореЗрд╢рди рдХреА рдкреНрд░рдЪреБрд░рддрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореЗрд░реЗ рд╕рд╣рдпреЛрдЧреА рд╕реЗрдбреНрд░рд┐рдХ рд╣реЛрд▓реНрдЯреНрдЬрд╝ рдиреЗ рддреБрд░рдВрдд рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдПрдиреАрдореЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ - рдбреЗрдЯрд┐рдВрдЧ рдореЗрдВ рдорддрджрд╛рди - рдирдП рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдХреЛрдб рдХреА рдПрдХ рдмрдбрд╝реА рд░рд╛рд╢рд┐ рдХреА рдмрдЪрдд рдХрд░рддреЗ рд╣реБрдПред рдореИрдВ рдЙрдирдХреЗ рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реВрдВредGoogle I / O 2019 рд╕рдореНрдореЗрд▓рди рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реБрдЖ, рдЬрд┐рд╕ рдкрд░ рдЕрдкрдбреЗрдЯ рдФрд░ рд╣рдорд╛рд░реЗ рдкреНрдпрд╛рд░реЗ рдПрд╕рдбреАрдХреЗ рдореЗрдВ рдирд╡реАрдирддрдо рд╕реБрдзрд╛рд░реЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХреА рдЧрдИред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд╛рдВрд╕реНрдЯреНрд░реЗрдирд▓ рд▓рдпрдЖрдЙрдЯ рдХреА рднрд╡рд┐рд╖реНрдп рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рдХреЛрд▓рд╕ рд░реЛрдб рдФрд░ рдЬреЙрди рд╣реЙрдлрд░реНрдб рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддреБрддрд┐ рдореЗрдВ рд░реБрдЪрд┐ рдереАред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореЛрд╢рди рд▓рдпрдЖрдЙрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред
рдмреАрдЯрд╛ рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдбреЗрдЯрд┐рдВрдЧ рдПрдиреАрдореЗрд╢рди рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред
рдкрд╣рд▓реЗ, рд╢рд░реНрддреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
"рдореЛрд╢рди рд▓реЕрдЯрдЖрдЙрдЯ рдПрдХ рдХрд╛рдВрд╕реНрдЯреАрдЯрдпрд╝реВрдирд▓рдЖрдЙрдЯ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рдмреАрдЪ рд▓реЗрдЖрдЙрдЯ рдХреЛ рдПрдирд┐рдореЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред" - рдкреНрд░рд▓реЗрдЦрди
рдпрджрд┐ рдЖрдкрдиреЗ рдирд┐рдХреЛрд▓рд╕ рд░реЛрдб
рдХреЗ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ
рд╢реНрд░реГрдВрдЦрд▓рд╛ рдирд╣реАрдВ рдкрдврд╝реА рд╣реИ, рдЬреЛ рдореЛрд╢рди рд▓рдпрдЖрдЙрдЯ рдХреЗ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдкрдврд╝рдиреЗ рдХреА рдЕрддреНрдпрдзрд┐рдХ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред
рдЗрд╕рд▓рд┐рдП, рдХрд┐рдП рдЧрдП рдкрд░рд┐рдЪрдп рдХреЗ рд╕рд╛рде, рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

рдХрд╛рд░реНрдб рдХрд╛ рдвреЗрд░
рд╣рдо рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирдХреНрд╢рд╛ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ
рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, MotionLayout рдХреЛ рд▓реЗрдЖрдЙрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдЕрдм рддрдХ рдХреЗрд╡рд▓ рдПрдХ рд╢реАрд░реНрд╖ рдХрд╛рд░реНрдб рд╣реИ:
<androidx.constraintlayout.motion.widget.MotionLayout android:id="@+id/motionLayout" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" app:layoutDescription="@xml/scene_swipe" app:motionDebug="SHOW_ALL"> <FrameLayout android:id="@+id/topCard" android:layout_width="0dp" android:layout_height="0dp" /> </androidx.constraintlayout.motion.widget.MotionLayout>
рдЗрд╕ рд▓рд╛рдЗрди рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ: рдРрдк: рдореЛрд╢рдирдбреЗрдм = "SHOW_ALL"ред рдпрд╣ рд╣рдореЗрдВ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА, рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкреНрд░рдХреНрд╖реЗрдкрд╡рдХреНрд░, рдПрдиреАрдореЗрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд рдХреЗ рд╕рд╛рде рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рд╡рд░реНрддрдорд╛рди рдкреНрд░рдЧрддрд┐ рднреАред рдбрд┐рдмрдЧрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп рд▓рд╛рдЗрди рдмрд╣реБрдд рдорджрдж рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдареЗрд╕ рднреЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рд╣рдЯрд╛рдирд╛ рди рднреВрд▓реЗрдВ: рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдиреБрд╕реНрдорд╛рд░рдХ рдирд╣реАрдВ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдордиреЗ рдпрд╣рд╛рдВ рдХреЗ рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдЙрд╕ рджреГрд╢реНрдп (рдореЛрд╢рдирд╕реЗрди) рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕реЗ рдЕрдм рд╣рдо рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдЖрдЗрдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВ: рдПрдХ рдХрд╛рд░реНрдб рд╕реНрдХреНрд░реАрди рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЪрд╛рд░реЛрдВ рдУрд░ рдЗрдВрдбреЗрдВрдЯ рд╣реЛрддреЗ рд╣реИрдВред
<MotionScene xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <ConstraintSet android:id="@+id/rest"> <Constraint android:id="@id/topCard" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="50dp" android:layout_marginEnd="50dp" android:layout_marginStart="50dp" android:layout_marginTop="50dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"> </ConstraintSet> </MotionScene>
рдмрд╛рдзрд╛ рд╕реЗрдЯ (ConstraintSet) рдкрд╛рд╕ рдФрд░ рдкрд╕рдВрдж рдЬреЛрдбрд╝реЗрдВред рд╡реЗ рд╢реАрд░реНрд╖ рдХрд╛рд░реНрдб рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬрдм рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрд╛рдПрдВ рдпрд╛ рджрд╛рдПрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рд╕реБрдВрджрд░ рдПрдиреАрдореЗрд╢рди рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░реАрди рд╕реЗ рдЧрд╛рдпрдм рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдирдХреНрд╢рд╛ рдмрдВрдж рд╣реЛ рдЬрд╛рдП рдЬреЛ рд╣рдорд╛рд░реЗ рдлреИрд╕рд▓реЗ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИред
<ConstraintSet android:id="@+id/pass" app:deriveConstraintsFrom="@+id/rest"> <Constraint android:id="@id/topCard" android:layout_width="0dp" android:layout_height="match_parent" android:layout_marginBottom="80dp" android:layout_marginEnd="200dp" android:layout_marginStart="50dp" android:layout_marginTop="20dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintWidth_percent="0.7" /> </ConstraintSet> <ConstraintSet android:id="@+id/like" app:deriveConstraintsFrom="@id/rest"> <Constraint android:id="@id/topCard" android:layout_width="0dp" android:layout_height="match_parent" android:layout_marginBottom="80dp" android:layout_marginEnd="50dp" android:layout_marginStart="200dp" android:layout_marginTop="20dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintWidth_percent="0.7" /> </ConstraintSet>
рдкрд┐рдЫрд▓реЗ рджреГрд╢реНрдп рдореЗрдВ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рджреЛрдиреЛрдВ рд╕реЗрдЯреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВред рд╡реЗ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИрдВ, рдХреЗрд╡рд▓ рд╕реНрдХреНрд░реАрди рдХреЗ рджреЛрдиреЛрдВ рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рддред
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рддреАрди рд╕реЗрдЯ рд╣реИрдВ - рд╢реБрд░реВ, рдкрд╕рдВрдж рдФрд░ рдкрд╛рд╕ред рдЖрдЗрдП рдЗрди рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рдмреАрдЪ рдХреЗ рд╕рдВрдХреНрд░рдордг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрд╡рд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдмрд╛рдИрдВ рдУрд░ рдПрдХ рд╕рдВрдХреНрд░рдордг рдЬреЛрдбрд╝реЗрдВ, рд╕реНрд╡рд╛рдЗрдк рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ рджрд╛рдИрдВ рдУрд░ред
<Transition app:constraintSetEnd="@+id/pass" app:constraintSetStart="@+id/rest" app:duration="300"> <OnSwipe app:dragDirection="dragLeft" app:onTouchUp="autoComplete" app:touchAnchorId="@id/topCard" app:touchAnchorSide="left" app:touchRegionId="@id/topCard" /> </Transition> <Transition app:constraintSetEnd="@+id/like" app:constraintSetStart="@+id/rest" app:duration="300"> <OnSwipe app:dragDirection="dragRight" app:onTouchUp="autoComplete" app:touchAnchorId="@+id/topCard" app:touchAnchorSide="right" app:touchRegionId="@id/topCard" /> </Transition>
рддреЛ, рд╢реАрд░реНрд╖ рдХрд╛рд░реНрдб рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд╛рдИрдВ рдУрд░ рд╕реНрд╡рд╛рдЗрдк рдПрдиреАрдореЗрд╢рди рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣реА - рджрд╛рдИрдВ рдУрд░ рд╕реНрд╡рд╛рдЗрдк рдХреЗ рд▓рд┐рдП рджрд░реНрдкрдгред
рдпреЗ рдЧреБрдг рд╣рдорд╛рд░реЗ рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗ:
- touchRegionId: рдЪреВрдБрдХрд┐ рд╣рдордиреЗ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдкреИрдбрд┐рдВрдЧ рдЬреЛрдбрд╝реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдкрд░реНрд╢ рдХреЗрд╡рд▓ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╣реА рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рди рдХрд┐ рдкреВрд░рд╛ рдореЛрд╢рди рд▓рдпрдЖрдЙрдЯред рдпрд╣ touchRegionId рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
- onTouchUp: рдХрд╛рд░реНрдб рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдПрдиреАрдореЗрд╢рди рдХрд╛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдЗрд╕реЗ рдпрд╛ рддреЛ рдЕрдкрдиреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рд╡рд╛рдкрд╕ рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рд╕реНрд╡рдд: рдкреВрд░реНрдгрддрд╛ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИред
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХреНрдпрд╛ рд╣реБрдЖ:

рдорд╛рдирдЪрд┐рддреНрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдХреНрд░реАрди рд╕реЗ рдмрд╛рд╣рд░ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ
рдЕрдм рд╣рдо рдПрдиреАрдореЗрд╢рди рдкрд░ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдХрд┐ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд╕реНрдХреНрд░реАрди рд╕реЗ рдмрд╛рд╣рд░ рдЬрд╛рдиреЗ рдкрд░ рд╢реБрд░реВ рд╣реЛрдЧрд╛ред
рд╣рдо рдЕрдкрдиреЗ рдПрдирд┐рдореЗрд╢рди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рджреЛ рдФрд░ рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдиреНрд╕рд╕реЗрдЯ рд╕реЗрдЯ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ: рдореИрдк рд╕реНрдХреНрд░реАрди рдХреЛ рдмрд╛рдПрдБ рдФрд░ рджрд╛рдПрдБ рдЫреЛрдбрд╝рддрд╛ рд╣реИред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХрд┐рд╕ рддрд░рд╣ рд░рд╛рдЬреНрдп рдмрдирд╛рдирд╛ рд╣реИ, рдФрд░ рдкрд╛рд╕ рдХреА рд╕реНрдерд┐рддрд┐ рдЗрд╕реЗ рджреЛрд╣рд░рд╛рдПрдЧреАред рдПрдХ рдХрд╛рдо рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдкреВрд░реА рддрд░рд╣ рд╕реЗ
рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред
<ConstraintSet android:id="@+id/offScreenLike"> <Constraint android:id="@id/topCard" android:layout_width="0dp" android:layout_height="match_parent" android:layout_marginBottom="80dp" android:layout_marginEnd="50dp" android:layout_marginTop="20dp" app:layout_constraintStart_toEndOf="parent" app:layout_constraintWidth_percent="0.7" /> </ConstraintSet>
рдЕрдм, рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдкрдХреЛ рд╕реНрд╡рд╛рдЗрдк рд╕реНрдЯреЗрдЯ рд╕реЗ рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЯреНрд░рд╛рдВрд╕реНрдлрд╝реЙрд░реНрдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕реНрд╡рд╛рдЗрдк рдХреЗ рдПрдиреАрдореЗрд╢рди рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╕рдВрдХреНрд░рдордг рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдСрдЯреЛрдЯреНрд░рд╛рдВрд╕рд┐рд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
<Transition app:autoTransition="animateToEnd" app:constraintSetEnd="@+id/offScreenLike" app:constraintSetStart="@+id/like" app:duration="150" />
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реНрд╡рд╛рдЗрдк рдХрд╛рд░реНрдб рд╣реИ рдЬрд┐рд╕реЗ рд╕реНрдХреНрд░реАрди рд╕реЗ рд╕реНрд╡рд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ!

рдирд┐рдЪрд▓рд╛ рдирдХреНрд╢рд╛ рдПрдиреАрдореЗрд╢рди
рдЕрдм рдбреЗрдХ рдХреЗ рдЕрдирдВрдд рдХрд╛ рднреНрд░рдо рдкреИрджрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдХрд╛рд░реНрдб рдмрдирд╛рддреЗ рд╣реИрдВред
рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рдкрд╣рд▓реЗ рдХреЗ рд╕рдорд╛рди рдПрдХ рдФрд░ рдорд╛рдирдЪрд┐рддреНрд░ рдЬреЛрдбрд╝реЗрдВ:
<FrameLayout android:id="@+id/bottomCard" android:layout_width="0dp" android:layout_height="0dp" android:background="@color/colorAccent" />
рдПрдиреАрдореЗрд╢рди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдореЗрдВ рдЗрд╕ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рд▓рд╛рдЧреВ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП XML рдмрджрд▓реЗрдВ:
<ConstraintSet android:id="@id/rest"> <!-- ... --> <Constraint android:id="@id/bottomCard"> <Layout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="50dp" android:layout_marginEnd="50dp" android:layout_marginStart="50dp" android:layout_marginTop="50dp" /> <Transform android:scaleX="0.90" android:scaleY="0.90" /> </Constraint> </ConstraintSet> <ConstraintSet android:id="@+id/offScreenLike" app:deriveConstraintsFrom="@id/like"> <!-- ... --> <Constraint android:id="@id/bottomCard"> <Transform android:scaleX="1" android:scaleY="1" /> </Constraint> </ConstraintSet>
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ ConstraintSet рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдкреНрд░рддреНрдпреЗрдХ рдирдпрд╛ рд╕реЗрдЯ рдореВрд▓ MotionLayout рд╕реЗ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд▓реЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди deriveConstraintsFrom рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рд╣рдорд╛рд░реЗ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрджрд┐ рд╣рдо рдмрд╛рдзрд╛ рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдореВрд▓ рдмрд╛рдзрд╛рдУрдВ рд╕реЗ рд╕рднреА рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк
рдЯреИрдЧ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдХреЗрд╡рд▓ рдЙрдиреНрд╣реЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПред

рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкрд╛рд╕ рд╕реЗрдЯ рдореЗрдВ рд╣рдо рд▓реЗрдЖрдЙрдЯ рдЯреИрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╕реЗ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо рдЯреИрдЧ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЕрдкрдиреЗ рд╕рд╛рде рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреИрдорд╛рдиреЗ рдореЗрдВ рдмрджрд▓рд╛рд╡ред
рдпрд╣ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдирдП рддрддреНрд╡ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП MotionLayout рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рджреГрд╢реНрдп рдХреЗ рдПрдирд┐рдореЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рдирд╛ рд╣реИред

рдПрдиреАрдореЗрд╢рди рдХреЛ рдЕрдВрддрд╣реАрди рдмрдирд╛рдирд╛
рдПрдиреАрдореЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╢реАрд░реНрд╖ рдХрд╛рд░реНрдб рдХреЛ рд╕реНрд╡рд╛рдЗрдк рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рдпрд╣ рдПрдХ рдирд┐рдЪрд▓рд╛ рдХрд╛рд░реНрдб рдмрди рдЧрдпрд╛ рд╣реИред рдЕрдВрддрд╣реАрди рдПрдиреАрдореЗрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрд╛рд░реНрдб рд╕реНрд╡реИрдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдкрд╣рд▓реЗ рдореИрдВ рдПрдХ рдирдП рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛:
<Transition app:autoTransition="jumpToEnd" app:constraintSetEnd="@+id/rest" app:constraintSetStart="@+id/offScreenLike" app:duration="0" />

рдкреВрд░рд╛ рдПрдирд┐рдореЗрд╢рди рд╡реИрд╕рд╛ рд╣реА рдЪрд▓рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдЙрд╕реЗ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд╛рд░реНрдб рдХрд╛ рдПрдХ рдвреЗрд░ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдЕрдВрддрд╣реАрди рд░реВрдк рд╕реЗ рд╕реНрд╡рд╛рдЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!
рдереЛрдбрд╝рд╛ рд╕реНрд╡рд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдХреБрдЫ рджреЗрдЦрд╛ред рдХрд╛рд░реНрдб рдХреЛ рдЫреВрдиреЗ рдкрд░ рдбреЗрдХ рдПрдиреАрдореЗрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕рдВрдХреНрд░рдордг рд░реБрдХ рдЬрд╛рддрд╛ рд╣реИред рдПрдирд┐рдореЗрд╢рди рдХреА рдЕрд╡рдзрд┐ рд╢реВрдиреНрдп рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдпрд╣ рдЕрднреА рднреА рд░реБрдХрддрд╛ рд╣реИ, рдЬреЛ рдЦрд░рд╛рдм рд╣реИред

рдореИрдВ рдХреЗрд╡рд▓ рдПрдХ рддрд░рд╣ рд╕реЗ рдЬреАрддрдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ - рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ MotionLayout рдореЗрдВ рд╕рдХреНрд░рд┐рдп рд╕рдВрдХреНрд░рдордг рдХреЛ рдмрджрд▓рдХрд░ред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдиреАрдореЗрд╢рди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдПрдХ рдХреЙрд▓рдмреИрдХ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗред рдЬреИрд╕реЗ рд╣реА рдСрдлрд╕реНрдХреНрд░реАрдирд▓рд╛рдЗрдХ рдФрд░ рдСрдлрд╕реНрдХреНрд░реАрдирд╕реНрдХреНрд░реАрди рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдо рдмрд╕ рдлрд┐рд░ рд╕реЗ рдмрд╛рдХреА рд░рд╛рдЬреНрдп рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рдЧрддрд┐ рдХреЛ рд╢реВрдиреНрдп рдХрд░ рджреЗрддреЗ рд╣реИрдВред
motionLayout.setTransitionListener(object : TransitionAdapter() { override fun onTransitionCompleted(motionLayout: MotionLayout, currentId: Int) { when (currentId) { R.id.offScreenPass, R.id.offScreenLike -> { motionLayout.progress = 0f motionLayout.setTransition(R.id.rest, R.id.like) } } } })
рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рд╣рдо рдХрд┐рд╕ рд╕рдВрдХреНрд░рдордг рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рдЬрдм рд╣рдо рд╕реНрд╡рд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдЗрдЪреНрдЫрд┐рдд рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣ рд╕рдорд╛рди рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдиреАрдореЗрд╢рди рдмрдВрдж рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ! рдЪрд▓реЛ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ!
рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ
рдирдХреНрд╢реЗ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдмрдирд╛рдПрдВред рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдб рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛ рд░рдВрдЧ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рд╕реАрдорд┐рдд рдХрд░реЗрдВрдЧреЗред
рд╣рдо рдПрдХ svMp-Method рдХреЗ рд╕рд╛рде рдПрдХ ViewModel рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рдирдП рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ рдмрд╛рдВрдзреЗрдВ:
val viewModel = ViewModelProviders .of(this) .get(SwipeRightViewModel::class.java) viewModel .modelStream .observe(this, Observer { bindCard(it) }) motionLayout.setTransitionListener(object : TransitionAdapter() { override fun onTransitionCompleted(motionLayout: MotionLayout, currentId: Int) { when (currentId) { R.id.offScreenPass, R.id.offScreenLike -> { motionLayout.progress = 0f motionLayout.setTransition(R.id.rest, R.id.like) viewModel.swipe() } } } })
рдпрд╣ рд╕реНрд╡рд╛рдЗрдк рдПрдиреАрдореЗрд╢рди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ ViewModel рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ, рдФрд░ рдпрд╣ рдЙрд╕ рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдЧрд╛ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реИред

рдкреЙрдкрдЕрдк рдЖрдЗрдХрди
рджреЛ рджреГрд╢реНрдп рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рдЬрдм рд╕реНрдХреНрд░реАрди рдХреЗ рдПрдХ рддрд░рдл рд╕реНрд╡рд╛рдЗрдк рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ (рдХреЗрд╡рд▓ рдПрдХ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рджреВрд╕рд░рд╛ рдорд┐рд░рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред
<ImageView android:id="@+id/likeIndicator" android:layout_width="0dp" android:layout_height="0dp" />
рдЕрдм рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрди рджреГрд╢реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдиреАрдореЗрд╢рди рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
<ConstraintSet android:id="@id/rest"> <!-- ... --> <Constraint android:id="@+id/like"> <Layout android:layout_width="40dp" android:layout_height="40dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Transform android:scaleX="0.5" android:scaleY="0.5" /> <PropertySet android:alpha="0" /> </Constraint> </ConstraintSet> <ConstraintSet android:id="@+id/like" app:deriveConstraintsFrom="@id/rest"> <!-- ... --> <Constraint android:id="@+id/like"> <Layout android:layout_width="100dp" android:layout_height="100dp" app:layout_constraintBottom_toBottomOf="@id/topCard" app:layout_constraintEnd_toEndOf="@id/topCard" app:layout_constraintStart_toStartOf="@id/topCard" app:layout_constraintTop_toTopOf="@id/topCard" /> <Transform android:scaleX="1" android:scaleY="1" /> <PropertySet android:alpha="1" /> </Constraint> </ConstraintSet>
рд╕реНрдХреНрд░реАрди рд╕реЗ рдкрд░реЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдПрдирд┐рдореЗрд╢рди рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ рд╣реИрдВред рдФрд░ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╕реНрд╡рд╛рдЗрдк рдХреА рд╕реНрдерд┐рддрд┐ рд╣реИред
рд╣рдореЗрдВ рдмрд╕ рдЗрддрдирд╛ рд╣реА рдХрд░рдирд╛ рд╣реИред рдЕрдм рдЖрдк рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдиреАрдореЗрд╢рди рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдШрдЯрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдПрдирд┐рдореЗрд╢рди рд╕реЗ рдЪрд▓рд╛рдПрдВ
рд╣рдо рдХрд╛рд░реНрдб рдкрд░ рджреЛ рдмрдЯрди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рди рдХреЗрд╡рд▓ рд╕реНрд╡рд╛рдЗрдк рдХрд░ рд╕рдХреЗ, рдмрд▓реНрдХрд┐ рдмрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдХрд░ рд╕рдХреЗред
рдкреНрд░рддреНрдпреЗрдХ рдмрдЯрди рд╕реНрд╡рд╛рдЗрдк рдХреЗ рд╕рдорд╛рди рдПрдиреАрдореЗрд╢рди рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред
рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдмрдЯрди рдХреНрд▓рд┐рдХ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВ рдФрд░ рд╕реАрдзреЗ MotionLayout рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдПрдиреАрдореЗрд╢рди рд╢реБрд░реВ рдХрд░реЗрдВ:
likeButton.setOnClickListener { motionLayout.transitionToState(R.id.like) } passButton.setOnClickListener { motionLayout.transitionToState(R.id.pass) }
рд╣рдореЗрдВ рдКрдкрд░ рдФрд░ рдиреАрдЪреЗ рджреЛрдиреЛрдВ рдХрд╛рд░реНрдб рдХреЗ рд▓рд┐рдП рдмрдЯрди рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдПрдиреАрдореЗрд╢рди рд▓рдЧрд╛рддрд╛рд░ рдЦреЗрд▓рддрд╛ рд░рд╣реЗред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдирд┐рдЪрд▓реЗ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд▓рд┐рдП, рдХреНрд▓рд┐рдХ рд╕рджрд╕реНрдпрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдпрд╛ рддреЛ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдпрд╛ рдКрдкрд░реА рдирдХреНрд╢рд╛ рдПрдирд┐рдореЗрдЯреЗрдб рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕реЗ рдмрд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

MotionLayout рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдПрдХ рдФрд░ рд╢рд╛рдирджрд╛рд░ рдЙрджрд╛рд╣рд░рдгред рдЖрдЗрдП рдПрдиреАрдореЗрд╢рди рдХреЛ рдереЛрдбрд╝рд╛ рдзреАрдорд╛ рдХрд░реЗрдВ:

рдореЛрд╢рди рд▓рд╛рдЗрдПрдЯ рдХреЗ рдмрджрд▓реЗ рд╣реБрдП рдмрджрд▓рд╛рд╡ рдХреЛ рджреЗрдЦреЗрдВред рдЬрд╛рджреВ!
рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рд╡рдХреНрд░ рдХреЗ рд╕рд╛рде рд╕реНрд╡рд╛рдЗрдк рдХрд░реЗрдВ
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ рдпрджрд┐ рдорд╛рдирдЪрд┐рддреНрд░ рдПрдХ рд╕реАрдзреА рд░реЗрдЦрд╛ рдореЗрдВ рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╡рдХреНрд░ (рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдмрд╕ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛)ред
рдлрд┐рд░ рдЖрдкрдХреЛ рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдЖрдВрджреЛрд▓рди рдХреЗ рд▓рд┐рдП KeyPosition рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЖрдВрджреЛрд▓рди рдХрд╛ рдорд╛рд░реНрдЧ рдПрдХ рдЪрд╛рдк рджреНрд╡рд╛рд░рд╛ рдШреБрдорд╛рд╡рджрд╛рд░ рд╣реЛред
рдЗрд╕реЗ рдореЛрд╢рди рд╕реАрди рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
<Transition app:constraintSetEnd="@+id/like" app:constraintSetStart="@+id/rest" app:duration="300"> <!-- ... --> <KeyFrameSet> <KeyPosition app:drawPath="path" app:framePosition="50" app:keyPositionType="pathRelative" app:motionTarget="@id/topCard" app:percentX="0.5" app:percentY="-0.1" /> </KeyFrameSet> </Transition>

рдЕрдм рдирдХреНрд╢рд╛ рдПрдХ рдЧреИрд░-рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдШреБрдорд╛рд╡рджрд╛рд░ рд░рд╛рд╕реНрддреЗ рдкрд░ рдЪрд▓рддрд╛ рд╣реИред рдЬрд╛рджреБрдИ!
рдирд┐рд╖реНрдХрд░реНрд╖
рдЬрдм рдЖрдк рдЙрддреНрдкрд╛рджрди рдореЗрдВ рд╕рдорд╛рди рдПрдирд┐рдореЗрд╢рди рдХреЗ рд╣рдорд╛рд░реЗ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдЗрди рдПрдирд┐рдореЗрд╢рди рдХреЛ рдмрдирд╛рддреЗ рд╕рдордп рдореБрдЭреЗ рдорд┐рд▓реА рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкрд░рд┐рдгрд╛рдо рдЪреМрдВрдХрд╛ рджреЗрдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрддрд╛ рд╣реИред
MotionLayout рдЕрдкреВрд░реНрдг рд░реВрдк рд╕реЗ рд╕рдВрдХреНрд░рдордг рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЫреБрдЖ рдЬрд╛рддрд╛ рд╣реИ) рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ, рдПрдиреАрдореЗрд╢рди рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реИ, рд╕рдВрдХреНрд░рдордг рдХреЗ рджреМрд░рд╛рди рдЧреБрдг рдмрджрд▓ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдмрд╣реБрдд рдХреБрдЫред рдпрд╣ рдЯреВрд▓ рдореВрд▓ рд░реВрдк рд╕реЗ рдпреВрдЖрдИ рд▓реЙрдЬрд┐рдХ рдХреЛ рд╕рд░рд▓ рдХрд░рддреЗ рд╣реБрдП, рд╕рдм рдХреБрдЫ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред
рдХрд╛рдо рдХрд░рдиреЗ рд▓рд╛рдпрдХ рдХреБрдЫ рдФрд░ рдЪреАрдЬреЗрдВ рд╣реИрдВ (рдЬреНрдпрд╛рджрд╛рддрд░ рд░рд┐рд╕рд╛рдЗрдХрд▓рд░ рд╡реНрдпреВ рдореЗрдВ рдПрдирд┐рдореЗрд╢рди рдФрд░ рдмрд┐рдбрд╛рдпрд░реЗрдмрд▓ рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛), рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рд╕реЙрд▓реНрд╡ рд╣реИред
рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЕрднреА рднреА рдмреАрдЯрд╛ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрдИ рд░реЛрдорд╛рдВрдЪрдХ рдЕрд╡рд╕рд░ рдЦреЛрд▓рддреА рд╣реИред рд╣рдо рдореЛрд╢рди рд▓рдпрдЖрдЙрдЯ рдХреА рд░рд┐рд▓реАрдЬрд╝ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдХрд╛рдо рдЖрдПрдЧрд╛ред рдЖрдк рдЗрд╕ рд▓реЗрдЦ рдХреЗ
рднрдВрдбрд╛рд░ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рдЖрд╡реЗрджрди рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдкреБрдирд╢реНрдЪ: рдФрд░ рдЪреВрдВрдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдореБрдЭреЗ рдПрдХ рдЕрдиреБрд╡рд╛рджрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдордВрдЬрд┐рд▓ рджреА рд╣реИ, рд╣рдорд╛рд░реА рдПрдВрдбреНрд░реЙрдЗрдб рдЯреАрдо рдореЗрдВ рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рд╣реИ ред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред