MotionLayout: рдПрдирд┐рдореЗрд╢рди рдмреЗрд╣рддрд░, рдХрдо рдХреЛрдб рд╣реИрдВ


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 рдЕрдкреВрд░реНрдг рд░реВрдк рд╕реЗ рд╕рдВрдХреНрд░рдордг рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЫреБрдЖ рдЬрд╛рддрд╛ рд╣реИ) рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ, рдПрдиреАрдореЗрд╢рди рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реИ, рд╕рдВрдХреНрд░рдордг рдХреЗ рджреМрд░рд╛рди рдЧреБрдг рдмрджрд▓ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдмрд╣реБрдд рдХреБрдЫред рдпрд╣ рдЯреВрд▓ рдореВрд▓ рд░реВрдк рд╕реЗ рдпреВрдЖрдИ рд▓реЙрдЬрд┐рдХ рдХреЛ рд╕рд░рд▓ рдХрд░рддреЗ рд╣реБрдП, рд╕рдм рдХреБрдЫ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред

рдХрд╛рдо рдХрд░рдиреЗ рд▓рд╛рдпрдХ рдХреБрдЫ рдФрд░ рдЪреАрдЬреЗрдВ рд╣реИрдВ (рдЬреНрдпрд╛рджрд╛рддрд░ рд░рд┐рд╕рд╛рдЗрдХрд▓рд░ рд╡реНрдпреВ рдореЗрдВ рдПрдирд┐рдореЗрд╢рди рдФрд░ рдмрд┐рдбрд╛рдпрд░реЗрдмрд▓ рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛), рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рд╕реЙрд▓реНрд╡ рд╣реИред

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

рдкреБрдирд╢реНрдЪ: рдФрд░ рдЪреВрдВрдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдореБрдЭреЗ рдПрдХ рдЕрдиреБрд╡рд╛рджрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдордВрдЬрд┐рд▓ рджреА рд╣реИ, рд╣рдорд╛рд░реА рдПрдВрдбреНрд░реЙрдЗрдб рдЯреАрдо рдореЗрдВ рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рд╣реИ ред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

Source: https://habr.com/ru/post/hi458854/


All Articles