package Ġlife . chen shi . keep accounts . common . view Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Parcelable Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġandroidx . core . os . bundle Of Ċ import Ġlife . chen shi . keep accounts . R Ċ import Ġlife . chen shi . keep accounts . common . utils . dp 2 px Ċ import Ġlife . chen shi . keep accounts . common . utils . sp 2 px Ċ Ċ /** Ċ Ġ* Ġ@ description : Ġ èĩªå®ļä¹ī åįķ éĢī æĮīéĴ® ç»ĦåĲĪ , Ġitem ä¸º åŃĹç¬¦ä¸² , Ġä½¿çĶ¨ èĭ± æĸĩ éĢ Ĺ åı· åĪĨ åī² Ċ Ġ* Ġ@ author Ġl yb Ċ Ġ* Ġ@ date Ġ 2 0 2 1 å¹´ 0 4 æľĪ 0 6 æĹ¥ Ġ 2 0 : 4 9 Ċ Ġ*/ Ċ class ĠCustom RadioButton Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġattrs : ĠAttributeSet ? Ġ= Ġnull , ĊĠĠĠ Ġdef Style Attr : ĠInt Ġ= Ġ 0 , ĊĠĠĠ Ġdef Style Res : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠView ( context , Ġattrs , Ġdef Style Attr , Ġdef Style Res ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ä¿ĿåŃĺ æĮīéĴ® åŃĹç¬¦ä¸² åĲĪ éĽĨ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġm Items Ġ= ĠlistOf < String >() ĊĠĠĠ Ġprivate Ġvar Ġm Item TextColor Ġ= Ġ 0 x 0 0 0 0 0 0 0 0 ĊĠĠĠ Ġprivate Ġvar Ġm Item Text Size Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġm ItemSelected TextColor Ġ= Ġ 0 x 0 0 0 0 0 0 0 0 ĊĠĠĠ Ġprivate Ġvar Ġm ItemSelected Bg Color Ġ= Ġ 0 x 0 0 0 0 0 0 0 0 ĊĠĠĠ Ġprivate Ġvar Ġm BackgroundColor Ġ= Ġ 0 x 0 0 0 0 0 0 0 0 ĊĠĠĠ Ġprivate Ġvar Ġm Radius Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġm Item Radius Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġval Ġm Bg Paint Ġ= ĠPaint () ĊĠĠĠ Ġprivate Ġval Ġm Text Paint Ġ= ĠPaint () ĊĠĠĠ Ġprivate Ġval Ġm Item Paint Ġ= ĠPaint () ĊĠĠĠ Ġprivate Ġvar Ġm Width Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġm Height Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġm Vertical Spacing Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġm Horizontal Spacing Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġm Listener : Ġ(( Int ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġå½ĵåīį éĢī ä¸Ń Ġ 0 - n ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar ĠmCurrent Item Ġ= Ġ 0 ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtyped Array Ġ= Ġcontext . obtain Styled Attributes ( attrs , ĠR . style able . Custom RadioButton ) ĊĊĠĠĠĠĠĠĠ Ġtyped Array . getString ( R . style able . Custom RadioButton _ button Text )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Items Ġ= Ġit . split (",") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Item TextColor Ġ= Ġtyped Array . getColor ( R . style able . Custom RadioButton _ button TextColor , ĠColor . GRAY ) ĊĠĠĠĠĠĠĠ Ġm Item Text Size Ġ= Ġtyped Array . get Dimension ( R . style able . Custom RadioButton _ button Text Size , Ġ 1 4 . sp 2 px ()) ĊĠĠĠĠĠĠĠ Ġm ItemSelected TextColor Ġ= Ġtyped Array . getColor ( R . style able . Custom RadioButton _ button Selected TextColor , ĠColor . WHITE ) ĊĠĠĠĠĠĠĠ Ġm ItemSelected Bg Color Ġ= Ġtyped Array . getColor ( R . style able . Custom RadioButton _ button Selected Bg Color , ĠColor . BLACK ) ĊĠĠĠĠĠĠĠ Ġm BackgroundColor Ġ= Ġtyped Array . getColor ( R . style able . Custom RadioButton _ bgColor , Ġ 0 x 0 0 0 0 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġm Radius Ġ= Ġtyped Array . get Dimension ( R . style able . Custom RadioButton _ radius , Ġ 5 . dp 2 px (). toFloat ()) ĊĠĠĠĠĠĠĠ Ġm Item Radius Ġ= Ġtyped Array . get Dimension ( R . style able . Custom RadioButton _ button Radius , Ġ 3 . dp 2 px (). toFloat ()) ĊĠĠĠĠĠĠĠ Ġm Horizontal Spacing Ġ= Ġtyped Array . get Dimension ( R . style able . Custom RadioButton _ button Horizontal Spacing , Ġ 2 . dp 2 px (). toFloat ()) ĊĠĠĠĠĠĠĠ Ġm Vertical Spacing Ġ= Ġtyped Array . get Dimension ( R . style able . Custom RadioButton _ button Vertical Spacing , Ġ 2 . dp 2 px (). toFloat ()) ĊĠĠĠĠĠĠĠ Ġtyped Array . recycle () ĊĊĠĠĠĠĠĠĠ Ġinit Paint () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Paint () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Bg Paint . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis D ither Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= Ġm BackgroundColor ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm Text Paint . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis D ither Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= Ġm Item TextColor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Size Ġ= Ġm Item Text Size ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextAlign Ġ= ĠPaint . Align . CENTER ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm Item Paint . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis D ither Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= Ġm ItemSelected Bg Color ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Measure ( width Measure Spec , Ġheight Measure Spec ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Size Changed ( w : ĠInt , Ġh : ĠInt , Ġold w : ĠInt , Ġold h : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Size Changed ( w , Ġh , Ġold w , Ġold h ) ĊĊĠĠĠĠĠĠĠ Ġm Width Ġ= Ġw . toFloat () ĊĠĠĠĠĠĠĠ Ġm Height Ġ= Ġh . toFloat () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĊĠĠĠĠĠĠĠ Ġdraw Background ( canvas ) ĊĠĠĠĠĠĠĠ Ġdraw Item ( canvas ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Background ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcanvas . draw Round Rect ( padding Left . toFloat (), Ġpadding Top . toFloat (), Ġm Width Ġ- Ġpadding Right , Ġm Height Ġ- Ġpadding Bottom , Ġm Radius , Ġm Radius , Ġm Bg Paint ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Item ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Items . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" åŃĲ é¡¹ ä¸įèĥ½ä¸ºç©º ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ åİ» éĻ¤ padding åĲİçļĦ å®½ é«ĺ ĊĠĠĠĠĠĠĠ Ġval Ġtotal W Ġ= Ġm Width Ġ- Ġpadding Left Ġ- Ġpadding Right ĊĠĠĠĠĠĠĠ Ġ// Ġæ¯ı ä¸ª Item æīĢ åįł åĮºåŁŁ çļĦ å¤§å°ı ĊĠĠĠĠĠĠĠ Ġval Ġper W Ġ= Ġtotal W Ġ/ Ġm Items . size ĊĊĠĠĠĠĠĠĠ Ġval Ġfont Metrics Ġ= Ġm Text Paint . font Metrics ĊĠĠĠĠĠĠĠ Ġval Ġtop Ġ= Ġfont Metrics . top ĊĠĠĠĠĠĠĠ Ġval Ġbottom Ġ= Ġfont Metrics . bottom ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ç»ĺ åĪ¶ åŃĹ ä½ĵ ĊĠĠĠĠĠĠĠ Ġm Items . forEach Indexed Ġ{ Ġindex , Ġs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġå¦Ĥæŀľ å½ĵåīį æĺ¯ éĢī ä¸Ń , ç»ĺ åĪ¶ èĥĮæĻ¯ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== ĠmCurrent Item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Round Rect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Left Ġ+ Ġm Horizontal Spacing Ġ+ Ġper W Ġ* Ġindex , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Top Ġ+ Ġm Vertical Spacing , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Left Ġ+ Ġper W Ġ* Ġ( index Ġ+ Ġ 1 ) Ġ- Ġm Horizontal Spacing , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Height Ġ- Ġpadding Bottom Ġ- Ġm Vertical Spacing , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Item Radius , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Item Radius , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Item Paint ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Text Paint . color Ġ= Ġm ItemSelected TextColor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġå¦Ĥæŀľ æĺ¯ éĢī ä¸Ń , ç»ĺ åĪ¶ åŃĹ ä½ĵ è¦ģ æĶ¹åıĺ é¢ľèī² ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Text ( s , Ġpadding Left Ġ+ Ġper W Ġ/ Ġ 2 Ġ* Ġ( 2 Ġ* Ġindex Ġ+ Ġ 1 ), Ġ( m Height Ġ- Ġtop Ġ- Ġbottom ) Ġ/ Ġ 2 , Ġm Text Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Text Paint . color Ġ= Ġm Item TextColor ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Click ableView Accessibility ") ĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġevent . x ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġevent . y ĊĊĠĠĠĠĠĠĠ Ġ// Ġ åİ» éĻ¤ padding åĲİçļĦ å®½ é«ĺ ĊĠĠĠĠĠĠĠ Ġval Ġtotal W Ġ= Ġm Width Ġ- Ġpadding Left Ġ- Ġpadding Right ĊĠĠĠĠĠĠĠ Ġ// Ġæ¯ı ä¸ª Item æīĢ åįł åĮºåŁŁ çļĦ å¤§å°ı ĊĠĠĠĠĠĠĠ Ġval Ġper W Ġ= Ġtotal W Ġ/ Ġm Items . size ĊĊĠĠĠĠĠĠĠ ĠLog . d (" TAG ", Ġ" on Touch Event : Ġ${ event . action }") ĊĠĠĠĠĠĠĠ Ġwhen Ġ( event . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġå¦Ĥæŀľ y ç¬¦åĲĪ æĿ¡ä»¶ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( 0 Ġ< Ġy Ġ&& Ġy Ġ< Ġm Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġå¦Ĥæŀľ x ç¬¦åĲĪ æĿ¡ä»¶ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( 0 Ġ< Ġx Ġ&& Ġx Ġ< Ġm Width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Items . forEach Indexed Ġ{ Ġindex , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Ġin Ġ( padding Left Ġ+ Ġper W Ġ* Ġindex ) .. ( padding Left Ġ+ Ġper W Ġ* Ġ( index Ġ+ Ġ 1 ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetCurrent Item ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Listener ?. invoke ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Touch Event ( event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset On ItemClickListener ( listener : Ġ( Int ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . m Listener Ġ= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetCurrent Item ( position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠmCurrent Item Ġ= Ġposition ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState (): ĠParcel able ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparcel able Ġ= Ġsuper . on Save InstanceState () ĊĠĠĠĠĠĠĠ Ġreturn Ġbundle Of (" super " Ġto Ġparcel able , Ġ" current _ item " Ġto ĠmCurrent Item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Restore InstanceState ( state : ĠParcel able ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( state Ġis ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmCurrent Item Ġ= Ġstate . getInt (" current _ item ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Restore InstanceState ( state . get Parcelable (" super ")) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Restore InstanceState ( state ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }