package Ġcom . github . easy view Ċ Ċ /** Ċ Ġ* Ġ@ author : ĠL ittle ĠBe i Ċ Ġ* Ġ@ Date : Ġ 2 0 2 2 / 1 / 2 1 Ċ Ġ*/ Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics .* Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Log Ċ import Ġandroid . widget . ProgressBar Ċ import Ġkotlin . math . pow Ċ import Ġkotlin . math . sqrt Ċ Ċ class ĠEasy Indicator ProgressBar ( context : ĠContext , Ġattrs : ĠAttributeSet ?): ĠProgress Bar ( context , Ġattrs ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġspan Width Ġ= Ġ 0 . 0 f ĊĠĠĠ Ġprivate Ġvar Ġspan Height Ġ= Ġ 0 . 0 f ĊĠĠĠ Ġprivate Ġvar Ġcircle Radius Ġ= Ġ 0 . 0 f ĊĊĠĠĠ Ġ// ĠTick Mark ĊĠĠĠ Ġprivate Ġvar Ġtick Mark Radius Ġ= Ġ 1 0 . 0 f ĊĠĠĠ Ġprivate Ġvar Ġtick Mark Color Ġ= ĠColor . BLACK ĊĠĠĠ Ġprivate Ġvar Ġtick Mark Active Color Ġ= ĠColor . BLUE ĊĠĠĠ Ġprivate Ġvar Ġtick Mark Overlay Radius Ġ= Ġ 0 . 0 f ĊĠĠĠ Ġprivate Ġvar Ġtick Mark Overlay Color Ġ= ĠColor . WHITE ĊĠĠĠ Ġprivate Ġval Ġtick Mark Paint : ĠPaint Ġ= ĠPaint () ĊĠĠĠ Ġprivate Ġval Ġtick Mark Active Paint : ĠPaint Ġ= ĠPaint () ĊĠĠĠ Ġprivate Ġval Ġtick Mark Overlay Paint : ĠPaint Ġ= ĠPaint () ĊĊĠĠĠ Ġ// ĠIndicator ĊĠĠĠ Ġvar Ġindicator Text Ġ= Ġ" 0 / 0 " ĊĠĠĠ Ġprivate Ġvar Ġindicator Interval Between Tick Mark Ġ= Ġ 4 . 0 f ĊĠĠĠ Ġprivate Ġvar Ġindicator Rect Width Ġ= Ġ 8 0 . 0 f ĊĠĠĠ Ġprivate Ġvar Ġindicator Rect Height Ġ= Ġ 4 0 . 0 f ĊĠĠĠ Ġprivate Ġvar Ġindicator Rect Radius Ġ= Ġ 4 0 . 0 f ĊĠĠĠ Ġprivate Ġvar Ġindicator Triangle Side Length Ġ= Ġ 1 6 . 0 f ĊĠĠĠ Ġprivate Ġvar Ġindicator TextColor Ġ= ĠColor . WHITE ĊĠĠĠ Ġprivate Ġvar Ġindicator Text Size Ġ= Ġ 2 4 . 0 f ĊĠĠĠ Ġprivate Ġvar Ġindicator BackgroundColor Ġ= ĠColor . BLACK ĊĠĠĠ Ġprivate Ġval Ġindicator Paint : ĠPaint Ġ= ĠPaint () ĊĠĠĠ Ġprivate Ġval Ġindicator Text Paint : ĠPaint Ġ= ĠPaint () ĊĠĠĠ Ġprivate Ġval Ġindicator Triangle Path Ġ= ĠPath () ĊĠĠĠ Ġprivate Ġval Ġindicator Rect Path Ġ= ĠPath () ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠTAG Ġ= ĠEasy Indicator ProgressBar :: class . java . simple Name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext ): Ġthis ( context , Ġnull ) ĊĊĠĠĠ Ġ// ĠInit Ġcustom Ġattrs . ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtyped Array Ġ= Ġcontext . obtain Styled Attributes ( attrs , ĠR . style able . Easy Indicator ProgressBar ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtick Mark Radius Ġ= Ġtyped Array . get Dimension ( R . style able . Easy Indicator ProgressBar _ tick Mark _ radius , Ġtick Mark Radius ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtick Mark Color Ġ= Ġtyped Array . getColor ( R . style able . Easy Indicator ProgressBar _ tick Mark _ color , Ġtick Mark Color ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtick Mark Active Color Ġ= Ġtyped Array . getColor ( R . style able . Easy Indicator ProgressBar _ tick Mark _ active Color , Ġtick Mark Active Color ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtick Mark Overlay Radius Ġ= Ġtyped Array . get Dimension ( R . style able . Easy Indicator ProgressBar _ tick Mark _ overlay Radius , Ġtick Mark Overlay Radius ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtick Mark Overlay Color Ġ= Ġtyped Array . getColor ( R . style able . Easy Indicator ProgressBar _ tick Mark _ overlay Color , Ġtick Mark Overlay Color ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġindicator Interval Between Tick Mark Ġ= Ġtyped Array . get Dimension ( R . style able . Easy Indicator ProgressBar _ indicator _ interval _ between Tick Mark , Ġindicator Interval Between Tick Mark ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindicator Rect Width Ġ= Ġtyped Array . get Dimension ( R . style able . Easy Indicator ProgressBar _ indicator _ rect Width , Ġindicator Rect Width ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindicator Rect Height Ġ= Ġtyped Array . get Dimension ( R . style able . Easy Indicator ProgressBar _ indicator _ rect Height , Ġindicator Rect Height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindicator Rect Radius Ġ Ġ= Ġtyped Array . get Dimension ( R . style able . Easy Indicator ProgressBar _ indicator _ rect Radius , Ġindicator Rect Radius ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindicator Triangle Side Length Ġ= Ġtyped Array . get Dimension ( R . style able . Easy Indicator ProgressBar _ indicator _ triangle _ side Length , Ġindicator Triangle Side Length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindicator TextColor Ġ= Ġtyped Array . getColor ( R . style able . Easy Indicator ProgressBar _ indicator _ textColor , Ġindicator TextColor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindicator Text Size Ġ= Ġtyped Array . get Dimension ( R . style able . Easy Indicator ProgressBar _ indicator _ text Size , Ġindicator Text Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindicator BackgroundColor Ġ= Ġtyped Array . getColor ( R . style able . Easy Indicator ProgressBar _ indicator _ backgroundColor , Ġindicator BackgroundColor ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException ( e ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtyped Array . recycle () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġindicator Text Ġ= Ġ"$ progress /$ max " ĊĠĠĠĠĠĠĠ Ġcheck Space () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEnsure Ġthe Ġmost Ġleft Ġand Ġmost Ġright Ġtick Mark Ġor Ġindicator Ġhave Ġenough Ġspace Ġto Ġdraw . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcheck Space () Ġ{ ĊĠĠĠĠĠĠĠ Ġcircle Radius Ġ= Ġtick Mark Radius . coerce At Least ( tick Mark Overlay Radius ) ĊĠĠĠĠĠĠĠ Ġval Ġrect Half Width Ġ= Ġindicator Rect Width Ġ/ Ġ 2 Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġneed Padding Ġ= Ġcircle Radius . coerce At Least ( rect Half Width ) ĊĠĠĠĠĠĠĠ Ġif Ġ( padding Left Ġ< Ġneed Padding ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Padding ( need Padding . toInt (), Ġpadding Top , Ġpadding Right , Ġpadding Bottom ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( padding Right Ġ< Ġneed Padding ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Padding ( padding Left , Ġpadding Top , Ġneed Padding . toInt (), Ġpadding Bottom ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ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 ) ĊĊĠĠĠĠĠĠĠ Ġspan Width Ġ= Ġif ( max Ġ<= Ġ 1 ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( w Ġ- Ġpadding Left Ġ- Ġpadding Right ). toFloat () ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( w Ġ- Ġpadding Left Ġ- Ġpadding Right ). toFloat () Ġ/ Ġmax ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġspan Height Ġ= Ġ( h Ġ- Ġpadding Top Ġ- Ġpadding Bottom ). toFloat () ĊĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" on Size Changed : Ġspan Width Ġ= Ġ$ span Width , Ġspan Height Ġ= Ġ$ span Height , Ġpadding Left Ġ= Ġ$ padding Left , Ġpadding Right Ġ= Ġ$ padding Right ") ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĊĠĠĠĠĠĠĠ Ġtick Mark Paint . reset () ĊĠĠĠĠĠĠĠ Ġtick Mark Paint . flags Ġ= ĠPaint . ANTI _ ALIAS _ FLAG ĊĠĠĠĠĠĠĠ Ġtick Mark Paint . color Ġ= Ġtick Mark Color ĊĊĠĠĠĠĠĠĠ Ġtick Mark Active Paint . reset () ĊĠĠĠĠĠĠĠ Ġtick Mark Active Paint . flags Ġ= ĠPaint . ANTI _ ALIAS _ FLAG ĊĠĠĠĠĠĠĠ Ġtick Mark Active Paint . color Ġ= Ġtick Mark Active Color ĊĊĠĠĠĠĠĠĠ Ġtick Mark Overlay Paint . reset () ĊĠĠĠĠĠĠĠ Ġtick Mark Overlay Paint . flags Ġ= ĠPaint . ANTI _ ALIAS _ FLAG ĊĠĠĠĠĠĠĠ Ġtick Mark Overlay Paint . color Ġ= Ġtick Mark Overlay Color ĊĊĠĠĠĠĠĠĠ Ġindicator Paint . reset () ĊĠĠĠĠĠĠĠ Ġindicator Paint . flags Ġ= ĠPaint . ANTI _ ALIAS _ FLAG ĊĠĠĠĠĠĠĠ Ġindicator Paint . color Ġ= Ġindicator BackgroundColor ĊĊĠĠĠĠĠĠĠ Ġindicator Text Paint . reset () ĊĠĠĠĠĠĠĠ Ġindicator Text Paint . flags Ġ= ĠPaint . ANTI _ ALIAS _ FLAG ĊĠĠĠĠĠĠĠ Ġindicator Text Paint . color Ġ= Ġindicator TextColor ĊĠĠĠĠĠĠĠ Ġindicator Text Paint . text Size Ġ= Ġindicator Text Size ĊĠĠĠĠĠĠĠ Ġindicator Text Paint . textAlign Ġ= ĠPaint . Align . CENTER ĊĊĠĠĠĠĠĠĠ Ġ// ĠStep Ġ 1 ĊĠĠĠĠĠĠĠ Ġdraw Tick Mark ( canvas ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDraw Ġtick Mark , Ġdefault Ġshape Ġis Ġcircle . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdraw Tick Mark ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( tick Mark Radius Ġ> Ġ 0 ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcx Ġ= Ġpadding Left . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcy Ġ= Ġspan Height Ġ/ Ġ 2 Ġ+ Ġpadding Top ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. max ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Circle ( cx , Ġcy , Ġtick Mark Radius , Ġtick Mark Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcx Ġ+= Ġspan Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStep Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Tick Mark Overlay ( canvas ) ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" tick Mark Radius Ġcan 't Ġless Ġthan Ġ 0 : Ġ$ tick Mark Radius ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDraw Ġtick Mark Overlay . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdraw Tick Mark Overlay ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( progress Ġ>= Ġ 0 ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcx Ġ= Ġpadding Left Ġ+ Ġprogress * span Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcy Ġ= Ġspan Height Ġ/ Ġ 2 Ġ+ Ġpadding Top ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( tick Mark Overlay Radius Ġ> Ġtick Mark Radius ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Circle ( cx , Ġcy , Ġtick Mark Overlay Radius , Ġtick Mark Overlay Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStep Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Tick Mark Active ( canvas ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStep Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Indicator ( canvas ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ĠDraw Ġactive Ġtick Mark . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdraw Tick Mark Active ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcx Ġ= Ġpadding Left . toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġcy Ġ= Ġspan Height Ġ/ Ġ 2 Ġ+ Ġpadding Top ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. progress ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Circle ( cx , Ġcy , Ġtick Mark Radius , Ġtick Mark Active Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcx Ġ+= Ġspan Width ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDraw Ġindicator . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdraw Indicator ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ 1 . ĠDraw Ġtriangle . ĊĠĠĠĠĠĠĠ Ġindicator Triangle Path . reset () ĊĠĠĠĠĠĠĠ Ġval Ġstart X Ġ= Ġpadding Start Ġ+ Ġspan Width * progress ĊĠĠĠĠĠĠĠ Ġval Ġstart Y Ġ= Ġpadding Top Ġ+ Ġspan Height / 2 Ġ- Ġcircle Radius Ġ- Ġindicator Interval Between Tick Mark ĊĠĠĠĠĠĠĠ Ġindicator Triangle Path . moveTo ( start X , Ġstart Y ) ĊĠĠĠĠĠĠĠ Ġindicator Triangle Path . lineTo ( start X Ġ+ Ġindicator Triangle Side Length Ġ/ Ġ 2 , Ġstart Y Ġ- Ġget Indicator Triangle Height (). toFloat ()) ĊĠĠĠĠĠĠĠ Ġindicator Triangle Path . r Line To (- indicator Triangle Side Length , Ġ 0 . 0 f ) ĊĠĠĠĠĠĠĠ Ġindicator Triangle Path . close () ĊĠĠĠĠĠĠĠ Ġcanvas . draw Path ( indicator Triangle Path , Ġindicator Paint ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 2 . ĠDraw Ġrect . ĊĠĠĠĠĠĠĠ Ġindicator Rect Path . reset () ĊĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġpadding Start Ġ+ Ġspan Width * progress Ġ- Ġindicator Rect Width Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġtop Ġ= Ġpadding Top Ġ+ Ġspan Height / 2 Ġ- Ġcircle Radius Ġ- Ġindicator Interval Between Tick Mark Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Indicator Triangle Height (). toFloat () Ġ- Ġindicator Rect Height ĊĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġpadding Start Ġ+ Ġspan Width * progress Ġ+ Ġindicator Rect Width Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġbottom Ġ= Ġpadding Top Ġ+ Ġspan Height / 2 Ġ- Ġcircle Radius Ġ- Ġindicator Interval Between Tick Mark Ġ- Ġget Indicator Triangle Height (). toFloat () Ġ+ Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġval Ġrect F Ġ= ĠRect F ( left , Ġtop , Ġright , Ġbottom ) ĊĠĠĠĠĠĠĠ Ġindicator Rect Path . add Round Rect ( rect F , Ġindicator Rect Radius , Ġindicator Rect Radius , ĠPath . Direction . CC W ) ĊĠĠĠĠĠĠĠ Ġcanvas . draw Path ( indicator Rect Path , Ġindicator Paint ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 3 . ĠDraw Ġindicator Ġtext . ĊĠĠĠĠĠĠĠ Ġval Ġtext Bounds Ġ= ĠRect () ĊĠĠĠĠĠĠĠ Ġindicator Text Paint . getText Bounds ( indicator Text , Ġ 0 , Ġindicator Text . length , Ġtext Bounds ) ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġpadding Start Ġ+ Ġspan Width * progress ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġpadding Top Ġ+ Ġspan Height / 2 Ġ- Ġcircle Radius Ġ- Ġindicator Interval Between Tick Mark Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Indicator Triangle Height (). toFloat () Ġ- Ġindicator Rect Height Ġ/ 2 Ġ+ Ġtext Bounds . height ()/ 2 ĊĠĠĠĠĠĠĠ Ġcanvas . draw Text ( indicator Text , Ġx , Ġy , Ġindicator Text Paint ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Indicator Triangle Height (): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsqrt ( indicator Triangle Side Length . toDouble (). pow ( 2 . 0 ) Ġ- Ġ( indicator Triangle Side Length Ġ/ Ġ 2 . toDouble ()). pow ( 2 . 0 )) ĊĠĠĠ Ġ} Ċ }