package Ġkr . ac . sn u . hc il . android . common . view . button Ċ Ċ import Ġandroid . animation . Value Animator Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . graphics . Rect F Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . animation . De cel erate Interpolator Ċ import Ġandroidx . appcompat . widget . AppCompat Button Ċ import Ġandroidx . core . content . res . Resources Compat Ċ import Ġkr . ac . sn u . hc il . android . common . view . R Ċ Ċ class ĠColor Selection Button Ġ: ĠAppCompat Button , ĠValue Animator . Animator Update Listener Ġ{ ĊĊĠĠĠ Ġvar Ġcolor : ĠInt Ġ= ĠColor . RED ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ!= Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshape Paint . color Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġlateinit Ġvar Ġchecked Drawable : ĠDrawable ĊĊĠĠĠ Ġprivate Ġval Ġframe Bounds Ġ= ĠRect F () ĊĠĠĠ Ġprivate Ġvar Ġpadding Top Ġ= Ġ 0 . 0 f ĊĠĠĠ Ġprivate Ġvar Ġpadding Left Ġ= Ġ 0 . 0 f ĊĊĠĠĠ Ġprivate Ġvar Ġcontent Size : ĠFloat Ġ= Ġ 0 . 0 f ĊĊĠĠĠ Ġprivate Ġvar Ġcorner Radius : ĠFloat Ġ= Ġ 0 . 0 f ĊĠĠĠ Ġprivate Ġvar Ġcontent Padding : ĠFloat Ġ= Ġ 0 . 0 f ĊĊĊĠĠĠ Ġval Ġshape Paint : ĠPaint Ġ= ĠPaint () ĊĊĠĠĠ Ġprivate Ġvar Ġto Selection Round ing Animator : ĠValue Animator ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġto Un selection Round ing Animator : ĠValue Animator ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġto Selection Radius Animator : ĠValue Animator ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġto Un selection Radius Animator : ĠValue Animator ? Ġ= Ġnull ĊĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinterpol ator Ġ= ĠDec el erate Interpolator ( 2 . 0 f ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġsuper ( context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( null , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ) Ġ: Ġsuper ( context , Ġattrs ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( attrs , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet , Ġdef Style : ĠInt ) Ġ: Ġsuper ( context , Ġattrs , Ġdef Style ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( attrs , Ġdef Style ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit ( attrs : ĠAttributeSet ?, Ġdef Style : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbackground Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ// ĠLoad Ġattributes ĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġcontext . obtain Styled Attributes ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattrs , ĠR . style able . Color Selection Button , Ġdef Style , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġcolor Ġ= Ġa . getColor ( R . style able . Color Selection Button _ button Color , ĠColor . RED ) ĊĊĠĠĠĠĠĠĠ Ġa . recycle () ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġup Ġa Ġdefault ĠText Paint Ġobject ĊĠĠĠĠĠĠĠ Ġshape Paint . flags Ġ= ĠPaint . ANTI _ ALIAS _ FLAG ĊĊĠĠĠĠĠĠĠ Ġchecked Drawable Ġ= ĠResources Compat . get Drawable ( context . resources , ĠR . drawable . done , Ġnull ) !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Layout ( changed : ĠBoolean , Ġleft : ĠInt , Ġtop : ĠInt , Ġright : ĠInt , Ġbottom : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Layout ( changed , Ġleft , Ġtop , Ġright , Ġbottom ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( changed ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Size Ġ= ĠMath . min ( width , Ġheight ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( width Ġ>= Ġheight ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Top Ġ= Ġ 0 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Left Ġ= Ġ( width Ġ- Ġcontent Size ) Ġ* Ġ. 5 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Top Ġ= Ġ( height Ġ- Ġcontent Size ) Ġ* Ġ. 5 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Left Ġ= Ġ 0 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġframe Bounds . set ( padding Left , Ġpadding Top , Ġpadding Left Ġ+ Ġcontent Size , Ġpadding Top Ġ+ Ġcontent Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpadding Size Ġ= ĠMath . round ( content Size Ġ* Ġ 0 . 0 7 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdrawable Size Ġ= ĠMath . round ( padding Size Ġ+ Ġcontent Size Ġ- Ġ 2 Ġ* Ġpadding Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchecked Drawable . setBounds ( Math . round ( padding Left Ġ+ Ġpadding Size ), ĠMath . round ( padding Top Ġ+ Ġpadding Size ), ĠMath . round ( padding Left Ġ+ Ġdrawable Size ), ĠMath . round ( padding Top Ġ+ Ġdrawable Size )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isSelected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorner Radius Ġ= Ġcontent Size Ġ* Ġ. 2 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Padding Ġ= Ġ 0 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorner Radius Ġ= Ġcontent Size Ġ* Ġ. 5 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Padding Ġ= Ġcontent Size Ġ* Ġ 0 . 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Selection Round ing Animator Ġ= ĠValue Animator . of Float ( content Size Ġ* Ġ 0 . 5 f , Ġcontent Size Ġ* Ġ 0 . 2 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Un selection Round ing Animator Ġ= ĠValue Animator . of Float ( content Size Ġ* Ġ 0 . 2 f , Ġcontent Size Ġ* Ġ 0 . 5 f ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Selection Radius Animator Ġ= ĠValue Animator . of Float ( content Size Ġ* Ġ 0 . 1 f , Ġ 0 . 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Un selection Radius Animator Ġ= ĠValue Animator . of Float ( 0 . 0 f , Ġcontent Size Ġ* Ġ 0 . 1 f ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Selection Round ing Animator ?. interpol ator Ġ= Ġinterpol ator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Un selection Round ing Animator ?. interpol ator Ġ= Ġinterpol ator ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Selection Round ing Animator ?. duration Ġ= Ġ 2 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Selection Radius Animator ?. duration Ġ= Ġ 2 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Un selection Round ing Animator ?. duration Ġ= Ġ 1 5 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Un selection Radius Animator ?. duration Ġ= Ġ 1 5 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Selection Round ing Animator ?. add Update Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Un selection Round ing Animator ?. add Update Listener ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Selection Radius Animator ?. add Update Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Un selection Radius Animator ?. add Update Listener ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠsetSelected ( selected : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( isSelected Ġ!= Ġselected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( to Un selection Round ing Animator ?. isRunning Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Un selection Round ing Animator ?. end () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Selection Radius Animator ?. start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Selection Round ing Animator ?. start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( to Selection Round ing Animator ?. isRunning Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Selection Round ing Animator ?. end () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Un selection Radius Animator ?. start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Un selection Round ing Animator ?. start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . setSelected ( selected ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Animation Update ( p 0 : ĠValue Animator ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( p 0 Ġ=== Ġto Un selection Round ing Animator Ġ|| Ġp 0 Ġ=== Ġto Selection Round ing Animator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcorner Radius Ġ= Ġp 0 . animated Value Ġas ĠFloat ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Padding Ġ= Ġp 0 . animated Value Ġas ĠFloat ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġframe Bounds . set ( padding Left , Ġpadding Top , Ġpadding Left Ġ+ Ġcontent Size , Ġpadding Top Ġ+ Ġcontent Size ) ĊĠĠĠĠĠĠĠ Ġframe Bounds . in set ( content Padding , Ġcontent Padding ) ĊĠĠĠĠĠĠĠ Ġcanvas . draw Round Rect ( frame Bounds , Ġcorner Radius , Ġcorner Radius , Ġshape Paint ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( isSelected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchecked Drawable . draw ( canvas ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ