package Ġcom . vj g arc ia . ch uck nor ris j okes . core . presentation Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics .* Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . util . Display Metrics Ċ import Ġandroid . view . WindowManager Ċ import Ġandroidx . annotation . Color Int Ċ import Ġcom . vj g arc ia . ch uck nor ris j okes . R Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . sqrt Ċ Ċ enum Ġclass ĠS keleton Shape Ġ{ ĊĠĠĠ ĠRE CT ANGLE , ĊĠĠĠ ĠO VAL Ċ } Ċ Ċ class ĠS keleton Drawable ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġradius Px : ĠFloat ? Ġ= Ġnull , ĊĠĠĠ Ġprivate Ġval Ġshape : ĠS keleton Shape Ġ= ĠS keleton Shape . RECT ANGLE , ĊĠĠĠ Ġprivate Ġval Ġskeleton Drawable Animator : ĠS keleton Drawable Animator Ġ= ĠDEFAULT _ ANIM ATOR Ċ ) Ġ: ĠDrawable () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġmask Offset X : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġmask Rect : ĠRect ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġview Rect : ĠRect F ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġgradient Texture Paint : ĠPaint ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġmask Bitmap : ĠBitmap ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcanvas For Sh im mer Mask : ĠCanvas ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġis Animation Started : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġshim mer Animation Duration : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġ@ Color Int ĊĠĠĠ Ġprivate Ġvar Ġshim mer Color : ĠInt Ġ= Ġcontext . resources . getColor ( R . color . skeleton Wave ) ĊĠĠĠ Ġprivate Ġvar Ġshim mer Angle : ĠInt Ġ= ĠDEFAULT _ ANGLE ĊĠĠĠ Ġprivate Ġvar Ġmask Width : ĠFloat Ġ= Ġ 0 . toFloat () ĊĠĠĠ Ġprivate Ġvar Ġgradient Center Color Width : ĠFloat Ġ= Ġ 0 . toFloat () ĊĠĠĠ Ġprivate Ġvar Ġskeleton Drawable Animator Callback : ĠS keleton Drawable Animator . Callback ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġpaint Ġ= ĠPaint () ĊĠĠĠ Ġprivate Ġval Ġradius Ġ= Ġradius Px Ġ?: Ġcontext . resources . get Dimension ( R . dim en . default _ skeleton _ radius ) ĊĊĠĠĠ Ġ@ Color Int ĊĠĠĠ Ġprivate Ġval ĠbackgroundColor Ġ= Ġcontext . resources . getColor ( R . color . skeleton Background ) ĊĠĠĠ Ġprivate Ġval ĠmaxWidth Animation : ĠInt ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġshim mer Angle Ġ= ĠDEFAULT _ ANGLE ĊĠĠĠĠĠĠĠ Ġshim mer Animation Duration Ġ= ĠDEFAULT _ ANIM ATION _ DURATION ĊĠĠĠĠĠĠĠ Ġmask Width Ġ= ĠDEFAULT _ MASK _ WIDTH ĊĠĠĠĠĠĠĠ Ġgradient Center Color Width Ġ= ĠDEFAULT _ GRAD IENT _ CENTER _ COLOR _ WIDTH ĊĠĠĠĠĠĠĠ Ġpaint . is Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġpaint . color Ġ= ĠbackgroundColor ĊĠĠĠĠĠĠĠ Ġview Rect Ġ= ĠRect F ( bounds . left . toFloat (), Ġbounds . top . toFloat (), Ġbounds . right . toFloat (), Ġbounds . bottom . toFloat ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġmetrics Ġ= ĠDisplay Metrics () ĊĠĠĠĠĠĠĠ Ġval Ġwindow Manager Ġ= Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. getSystem Service ( Context . WINDOW _ SERVICE ) Ġas ĠWindow Manager ĊĠĠĠĠĠĠĠ Ġwindow Manager . default Display . get Metrics ( metrics ) ĊĠĠĠĠĠĠĠ ĠmaxWidth Animation Ġ= Ġmetrics . width Pixels ĊĠĠĠĠĠĠĠ Ġset Mask Width ( mask Width ) ĊĠĠĠĠĠĠĠ Ġset Gradient Center Color Width ( gradient Center Color Width ) ĊĠĠĠĠĠĠĠ Ġset Sh im mer Angle ( shim mer Angle ) ĊĠĠĠĠĠĠĠ Ġstart Sh im mer Animation () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bounds Change ( bounds : ĠRect ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Bounds Change ( bounds ) ĊĠĠĠĠĠĠĠ Ġthis . bounds Ġ= Ġbounds ĊĠĠĠĠĠĠĠ Ġview Rect Ġ= ĠRect F ( bounds . left . toFloat (), Ġbounds . top . toFloat (), Ġbounds . right . toFloat (), Ġbounds . bottom . toFloat ()) ĊĠĠĠĠĠĠĠ Ġinvalidate Self () ĊĠĠĠĠĠĠĠ Ġreset If Started () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Visible ( visible : ĠBoolean , Ġrestart : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhas Changed Ġ= Ġsuper . setVisible ( visible , Ġrestart ) ĊĠĠĠĠĠĠĠ Ġif Ġ( has Changed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( visible ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Sh im mer Animation () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Sh im mer Animation () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġhas Changed ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdraw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Rect Ġ= Ġview Rect Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( shape ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS keleton Shape . RECT ANGLE Ġ-> Ġcanvas . draw Round Rect ( view Rect , Ġradius , Ġradius , Ġpaint ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS keleton Shape . O VAL Ġ-> Ġcanvas . draw O val ( view Rect , Ġpaint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdraw Sh im mer ( canvas ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Alpha ( alpha : ĠInt ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Opacity (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPixel Format . OP A QUE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Color Filter ( color Filter : ĠColor Filter ?) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġthe Ġangle Ġof Ġthe Ġshim mer Ġeffect Ġin Ġclock wise Ġdirection Ġin Ġdegrees . ĊĠĠĠĠ Ġ* ĠThe Ġangle Ġmust Ġbe Ġbetween Ġ{@ value Ġ# MIN _ ANGLE _ VALUE } Ġand Ġ{@ value Ġ# MAX _ ANGLE _ VALUE }. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġangle ĠThe Ġangle Ġto Ġbe Ġset ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Sh im mer Angle ( angle : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( angle Ġin ĠMIN _ ANGLE _ VALUE .. MAX _ ANGLE _ VALUE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" shim mer Angle Ġvalue Ġmust Ġbe Ġbetween Ġ$ MIN _ ANGLE _ VALUE Ġand Ġ$ MAX _ ANGLE _ VALUE " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . shim mer Angle Ġ= Ġangle ĊĠĠĠĠĠĠĠ Ġreset If Started () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġwidth Ġof Ġthe Ġshim mer Ġline Ġto Ġa Ġvalue Ġhigher Ġthan Ġ 0 Ġto Ġless Ġor Ġequal Ġto Ġ 1 . ĊĠĠĠĠ Ġ* Ġ 1 Ġmeans Ġthe Ġwidth Ġof Ġthe Ġshim mer Ġline Ġis Ġequal Ġto Ġhalf Ġof Ġthe Ġwidth Ġof Ġthe ĠSh im mer Layout . ĊĠĠĠĠ Ġ* ĠThe Ġdefault Ġvalue Ġis Ġ 0 . 5 . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmask Width ĠThe Ġwidth Ġof Ġthe Ġshim mer Ġline . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Mask Width ( mask Width : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( mask Width Ġ> ĠMIN _ MASK _ WIDTH _ VALUE Ġ&& ĠMAX _ MASK _ WIDTH _ VALUE Ġ>= Ġmask Width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" mask Width Ġvalue Ġmust Ġbe Ġhigher Ġthan Ġ$ MIN _ MASK _ WIDTH _ VALUE Ġand Ġless Ġor Ġequal Ġto Ġ$ MAX _ MASK _ WIDTH _ VALUE " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . mask Width Ġ= Ġmask Width ĊĠĠĠĠĠĠĠ Ġreset If Started () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġwidth Ġof Ġthe Ġcenter Ġgradient Ġcolor Ġto Ġa Ġvalue Ġhigher Ġthan Ġ 0 Ġto Ġless Ġthan Ġ 1 . ĊĠĠĠĠ Ġ* Ġ 0 . 9 9 Ġmeans Ġthat Ġthe Ġwhole Ġshim mer Ġline Ġwill Ġhave Ġthis Ġcolor Ġwith Ġa Ġlittle Ġtransparent Ġedges . ĊĠĠĠĠ Ġ* ĠThe Ġdefault Ġvalue Ġis Ġ 0 . 1 . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġgradient Center Color Width ĠThe Ġwidth Ġof Ġthe Ġcenter Ġgradient Ġcolor . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Gradient Center Color Width ( gradient Center Color Width : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( gradient Center Color Width Ġ> ĠMIN _ GRAD IENT _ CENTER _ COLOR _ WIDTH _ VALUE Ġ&& ĠMAX _ GRAD IENT _ CENTER _ COLOR _ WIDTH _ VALUE Ġ> Ġgradient Center Color Width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" gradient Center Color Width Ġvalue Ġmust Ġbe Ġhigher Ġthan Ġ$ MIN _ GRAD IENT _ CENTER _ COLOR _ WIDTH _ VALUE Ġand Ġless Ġthan Ġ$ MAX _ GRAD IENT _ CENTER _ COLOR _ WIDTH _ VALUE " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . gradient Center Color Width Ġ= Ġgradient Center Color Width ĊĠĠĠĠĠĠĠ Ġreset If Started () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Sh im mer Animation () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Animation Started ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġis Animation Started Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ(! init Sh im mer ing Resources ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// We Ġleave Ġas Ġwe Ġcannot Ġmake Ġthe Ġanimation Ġwithout Ġhaving Ġprepared Ġthe Ġresources Ġsuccessfully . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// But Ġwe Ġkeep Ġthe Ġis Animation Started Ġflag Ġto Ġtrue Ġto Ġstart Ġthe Ġanimation Ġwhen Ġthe Ġnext Ġon Bounds Change Ġwill Ġbe Ġcalled . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġget Skeleton Drawable Animator Callback ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġskeleton Drawable Animator . start Listening Animation ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Sh im mer Animation () Ġ{ ĊĠĠĠĠĠĠĠ Ġrelease Sh im mer ing Resources () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset If Started () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Animation Started ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelease Sh im mer ing Resources () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Sh im mer Animation () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Sh im mer ( destination Canvas : ĠCanvas ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcanvas Ġ= Ġdestination Canvas Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġshim mer Rect Ġ= Ġmask Rect Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġshim mer Paint Ġ= Ġgradient Texture Paint Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġcanvas For Sh im mer Mask Ġ= Ġcanvas For Sh im mer Mask Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġupdate Sh im mer Mask ( canvas For Sh im mer Mask ) ĊĊĠĠĠĠĠĠĠ Ġcanvas . save () ĊĠĠĠĠĠĠĠ Ġcanvas . translate ( mask Offset X . toFloat (), Ġ 0 f ) ĊĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( shim mer Rect , Ġshim mer Paint ) ĊĠĠĠĠĠĠĠ Ġcanvas . restore () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Sh im mer Mask ( canvas For Sh im mer Mask : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcanvas For Sh im mer Mask . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Color ( Color . TRANSP ARENT , ĠPort er D uff . Mode . CLEAR ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtranslate (- mask Offset X . toFloat (), Ġ 0 . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Rect ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( shape ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS keleton Shape . RECT ANGLE Ġ-> Ġdraw Round Rect ( it , Ġradius , Ġradius , Ġpaint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS keleton Shape . O VAL Ġ-> Ġdraw O val ( it , Ġpaint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrestore () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Sh im mer ing Resources (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġmask Bitmap Ġ= Ġcreate Bitmap ( getWidth (), Ġget Height ()) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( mask Bitmap Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcanvas For Sh im mer Mask Ġ= ĠCanvas ( mask Bitmap !! ) ĊĠĠĠĠĠĠĠ Ġgradient Texture Paint Ġ= Ġcreate Sh im mer Paint () ĊĠĠĠĠĠĠĠ Ġif Ġ( gradient Texture Paint Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrelease Sh im mer ing Resources () Ġ{ ĊĠĠĠĠĠĠĠ Ġskeleton Drawable Animator Callback ?. let ( skeleton Drawable Animator :: stop Listening Animation ) ĊĠĠĠĠĠĠĠ Ġskeleton Drawable Animator Callback Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġgradient Texture Paint Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġis Animation Started Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġrelease Bit Maps () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrelease Bit Maps () Ġ{ ĊĠĠĠĠĠĠĠ Ġcanvas For Sh im mer Mask Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġmask Bitmap ?. recycle () ĊĠĠĠĠĠĠĠ Ġmask Bitmap Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġget Height (): ĠInt Ġ= ĠMath . abs ( bounds . height ()) ĊĊĠĠĠ Ġfun Ġget Width (): ĠInt Ġ= ĠMath . abs ( bounds . width ()) ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Sh im mer Paint (): ĠPaint ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmask Bitmap Ġ= Ġmask Bitmap Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġedge Color Ġ= Ġreduce Color Alpha Value To Zero ( shim mer Color ) ĊĠĠĠĠĠĠĠ Ġval Ġshim mer LineWidth Ġ= ĠmaxWidth Animation Ġ/ Ġ 2 Ġ* Ġmask Width ĊĠĠĠĠĠĠĠ Ġval Ġy Position Ġ= Ġ( if Ġ( 0 Ġ<= Ġshim mer Angle ) Ġget Height () Ġelse Ġ 0 ). toFloat () ĊĊĠĠĠĠĠĠĠ Ġval Ġgradient Ġ= Ġwhen Ġ( shape ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS keleton Shape . RECT ANGLE Ġ-> ĠLinear Gradient ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Position , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMath . cos ( Math . to Radians ( shim mer Angle . toDouble ())). toFloat () Ġ* Ġshim mer LineWidth , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Position Ġ+ ĠMath . sin ( Math . to Radians ( shim mer Angle . toDouble ())). toFloat () Ġ* Ġshim mer LineWidth , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġint ArrayOf ( edge Color , Ġshim mer Color , Ġshim mer Color , Ġedge Color ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Gradient Color Distribution (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShader . Tile Mode . CLAMP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS keleton Shape . O VAL Ġ-> ĠRad ial Gradient ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Width () Ġ/ Ġ 2 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Height () Ġ/ Ġ 2 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( max ( getWidth (), Ġget Height ()) Ġ/ Ġsqrt ( 2 . 0 )). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġint ArrayOf ( edge Color , Ġshim mer Color , Ġshim mer Color , Ġedge Color ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Gradient Color Distribution (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShader . Tile Mode . CLAMP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmask Bitmap Shader Ġ= ĠBitmap Shader ( mask Bitmap , ĠShader . Tile Mode . CLAMP , ĠShader . Tile Mode . CLAMP ) ĊĠĠĠĠĠĠĠ Ġval Ġcompose Shader Ġ= ĠCompose Shader ( gradient , Ġmask Bitmap Shader , ĠPort er D uff . Mode . DST _ IN ) ĊĠĠĠĠĠĠĠ Ġreturn ĠPaint (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis D ither Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Filter Bitmap Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshader Ġ= Ġcompose Shader ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Skeleton Drawable Animator Callback (): ĠS keleton Drawable Animator . Callback ? Ġ{ ĊĠĠĠĠĠĠĠ Ġskeleton Drawable Animator Callback ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmask Rect Ġ= Ġcalculate Bitmap Mask Rect () ĊĠĠĠĠĠĠĠ Ġval Ġwidth Mask Ġ= Ġmask Rect ?. width () Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġanimation To X Ġ= ĠmaxWidth Animation ĊĠĠĠĠĠĠĠ Ġval Ġanimation From X : ĠInt ĊĊĠĠĠĠĠĠĠ Ġanimation From X Ġ= Ġif Ġ( getWidth () Ġ> Ġwidth Mask ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ- animation To X ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ- width Mask ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġshim mer Animation Full Length Ġ= Ġanimation To X Ġ- Ġanimation From X ĊĊĠĠĠĠĠĠĠ Ġskeleton Drawable Animator Callback Ġ= Ġobject Ġ: ĠS keleton Drawable Animator . Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonUpdate ( value : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmask Offset X Ġ= Ġanimation From X Ġ+ Ġ( shim mer Animation Full Length Ġ* Ġvalue ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mask Offset X Ġ+ Ġwidth Mask Ġ>= Ġ 0 Ġ&& Ġmask Offset X Ġ< Ġget Width ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate Self () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġskeleton Drawable Animator Callback ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Bitmap ( width : ĠInt , Ġheight : ĠInt ): ĠBitmap ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( width Ġ== Ġ 0 Ġ|| Ġheight Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBitmap . create Bitmap ( Math . abs ( width ), ĠMath . abs ( height ), ĠBitmap . Config . ALPHA _ 8 ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠOut Of Memory Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreduce Color Alpha Value To Zero ( actual Color : ĠInt ): ĠInt Ġ= ĠColor . arg b ( 0 , ĠColor . red ( actual Color ), ĠColor . green ( actual Color ), ĠColor . blue ( actual Color )) ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Bitmap Mask Rect (): ĠRect Ġ= ĠRect ( 0 , Ġ 0 , Ġcalculate Mask Width (), Ġget Height ()) ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Mask Width (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġshim mer Line Bottom Width Ġ= ĠmaxWidth Animation Ġ/ Ġ 2 Ġ* Ġmask Width Ġ/ ĠMath . cos ( Math . to Radians ( Math . abs ( shim mer Angle ). toDouble ())) ĊĠĠĠĠĠĠĠ Ġval Ġshim mer Line Remaining Top Width Ġ= Ġget Height () Ġ* ĠMath . tan ( Math . to Radians ( Math . abs ( shim mer Angle ). toDouble ())) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ( shim mer Line Bottom Width Ġ+ Ġshim mer Line Remaining Top Width ). toInt () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Gradient Color Distribution (): ĠFloat Array Ġ= Ġfloat ArrayOf ( ĊĠĠĠĠĠĠĠ ĠCOLOR _ DISTRIB UTION _ ALPHA _ TRANSP ARENT , ĊĠĠĠĠĠĠĠ ĠCOLOR _ DISTRIB UTION _ ALPHA _ MIDDLE Ġ- Ġgradient Center Color Width Ġ/ ĠHAL F , ĊĠĠĠĠĠĠĠ ĠCOLOR _ DISTRIB UTION _ ALPHA _ MIDDLE Ġ+ Ġgradient Center Color Width Ġ/ ĠHAL F , ĊĠĠĠĠĠĠĠ ĠCOLOR _ DISTRIB UTION _ ALPHA _ OP A QUE ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ ANIM ATION _ DURATION Ġ= Ġ 1 5 0 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ MASK _ WIDTH Ġ= Ġ 0 . 9 0 f ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ GRAD IENT _ CENTER _ COLOR _ WIDTH Ġ= Ġ 0 . 2 f ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ ANGLE : ĠInt Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMIN _ ANGLE _ VALUE : ĠInt Ġ= Ġ- 4 5 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMAX _ ANGLE _ VALUE : ĠInt Ġ= Ġ 4 5 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMIN _ MASK _ WIDTH _ VALUE : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMAX _ MASK _ WIDTH _ VALUE : ĠInt Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMIN _ GRAD IENT _ CENTER _ COLOR _ WIDTH _ VALUE : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMAX _ GRAD IENT _ CENTER _ COLOR _ WIDTH _ VALUE : ĠInt Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġval ĠDEFAULT _ ANIM ATOR Ġ= ĠS keleton Drawable Animator ( DEFAULT _ ANIM ATION _ DURATION . to Long ()) ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLOR _ DISTRIB UTION _ ALPHA _ TRANSP ARENT Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLOR _ DISTRIB UTION _ ALPHA _ MIDDLE Ġ= Ġ 0 . 5 f ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOLOR _ DISTRIB UTION _ ALPHA _ OP A QUE Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠHAL F Ġ= Ġ 2 f ĊĠĠĠ Ġ} Ċ Ċ }