Android рдореЗрдВ CircularRevealAnimation
рдирд╛рдордХ View рдПрдиреАрдореЗрд╢рди рдХреА рдПрдХ рдмрд╣реБрдд рд╣реА рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ - рдЬрд┐рд╕рдХрд╛ рд╢рд╛рдмреНрджрд┐рдХ рдЕрд░реНрде рд╣реИ "рдкрд░рд┐рдкрддреНрд░ рдкреНрд░рдХрдЯреАрдХрд░рдгред" рд╕реНрдкрдВрджрди, рдмрджрд▓реЗ рдореЗрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╡рд┐рдЬреЗрдЯреНрд╕ рдХреЛ рдПрдирд┐рдореЗрдЯ рдХрд░рдиреЗ рдХреА рд╕рдореГрджреНрдз рдХреНрд╖рдорддрд╛рдПрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдиреАрдореЗрд╢рди рдХреЛ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рдЖрд▓реЗрдЦ рджрд┐рдЦрд╛рдПрдЧрд╛ рдХрд┐ рдлрд╝реНрд▓рдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдиреАрдореЗрд╢рди рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдЖрд╕рд╛рди рдкрд╣реБрдВрдЪ рдФрд░ рд╡рд┐рддрд░рдг рдХреЗ рд▓рд┐рдП рдкрдм.рджреЗрд╡ рдкрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП ред
рдПрдиреАрдореЗрд╢рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рд╕реНрдкрдВрджрди рдореЗрдВ, рд╕рдм рдХреБрдЫ рдПрдХ рд╡рд┐рдЬреЗрдЯ рд╣реИред рдФрд░ рдПрдиреАрдореЗрд╢рди рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо CircularRevealAnimation
class рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ StatelessWidget
рдХреНрд▓рд╛рд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдЧреАред
рдПрдирд┐рдореЗрд╢рдирдХрдВрдЯреНрд░реЛрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢реБрд░реВ, рд░реЛрдХрдирд╛, рдФрд░ рдЕрдиреНрдп рдПрдиреАрдореЗрд╢рди рдирд┐рдпрдВрддреНрд░рдг рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдПрдХ SingleTickerProviderStateMixin
рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП AnimationController
рдЖрдкрдХреЛ StatefulWidget
рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ SingleTickerProviderStateMixin
рдХреЛ State
SingleTickerProviderStateMixin
рд╣реЛрдЧрд╛ред
рд╣рдорд╛рд░рд╛ рдПрдиреАрдореЗрд╢рди рд╡рд░реНрдЧ CircularRevealAnimation
рдЕрдкрдиреЗ рджрдо рдкрд░ рдПрдиреАрдореЗрд╢рди рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдПрдХ рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ Animation<double>
рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП StatefulWidget
рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ CircularRevealAnimation
рдХреЛ рдЕрдиреНрдп рдПрдирд┐рдореЗрд╢рди рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рдиреА рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХреЗ, рдЬреЛ рд╕рдорд╛рди AnimationController
рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдПрдиреАрдореЗрд╢рди рдХреЗ рд╕рд╛рде рдкреНрд░рдХрдЯреАрдХрд░рдг рдПрдиреАрдореЗрд╢рди рдХреЛ рдорд┐рд▓рд╛рдПрдВред
CircularRevealAnimation
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреИрд░рд╛рдореАрдЯрд░ child
, рдЬреЛ рд╣рдорд╛рд░реЗ рдПрдиреАрдореЗрд╢рди рдХрд╛ рдПрдХ рдмрдЪреНрдЪрд╛ рд╡рд┐рдЬреЗрдЯ рд╣реИ, рдФрд░ рдЬреЛ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ рдпрд╛ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕реНрдкрдВрджрди рдореЗрдВ, рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рдЧреЗрдЯреНрд╕ рдХрд╛ рдПрдХ child
рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд┐рдЬреЗрдЯ рдЖрдкрдХреЛ рдмрдЪреНрдЪреЗ рдХреЗ рд╡рд┐рдЬреЗрдЯ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░, рдкреНрд░рддрд┐рдкрд╛рджрди рдпрд╛ рд▓реЗрдЖрдЙрдЯ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдпрд╛ рдПрдиреАрдореЗрд╢рди рдЬреЛрдбрд╝реЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ CircularRevealAnimation
рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдиреАрдореЗрд╢рди рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдиреАрдореЗрд╢рди рдХреЗ рдЙрджреНрдШрд╛рдЯрди (рдпрд╛ рд╕рдорд╛рдкрди) рдХреЗ рдХреЗрдВрджреНрд░, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЙрджреНрдШрд╛рдЯрди рдХреЗ рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо рддреНрд░рд┐рдЬреНрдпрд╛ рдЬреИрд╕реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдпреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИрдВ рдФрд░ рдПрдиреАрдореЗрд╢рди рдмрдирд╛рддреЗ рд╕рдордп рдЗрд╕реЗ null
рдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛: рдкреНрд░рдХрдЯреАрдХрд░рдг рдХреЗрдВрджреНрд░ рд╡рд┐рдЬреЗрдЯ рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рд╣реЛрдЧрд╛, рдиреНрдпреВрдирддрдо рддреНрд░рд┐рдЬреНрдпрд╛ рд╢реВрдиреНрдп рд╕реЗ рдШрд╛рдпрд▓ рд╣реЛ рдЬрд╛рдПрдЧреА, рдФрд░ рдЕрдзрд┐рдХрддрдо рддреНрд░рд┐рдЬреНрдпрд╛ рдкреНрд░рдХрдЯреАрдХрд░рдг рдХреЗрдВрджреНрд░ рд╕реЗ рд╡рд┐рдЬреЗрдЯ рдХреЗ рд╢реАрд░реНрд╖ рддрдХ рджреВрд░реА рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧреА рдЬреЛ рдкреНрд░рдХрдЯреАрдХрд░рдг рдХреЗрдВрджреНрд░ рд╕реЗ рд╕рдмрд╕реЗ рджреВрд░ рд╣реИред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрдзрд┐рдХрддрдо рддреНрд░рд┐рдЬреНрдпрд╛ рдЧрдгрдирд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреНрд░рдХрдЯреАрдХрд░рдг рдХреЗрдВрджреНрд░ рд╕реЗ рдХреЗрдВрджреНрд░ рд╕реЗ рд╢рд┐рдЦрд░ рддрдХ рдХреНрд╖реИрддрд┐рдЬ рдФрд░ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдлрд┐рд░ рд╡рд┐рдХрд░реНрдг рдХреА рдЧрдгрдирд╛ рдкрд╛рдпрдерд╛рдЧреЙрд░рд┐рдпрди рдкреНрд░рдореЗрдп рджреНрд╡рд╛рд░рд╛ рдХреА рдЬрд╛рддреА рд╣реИред
static double calcMaxRadius(Size size, Offset center) { final w = max(center.dx, size.width - center.dx); final h = max(center.dy, size.height - center.dy); return sqrt(w * w + h * h); }
рдЕрдм рдЖрдкрдХреЛ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рд╕рд░реНрдХрд▓ рдХреЗ рднреАрддрд░ рд╡рд┐рдЬреЗрдЯ рдХреА рдХреНрд░реЙрдкрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред ClipPath
рд╡рд░реНрдЧ рдЗрд╕рдореЗрдВ рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧрд╛, рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рдордирдорд╛рдиреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡рд┐рдЬреЗрдЯ рдХреЛ рдХреНрд░реЙрдк рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕ рд╡рд┐рдЬреЗрдЯ рдХреЛ clipper
(рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдмрд╛рдж рдореЗрдВ) рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ child
рдмрдЪреНрдЪрд╛ рд╡рд┐рдЬреЗрдЯ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХреНрд░реЙрдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
ClipPath
рд╡рд┐рдЬреЗрдЯ рдХрд╛ clipper
рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдмрдЪреНрдЪреЗ рдХреЗ рд╡рд┐рдЬреЗрдЯ рдХреЛ рдХреИрд╕реЗ рдХреНрд░реЙрдк рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдХреНрд░реЙрдкрд┐рдВрдЧ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, CircularRevealClipper
рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ, рдЬреЛ CustomClipper<Path>
рд╡рд░реНрдЧ рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ Path getClip(Size size)
рд╡рд┐рдзрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐ рдХреНрд░реЙрдкрд┐рдВрдЧ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдкрд╛рд░ рдХрд░рддреЗ рд╣реБрдП рдПрдХ Path
рд▓реМрдЯрд╛рддреА рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдХреНрд╖реЗрддреНрд░ рдПрдХ рджрд┐рдП рдЧрдП рдХреЗрдВрджреНрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЪрдХреНрд░ рд╣реИред рдПрдХ рд╕рд░реНрдХрд▓ рдХреА рддреНрд░рд┐рдЬреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдиреАрдореЗрд╢рди рдХреЗ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рдХреЛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдорд╛рди fraction
рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ CircularRevealClipper
рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рд░реНрдХрд▓ рдХреЗ рддреНрд░рд┐рдЬреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рдмреАрдЪ рд░реИрдЦрд┐рдХ рдкреНрд░рдХреНрд╖реЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреА рдЬрд╛рддреА рд╣реИред
рдЙрд╕рдХреЗ рдмрд╛рдж, рд╡рд┐рдЬреЗрдЯ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рдПрдиреАрдореЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП AnimatedBuilder
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред AnimatedBuilder
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ Animation<double>
рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ builder
рдХреЛ рд╡рд░реНрддрдорд╛рди рдПрдиреАрдореЗрд╢рди рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рдЬреЗрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред builder
рд╣рдо рдПрдХ ClipPath
рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдПрдиреАрдореЗрд╢рди рдХреЗ рд╡рд░реНрддрдорд╛рди рдорд╛рди ( fraction
) рдХреЛ ClipPath
рдЬрд╛рддреЗ рд╣реИрдВред
class CircularRevealAnimation extends StatelessWidget { ... @override Widget build(BuildContext context) { return AnimatedBuilder( animation: animation, builder: (BuildContext context, Widget _) { return ClipPath( clipper: CircularRevealClipper( fraction: animation.value, center: center, minRadius: minRadius, maxRadius: maxRadius, ), child: this.child, ); }, ); } }
рдпрд╣ CircularRevealAnimation
рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╛рдХреА рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ StatefulWidget
, StatefulWidget
рдмрдирд╛рдПрдВ рдФрд░ StatefulWidget
рд▓реЗрдХрд░ CircularRevealAnimation
рдкрд╛рд╕ рдХрд░реЗрдВред
рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ import 'package:flutter/material.dart'; import 'package:circular_reveal_animation/circular_reveal_animation.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'CRA Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: MyHomePage(), ); } } class MyHomePage extends StatefulWidget { @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin { AnimationController animationController; Animation<double> animation; @override void initState() { super.initState(); animationController = AnimationController( vsync: this, duration: Duration(milliseconds: 1000), ); animation = CurvedAnimation( parent: animationController, curve: Curves.easeIn, ); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("CRA Demo"), ), body: Padding( padding: const EdgeInsets.all(16.0), child: CircularRevealAnimation( minRadius: 12, maxRadius: 200, center: Offset(0, 300), child: Container(color: Colors.red), animation: animation, ), ), floatingActionButton: FloatingActionButton(onPressed: () { if (animationController.status == AnimationStatus.forward || animationController.status == AnimationStatus.completed) { animationController.reverse(); } else { animationController.forward(); } }), ); } }
Github рдбреЗрдореЛ рдРрдк ред
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдирд┐рд░реНрдорд╛рдг
рдбрд╛рд░реНрдЯ рдпрд╛ pubspec.yaml
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдбрд╛рд░реНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде lib
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд░реВрдк рдореЗрдВ pubspec.yaml
рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЙрд╕реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рд╡рд┐рд╡рд░рдг, рд▓реЗрдЦрдХреЛрдВ рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рд╣реИред
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИред рдпрд╣ рдлрд╝рд╛рдЗрд▓ lib
рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдирд╛рдо рдФрд░ рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдиреНрдп рд╕рднреА рдбрд╛рд░реНрдЯ рдлрд╛рдЗрд▓реЗрдВ src
рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд░рдЦреА рдЧрдИ рд╣реИрдВред рдпрд╣ рди рдХреЗрд╡рд▓ рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЖрдкрдХреЛ рдПрдХрд▓ import
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рднреА рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА:
library circular_reveal_animation; export 'package:circular_reveal_animation/src/circular_reveal_animation.dart';
рдЖрдк рдпрд╣рд╛рдВ рдбрд╛рд░реНрдЯ рдкрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдкрдм.рджреЗрд╡ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдВ
рдкрдм.рджреЗрд╡ рдХреЛ рдПрдХ рдбрд╛рд░реНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдЖрдкрдХреЛ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рд╣реИ рдХрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд░реВрдЯ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реА рд╕реЗ flutter packages pub publish
рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВред рдкреНрд░рдХрд╛рд╢рди Google рдЦрд╛рддреЗ рдХреА рдУрд░ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рдХрд╛рд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдПрдХ рд▓рд┐рдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд┐рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЦреЛрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ Google рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдмрд╛рдж, рдЕрдкрдбреЗрдЯ рдХреЗрд╡рд▓ рдЙрд╕ рдЦрд╛рддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рдУрд░ рд╕реЗ рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдкреНрд░рдХрд╛рд╢рди рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдЖрдк flutter packages pub publish --dry-run
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╕рд╣реА flutter packages pub publish --dry-run
ред
flutter packages pub publish
рдкреБрд╕реНрддрдХрд╛рд▓рдп рддреБрд░рдВрдд pub.dev рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдФрд░, рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рд▓реЗрдЦрди рдХрд╣рддрд╛ рд╣реИ, "рдкреНрд░рдХрд╛рд╢рди рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рд╣реИ" - рдмрд╛рдж рдореЗрдВ рдЖрдк рдХреЗрд╡рд▓ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рднреА рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреЗред
рд╣рд╛рд▓рд╛рдБрдХрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреНрд░рдХрд╛рд╢рди рд╕рд░рд▓ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдиреБрдХрд╕рд╛рди рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдореБрдЭреЗ рд░реЗрдЯрд┐рдВрдЧ рдореЗрдВ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп ( pubspec.yaml
) рдХрд╛ рд╡рд░реНрдгрди рдмрд╣реБрдд рдЫреЛрдЯрд╛ рдерд╛ред
рдЖрдк рдпрд╣рд╛рдБ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рджрд░рдЕрд╕рд▓, pub.dev рдФрд░ github.com рдкрд░ рдкрд░рд┐рдкрддреНрд░_рд╕реЗрд╡рд╛_рдкреНрд░рдорд╛рдг рдкреБрд╕реНрддрдХрд╛рд▓рдпред
PS: рдореИрдВрдиреЗ рдбрд╛рд░реНрдЯ рдХреЛрдб рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ```java {...} ```
рдХрд┐рдпрд╛ред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ habr.com рдкрд░ рдбрд╛рд░реНрдЯ рдХреЛрдб рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПред