Google IO 2019 рдкрд░ Android Jetpack Compose рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЗрд╕реЗ рддреБрд░рдВрдд рдЖрдЬрд╝рдорд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рдореЗрдВ рд▓рд╛рдЧреВ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдиреЗ рд╕реНрдкрдВрджрди рдХреЛ рдмрд╣реБрдд рдпрд╛рдж рджрд┐рд▓рд╛рдпрд╛ , рдЬрд┐рд╕рдХреА рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдкреА рдереА ред

рдХрдВрдкреЛрдЬ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реНрд╡рдпрдВ рдкреВрд░реНрд╡-рдЕрд▓реНрдлрд╛ рдЪрд░рдг рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рдФрд░ рд▓реЗрдЦ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрд╛рдж, рдореИрдВ рдХрдИ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░реВрдВрдЧрд╛, рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдЦреЛрдЬрдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛, рд╕рд╛рде рд╣реА рдУрдкрди рд╕реЛрд░реНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рднреА ред
рдпреЗ рд╕рдВрд╕рд╛рдзрди рд╣реИрдВ:
Android Jetpack Compose рдХреНрдпрд╛ рд╣реИ?
рдкрд╣рд▓реЗ, рд╕рдВрдкреВрд░реНрдг Android UI рджреГрд╢реНрдп рд╡рд░реНрдЧ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдерд╛ред Android рдХреЗ рд╢реБрд░реБрдЖрддреА рджрд┐рдиреЛрдВ рд╕реЗ рдпрд╣ рдорд╛рдорд▓рд╛ рд░рд╣рд╛ рд╣реИред рдФрд░ рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рдХрдИ рд╡рд┐рд░рд╛рд╕рдд рдФрд░ рд╡рд╛рд╕реНрддреБ рджреЛрд╖реЛрдВ рдХрд╛ рд╕рдВрдЪрдп рд╣реБрдЖ рд╣реИ, рдЬрд┐рд╕реЗ рдмреЗрд╣рддрд░ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХрд░рдирд╛ рдЙрдирдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд▓рд┐рдЦреЗ рдЧрдП рд╕рднреА рдХреЛрдб рдХреЛ рддреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдХрд╛рдлреА рдореБрд╢реНрдХрд┐рд▓ рд╣реИред
рдкрд┐рдЫрд▓реЗ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ, рдХреНрд▓рд╛рдЗрдВрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ (рдлреНрд░рдВрдЯреЗрдВрдб рдЯреНрд░реЗрдВрдбреНрд╕ рд╕рд╣рд┐рдд) рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдХрдИ рдирдИ рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ рд╕рд╛рдордиреЗ рдЖрдИ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП Google рдЯреАрдо рдиреЗ рдПрдХ рдХрдЯреНрдЯрд░рдкрдВрдереА рд░рд╛рд╕реНрддрд╛ рдЕрдкрдирд╛рдпрд╛ рд╣реИ рдФрд░ рдПрдВрдбреНрд░реЙрдЗрдб рдореЗрдВ рдкреВрд░реЗ рдпреВрдЖрдИ рд╕реНрддрд░ рдХреЛ рдЦрд░реЛрдВрдЪ рд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рд╣реИред рддреЛ рдПрдВрдбреНрд░реЙрдЗрдб рдЬреЗрдЯрдкреИрдХ рдХрдореНрдкреЛрдЬрд╝ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджрд┐рдЦрд╛рдИ рджреА, рдЬрд┐рд╕рдореЗрдВ рд░рд┐рдПрдХреНрдЯ, рд▓рд┐рдереЛ, рд╡реНрдпреВ, рдлреНрд▓рдЯрд░ рдФрд░ рдХрдИ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд╡реИрдЪрд╛рд░рд┐рдХ рдЯреНрд░рд┐рдХреНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рдЖрдЗрдП рдореМрдЬреВрджрд╛ рдпреВрдЖрдИ рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдиреЗрдВ рдФрд░ рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдХрдореНрдкреЛрдЬрд╝ рд╕реЗ рдХрд░реЗрдВред
1. Android рд░рд┐рд▓реАрдЬрд╝ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░рддрд╛
рдореМрдЬреВрджрд╛ UI рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╕реЗ рдирд┐рдХрдЯрддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдЬрдм рдордЯреАрд░рд┐рдпрд▓ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рдкрд╣рд▓реЗ рдШрдЯрдХ рджрд┐рдЦрд╛рдИ рджрд┐рдП, рддреЛ рдЙрдиреНрд╣реЛрдВрдиреЗ рдХреЗрд╡рд▓ рдПрдВрдбреНрд░реЙрдЗрдб 5 (рдПрдкреАрдЖрдИ 21) рдФрд░ рдЙрдЪреНрдЪрддрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ред рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рдорд░реНрдерди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдХрдореНрдкреЛрдЬрд╝ рдЬреЗрдЯрдкреИрдХ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдЬреЛ рдЗрд╕реЗ рд╕рд┐рд╕реНрдЯрдо рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реИ (рдХрдо рд╕реЗ рдХрдо HTML рдХреЗ рд╕рд╛рде)ред
2. рдкреВрд░реЗ рдХреЛрдЯрд▓рд┐рди рдПрдкреАрдЖрдИ
рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ UI рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдкрдбрд╝рддрд╛ рдерд╛ред рд╣рдордиреЗ xml рдореЗрдВ рдорд╛рд░реНрдХрдЕрдк рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ / рдХреЛрдЯрд▓рд┐рди рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рдлрд┐рд░ рд╣рдо рдереАрдо, рдПрдиреАрдореЗрд╢рди, рдиреЗрд╡рд┐рдЧреЗрд╢рди, рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдЕрдиреНрдп xml рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд▓реМрдЯ рдЖрдП ... рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ xml (рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ) рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рднреА рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред
рдХреЛрдЯрд▓рд┐рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдк xml рдХреЗ рдмрдЬрд╛рдп рд╕реАрдзреЗ рд╢реИрд▓реА рдпреВрдЖрдИ рдХреЛ рдХреЛрдб рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
3. рд╕рдорддреБрд▓реНрдп = рд╕рдордЧреНрд░: рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдмрдЬрд╛рдп рд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдХрд╕реНрдЯрдо UI рддрддреНрд╡ рдмрдирд╛рдирд╛ рдмреЛрдЭрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рдореЗрдВ рд╡реНрдпреВ рдпрд╛ рдЙрд╕рдХреЗ рд╡рдВрд╢рдЬ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдареАрдХ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЧреБрдгреЛрдВ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, TextView рд╡рд░реНрдЧ рдореЗрдВ рдЬрд╛рд╡рд╛ рдХреЛрдб рдХреА рд▓рдЧрднрдЧ 30 рд╣рдЬрд╛рд░ рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рд╕реНрд╡рдпрдВ рдХреЗ рднреАрддрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рддрд░реНрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рд╡рдВрд╢рдЬ рддрддреНрд╡реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ рд╣реИрдВред
рд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рд╡рд┐рд░рд╛рд╕рдд рдХреА рдЬрдЧрд╣, рджреВрд╕рд░реА рдУрд░ рдХрдореНрдкреЛрдЬрд╝ рдЖрдпрд╛ред
Padding
рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ:
рдореМрдЬреВрджрд╛ UI рдореЗрдВ, 30dp
рдкрд░ 30dp
рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
<TextView android:id="@+id/simpleTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@color/cyan" android:padding="30dp" <------------------------ NOTE THIS android:text="Drag or tap on the seek bar" />
рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ TextView.java рдпрд╛ рдЗрд╕рдХреЗ рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рдХреЗ рдЕрдВрджрд░ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рддрд░реНрдХ рд╣реИ рдЬреЛ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЗрдВрдбреЗрдВрдЯреНрд╕ рдХреЛ рдХреИрд╕реЗ рдЧрд┐рдирдирд╛ рдФрд░ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рд╣реИред
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХрдВрдкреЛрдЬрд╝ рдореЗрдВ рдЖрдк рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдкрд░рд┐рд╡рд░реНрддрди
TextView
рд╕рд┐рд░реНрдл Text()
рдмрди рдЧрдпрд╛ рд╣реИред android:padding
рдкреНрд░реЙрдкрд░реНрдЯреА рдПрдХ Padding
рдореЗрдВ рдмрджрд▓ рдЧрдИ рд╣реИ рдЬреЛ Text
рд▓рдкреЗрдЯрддрд╛ рд╣реИред
рд▓рд╛рдн
рдЗрд╕ рдкреНрд░рдХрд╛рд░, Text
рдХреЗрд╡рд▓ Text
рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рд╡рд╣ рдЗрдВрдбреЗрдВрдЯ рдЧрд┐рдирдирд╛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдкреИрдбрд┐рдВрдЧ рдХреЗрд╡рд▓ рдкреИрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рдЕрдиреНрдп рддрддреНрд╡ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
4. рдпреВрдирд┐рдбрд╛рдпрд░реЗрдХреНрд╢рдирд▓ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо
рдпрджрд┐ рд╣рдо рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдореМрдЬреВрджрд╛ рдпреВрдЖрдИ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ CheckBox
рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдпреВрдирд┐рдбрд╛рдпрд░реЗрдХреНрд╢рдирд▓ рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИред рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ CheckBox
рдкрд░ рдЯреИрдк рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЙрд╕рдХреА рд╕реНрдерд┐рддрд┐ checked = true
рд╣реЛ рдЬрд╛рддреА checked = true
: рд╡рд░реНрдЧ рджреГрд╢реНрдп рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рдХреЛрдб рд╕реЗ рдХреЙрд▓рдмреИрдХ рдХрд╣рддрд╛ рд╣реИ рдЬреЛ рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рдирдЬрд╝рд░ рд░рдЦрддрд╛ рд╣реИред
рдлрд┐рд░, рдХреЛрдб рдореЗрдВ рд╣реА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ViewModel
, рдЖрдкрдХреЛ рд╕рдВрдмрдВрдзрд┐рдд state
рдЪрд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рджрдмрд╛рдП рдЧрдП рд░рд╛рдЬреНрдп рдХреА рджреЛ рдкреНрд░рддрд┐рдпрд╛рдВ рд╣реИрдВ, рдЬреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдХрд░ рд╕рдХрддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ViewModel
рдЕрдВрджрд░ state
рдЪрд░ рдХрд╛ рдорд╛рди рдмрджрд▓рдиреЗ рд╕реЗ CheckBox
рдЕрдкрдбреЗрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдПрдХ рдЕрдВрддрд╣реАрди рд▓реВрдк рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдХреА рдмреИрд╕рд╛рдЦреА рдХреЗ рд╕рд╛рде рдЖрдирд╛ рд╣реЛрдЧрд╛ред
рдХрдореНрдкреЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ-рдмрд┐рдВрджреБ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдврд╛рдВрдЪреЗ рдХреЗ рдЕрдВрджрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛: рд╣рдо рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХреЛ рдЖрд╡рдХ рджреЗрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдВрдкреЛрдЬ рдореЗрдВ рдШрдЯрдХ рдЕрдм рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрдиреЗ рджрдо рдкрд░ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рдХреЗрд╡рд▓ рдХреЙрд▓рдмреИрдХ рдХрд╣рддрд╛ рд╣реИ, рдФрд░ рдЕрдм рдпрд╣ UI рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдХрд╛рд░реНрдп рд╣реИред
5. рдбрд┐рдмрдЧрд┐рдВрдЧ рдореЗрдВ рд╕реБрдзрд╛рд░
рдЪреВрдБрдХрд┐ рдкреВрд░рд╛ UI рдЕрдм Kotlin рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдк рдЕрдм UI рдХреЛ рдбреАрдмрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЦреБрдж рдпрд╣ рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА, рд▓реЗрдХрд┐рди рдкреЙрдбрдХрд╛рд╕реНрдЯ рдореЗрдВ рдЙрдиреНрд╣реЛрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ рдбрд┐рдмрдЧрд░ рдФрд░ рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ рдХрдВрдкреЛрдЬрд╝ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
рдкрд░реНрдпрд╛рдкреНрдд рд╢рдмреНрдж, рдХреЛрдб рджрд┐рдЦрд╛рдПрдВ
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдореИрдВ рдЬрд▓реНрджреА рд╕реЗ рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпреВрдЖрдИ рдХреЛрдб рдореЗрдВ рдХреНрдпрд╛ рджрд┐рдЦрддрд╛ рд╣реИ (рд╕реНрдкреЙрдЗрд▓рд░: рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рддреЛ рдлреНрд▓рдЯрд░ рдХреЗ рд╕рдорд╛рди)ред
рд╣рдо рдХреБрдЫ рд╕рд░рд▓ View
рдмрдирд╛рдХрд░ рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВрдЧреЗ, рдлрд┐рд░ рддреБрд▓рдирд╛ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╡реЗ рдореМрдЬреВрджрд╛ UI рдФрд░ рдХрдВрдкреЛрдЬрд╝ рдореЗрдВ рдХреИрд╕реЗ рджрд┐рдЦрддреЗ рд╣реИрдВред
1. FrameLayout
рдмрдирд╛рдо Wrap + Padding + Background
рд╣рдо рдКрдкрд░ рджрд┐рдП рдЧрдП рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ 30dp
рдХреЛ рдлрд╝рд┐рд░реЛрдЬрд╝рд╛ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд╕рд╛рде 30dp
рдкрд░ рдЗрдВрдбреЗрдВрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ:
рдореМрдЬреВрджрд╛ UI:
<TextView android:id="@+id/simpleTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@color/cyan" <-------------- NOTE THIS android:padding="30dp" <------------------------ AND THIS android:text="Drag or tap on the seek bar" />
рдЕрдм рдЙрд╕ рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ рдЬреЛ Compose рдореЗрдВ рд╕рдорд╛рди рд╣реИ:
@Composable fun MyText() { Wrap { Padding(30.dp) { DrawRectangle(color = Color.Cyan) Text("Drag or tap on the seek bar") } } }
рдпрд╣рд╛рдБ рдХреБрдЫ рдирдИ рдЪреАрдЬреЗрдВ рд╣реИрдВред рдЪреВрдВрдХрд┐ Text
рдХреЗрд╡рд▓ рдЯреЗрдХреНрд╕реНрдЯ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкреИрдбрд┐рдВрдЧ рдФрд░ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
DrawRectangle
рд╣реИPadding
рдЗрдВрдбреЗрдВрдЯWrap
рдПрдХ рдРрд╕рд╛ рдХрд╛рд░реНрдп рд╣реИ рдЬреЛ FrameLayout
рдЬреИрд╕реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкреВрд░рд╛ FrameLayout
ред
рдЖрд╕рд╛рдиреА рд╕реЗред рд▓реЗрдХрд┐рди рдпрд╣ рдореМрдЬреВрджрд╛ UI рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╣рдо рд╕рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
2. рд╡рд░реНрдЯрд┐рдХрд▓ LinearLayout
рдмрдирд╛рдо Column
рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ LinearLayout
рдмрд░рд╛рдмрд░ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред
рджреЛ рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдиреАрдЪреЗ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджреА рдЧрдИ рддрд╕реНрд╡реАрд░ рдореЗрдВ рд╣реИ, рд╣рдо Column
рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
@Composable fun FormDemo() { Column(crossAxisAlignment = CrossAxisAlignment.Start) { Text("Click the button below: ") Button(text = "Next") } }
Column
рддрддреНрд╡ рдореЗрдВ рдирд┐рд╣рд┐рдд рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдиреАрдЪреЗ рд▓рдВрдмрд╡рдд рд╕реНрдерд┐рдд рд╣реЛрдЧрд╛ред
2 рдПред рдЗрдВрдбреЗрдВрдЯ
рдЖрдкрдиреЗ рд╢рд╛рдпрдж рджреЗрдЦрд╛ рдХрд┐ рдЯреЗрдХреНрд╕реНрдЯ рдФрд░ рдмрдЯрди рдХрд┐рдирд╛рд░реЗ рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, Padding
рдЬреЛрдбрд╝реЗрдВред
@Composable fun FormDemo() { Padding(10.dp) {
рдпрд╣ рдмреЗрд╣рддрд░ рд▓рдЧ рд░рд╣рд╛ рд╣реИ:
2 рдмреАред рдЕрдВрддрд░рд╛рд▓
рд╣рдо Text
рдФрд░ Button
рдмреАрдЪ рдХреБрдЫ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
@Composable fun FormDemo() { Padding(10.dp) { Column(crossAxisAlignment = CrossAxisAlignment.Start) { Text("Click the button below: ") HeightSpacer(10.dp)
рд╣рдорд╛рд░реА рд╕реНрдХреНрд░реАрди рдЕрдм рдХреИрд╕реА рджрд┐рдЦрддреА рд╣реИ:
2cред рдХреНрд╖реИрддрд┐рдЬ LinearLayout
рдмрдирд╛рдо Row
рдкрд╣рд▓реЗ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рджреВрд╕рд░рд╛ рдмрдЯрди рд░рдЦреЗрдВ:
рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдб:
@Composable fun FormDemo() { Padding(10.dp) { Column(crossAxisAlignment = CrossAxisAlignment.Start) { Text("Click the button below: ") HeightSpacer(10.dp) Row {
Row
рдЕрдВрджрд░ Row
рджреЛ рдмрдЯрди рдХреНрд╖реИрддрд┐рдЬ рд╣реЛрдВрдЧреЗред WidthSpacer
рдЙрдирдХреЗ рдмреАрдЪ рджреВрд░реА рдЬреЛрдбрд╝рддрд╛ рд╣реИред
2 рдбреАред Gravity
рдмрдирд╛рдо Alignment
рд╣рдорд╛рд░реЗ рддрддреНрд╡реЛрдВ рдХреЛ рдХреЗрдВрджреНрд░ рдореЗрдВ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░реЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ gravity
рд╡рд░реНрддрдорд╛рди UI рдореЗрдВ рдХрд░рддрд╛ рд╣реИред рдЕрдВрддрд░ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдкреБрд░рд╛рдиреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░реВрдВрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдирдП рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдмрджрд▓реВрдВрдЧрд╛:
@Composable fun FormDemo() { Padding(10.dp) {
рд╣рдо рд╕рдлрд▓ рд╣реЛрдВрдЧреЗ:
crossAxisAlignment = CrossAxisAlignment.Center
рдиреЗрд╕реНрдЯреЗрдб рддрддреНрд╡ рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛрдВрдЧреЗред рд╣рдореЗрдВ Row
рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ mainAxisSize = FlexSize.Min
рднреА рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ mainAxisSize = FlexSize.Min
рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╣реИ, рддрд╛рдХрд┐ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ mainAxisSize = FlexSize.Max
рдХрд╛рд░рдг рд╕реНрдХреНрд░реАрди рдкрд░ рдЦрд┐рдВрдЪрд╛рд╡ рди mainAxisSize = FlexSize.Max
, рдЬреЛ mainAxisSize = FlexSize.Max
рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред
2 рдбреАред рдЯрд┐рдкреНрдкрдгреА
рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╣рдордиреЗ рдЬреЛ рджреЗрдЦрд╛, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдордЧреНрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ: padding
рдПрдХ рдЕрд▓рдЧ рдХрд╛рд░реНрдп рд╣реИ, Text
, Button
рдпрд╛ Column
рдЕрдВрджрд░ рдЧреБрдг рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп spacer
рдПрдХ рдЕрд▓рдЧ рдХрд╛рд░реНрдп рд╣реИред
рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рддрддреНрд╡ рдЬреИрд╕реЗ рдХрд┐ RecyclerView
рдпрд╛ ConstraintLayout
рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдЪрд▓ рд░рд╣рд╛ рд╣реИ: рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдбреЗрдореЛ рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдЙрдирдХреЗ рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рдорд┐рд▓рд╛ред
3. рд╢реИрд▓рд┐рдпреЛрдВ рдФрд░ рд╡рд┐рд╖рдпреЛрдВ
рдЖрдкрдиреЗ рд╢рд╛рдпрдж рджреЗрдЦрд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдП рдмрдЯрди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдмреИрдВрдЧрдиреА рд╣реИрдВред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╢реИрд▓рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХрдВрдкреЛрдЬрд╝ рдореЗрдВ рд╕реНрдЯрд╛рдЗрд▓ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, FormDemo
@Composable
рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдЯреИрдЧ рдХрд┐рдпрд╛ @Composable
ред рдЕрдм рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЗрд╕ рддрддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ Activity
рдореЗрдВ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { CraneWrapper{ MaterialTheme { FormDemo() } } } }
setContentView()
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрдЬрд╛рдп, рд╣рдо setContent()
, Compose.kt
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
CraneWrapper
рдореЗрдВ рдХрдВрдкреЛрдЬрд╝ рдЯреНрд░реА рд╣реЛрддрд╛ рд╣реИ рдФрд░ FocusManager
Density
, FocusManager
рдФрд░ FocusManager
рддрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
MaterialTheme
рдЖрдкрдХреЛ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдереАрдо рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рдереАрдо рдХреЗ рдкреНрд░рд╛рдердорд┐рдХ рд░рдВрдЧ рдХреЛ рднреВрд░реЗ рд░рдВрдЧ рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реВрдВ:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { CraneWrapper{
рдЕрдм рд╣рдорд╛рд░реА рд╕реНрдХреНрд░реАрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:
рдЕрдиреНрдп рд░рдВрдЧ рдФрд░ рдлреЛрдВрдЯ рдЬрд┐рдиреНрд╣реЗрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: MaterialTheme.kt # 57
рд░реИрд▓реА рдЧрддрд┐рд╡рд┐рдзрд┐ рдХрд┐рд╕реА рд╡рд┐рд╖рдп рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ: RallyTheme.kt рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб
рдХреНрдпрд╛ рджреЗрдЦрдирд╛ / рдкрдврд╝рдирд╛ рд╣реИ
рдпрджрд┐ рдЖрдк рдЕрдзрд┐рдХ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирдореВрдирд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред
рдЬреИрд╕рд╛ рдХрд┐ рд╡рд┐рдВрдбреЛрдЬ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЕрдм рдХрдореНрдкреЛрдЬрд╝ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдЯрд▓рд┐рдирд▓реИрдВрдЧ рд╕реНрд▓реИрдХ рд╕реЗ рдПрдХ рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рдЧрд╛рдЗрдб рд╣реИ ред
#compose
рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрди рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕реЗ рдЪреИрдирд▓ #compose
kotlinlang #compose
рдореЗрдВ рдкреВрдЫреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЕрдиреНрдп рд▓рд┐рдВрдХ рдЫреЛрдбрд╝реЗрдВ - рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдпрд╣рд╛рдВ рдЬреЛрдбрд╝реЗ рдЬрд╛рдПрдВрдЧреЗред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдЬреЛрд░реЛрдВ рдкрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рджрд┐рдЦрд╛рдП рдЧрдП рдХрд┐рд╕реА рднреА рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрднреА рднреА рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдЖрдк рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ @Model
рдФрд░ Unidirectional data flow (рдпреВрдирд┐рдбрд╛рдпрд░реЗрдХреНрд╢рдирд▓ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо)ред рд╢рд╛рдпрдж рдпрд╣ рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓реЗрдЦреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╖рдп рд╣реИред