/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠAr ty om ĠM iron ov Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . art y om mir on ov . color picker Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . Linear Gradient Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . graphics . Paint . Style Ċ import Ġandroid . graphics . Rect F Ċ import Ġandroid . graphics . Shader . Tile Mode Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġandroidx . annotation . Color Int Ċ import Ġandroidx . annotation . Px Ċ import Ġandroidx . core . graphics . alpha Ċ import Ġandroidx . core . graphics . blue Ċ import Ġandroidx . core . graphics . green Ċ import Ġandroidx . core . graphics . red Ċ import Ġkotlin . math . round ToInt Ċ import Ġkotlin . properties . Deleg ates Ċ Ċ class ĠColor Picker Ġ: ĠView Ġ{ ĊĠ Ġprivate Ġval Ġrect s Ġ= ĠArray ( 4 ) Ġ{ ĠRect F () Ġ} ĊĠ Ġprivate Ġval Ġpaint Ġ= ĠPaint () ĊĠ Ġprivate Ġval Ġh sv Ġ= ĠlistOf ( Bar . H , ĠBar . S , ĠBar . V ). map Ġ{ Ġit . max . toFloat () Ġ}. toFloat Array () ĊĠ Ġprivate Ġvar Ġarg b : ĠInt Ġ= ĠColor . WHITE ĊĠ Ġprivate Ġvar Ġcurrent Bar : ĠBar ? Ġ= Ġnull ĊĠ Ġvar Ġalpha Background Ġby ĠDeleg ates . observable < Drawable >( ĊĠĠĠ ĠSquare Tile Drawable ( 8 . dp , ĠColor . WHITE , ĠColor . LT GRAY ) ĊĠ Ġ) Ġ{ Ġ_, Ġ_, Ġ_ Ġ-> Ġinvalidate () Ġ} ĊĠ Ġ@ get : Px ĊĠ Ġvar Ġbar Height Ġby ĠDeleg ates . observable ( 3 2 . dp ) Ġ{ Ġ_, Ġold , Ġnew Ġ-> Ġif Ġ( new Ġ!= Ġold ) Ġrequest Layout () Ġ} ĊĠ Ġ@ get : Px ĊĠ Ġvar Ġbar Spacing Ġby ĠDeleg ates . observable ( 8 . dp ) Ġ{ Ġ_, Ġold , Ġnew Ġ-> Ġif Ġ( new Ġ!= Ġold ) Ġrequest Layout () Ġ} ĊĠ Ġvar Ġmode Ġby ĠDeleg ates . observable ( Mode . H SV A ) Ġ{ Ġ_, Ġold , Ġnew Ġ-> Ġif Ġ( new Ġ!= Ġold ) Ġrequest Layout () Ġ} ĊĠ Ġvar Ġon Color Change : Ġ() Ġ-> ĠUnit Ġ= Ġ{} ĊĠ Ġvar Ġcolor : ĠInt ĊĠĠĠ Ġ@ Color Int Ġget () Ġ= Ġget Panel Color ( arg b . alpha ) ĊĠĠĠ Ġset ( value ) Ġ= Ġset Panel Color ( value ) ĊĊĠ Ġconstructor ( ctx : ĠContext ) Ġ: Ġsuper ( ctx ) ĊĠ Ġconstructor ( ctx : ĠContext , Ġattrs : ĠAttributeSet ) Ġ: Ġsuper ( ctx , Ġattrs ) ĊĠ Ġconstructor ( ctx : ĠContext , Ġattrs : ĠAttributeSet , Ġdef Style : ĠInt ) Ġ: Ġsuper ( ctx , Ġattrs , Ġdef Style ) ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġpaint . style Ġ= ĠStyle . FILL ĊĠĠĠ Ġpaint . is Anti Alias Ġ= Ġtrue ĊĠĠĠ Ġset Will Not Draw ( false ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠ Ġget Bars (). forEach Ġ{ ĊĠĠĠĠĠ Ġdraw Bar ( canvas , Ġit ) ĊĠĠĠĠĠ Ġdraw Thumb ( canvas , Ġit ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Layout ( changed : ĠBoolean , Ġleft : ĠInt , Ġtop : ĠInt , Ġright : ĠInt , Ġbottom : ĠInt ) Ġ{ ĊĠĠĠ Ġsuper . on Layout ( changed , Ġleft , Ġtop , Ġright , Ġbottom ) ĊĠĠĠ Ġrect s . forEach Indexed Ġ{ Ġindex , Ġrect Ġ-> ĊĠĠĠĠĠ Ġrect . set ( ĊĠĠĠĠĠĠĠ Ġpadding Left . toFloat (), ĊĠĠĠĠĠĠĠ Ġ( padding Top Ġ+ Ġbar Height Ġ* Ġindex Ġ+ Ġbar Spacing Ġ* Ġindex ). toFloat (), ĊĠĠĠĠĠĠĠ Ġ( width Ġ- Ġpadding Right ). toFloat (), ĊĠĠĠĠĠĠĠ Ġ( padding Top Ġ+ Ġbar Height Ġ* Ġ( index Ġ+ Ġ 1 ) Ġ+ Ġbar Spacing Ġ* Ġindex ). toFloat () ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġw Ġ= ĠMeasure Spec . getSize ( width Measure Spec ) ĊĠĠĠ Ġval Ġh Ġ= Ġwhen Ġ( mode ) Ġ{ ĊĠĠĠĠĠ ĠMode . A Ġ-> Ġbar Height ĊĠĠĠĠĠ ĠMode . H SV , ĠMode . RGB Ġ-> Ġbar Height Ġ* Ġ 3 Ġ+ Ġbar Spacing Ġ* Ġ 2 ĊĠĠĠĠĠ ĠMode . H SV A , ĠMode . RGBA Ġ-> Ġbar Height Ġ* Ġ 4 Ġ+ Ġbar Spacing Ġ* Ġ 3 ĊĠĠĠ Ġ} Ġ+ Ġpadding Top Ġ+ Ġpadding Bottom ĊĠĠĠ Ġset Measured Dimension ( w , Ġh ) ĊĠ Ġ} ĊĊĠ Ġ@ Suppress Lint (" Click ableView Accessibility ") ĊĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠ Ġcurrent Bar Ġ= Ġwhen Ġ( event . action ) Ġ{ ĊĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġget Bars (). find Ġ{ Ġget Rect ( it ). contains ( event . x , Ġevent . y ) Ġ} ĊĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġcurrent Bar ĊĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġbar Ġ= Ġcurrent Bar Ġ?: Ġreturn Ġsuper . on Touch Event ( event ) ĊĠĠĠ Ġval Ġrect Ġ= Ġget Rect ( bar ). take If Ġ{ Ġit . width () Ġ> Ġ 0 Ġ} Ġ?: Ġreturn Ġsuper . on Touch Event ( event ) ĊĠĠĠ Ġset Bar Value ( bar , Ġ( event . x Ġ- Ġrect . left ). coerce In ( 0 f , Ġrect . width ()) Ġ* Ġbar . max Ġ/ Ġrect . width ()) ĊĠĠĠ Ġinvalidate () ĊĠĠĠ Ġon Color Change () ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġdraw Thumb ( canvas : ĠCanvas , Ġbar : ĠBar ) Ġ{ ĊĠĠĠ Ġval Ġrect Ġ= Ġget Rect ( bar ) ĊĠĠĠ Ġval Ġthumb Radius Ġ= Ġ 1 . dp ĊĠĠĠ Ġval Ġx Ġ= Ġget Bar Value ( bar ) Ġ* Ġrect . width () Ġ/ Ġbar . max Ġ+ Ġrect . left ĊĠĠĠ Ġval Ġleft Ġ= Ġ( x Ġ- Ġthumb Radius ). coerce In ( rect . left , Ġrect . right Ġ- Ġthumb Radius Ġ* Ġ 2 f ) ĊĠĠĠ Ġval Ġright Ġ= Ġ( x Ġ+ Ġthumb Radius ). coerce In ( rect . left Ġ+ Ġthumb Radius Ġ* Ġ 2 f , Ġrect . right ) ĊĠĠĠ Ġval Ġdark Ġ= Ġwhen Ġ( mode ) Ġ{ ĊĠĠĠĠĠ ĠMode . H SV , ĠMode . H SV A Ġ-> Ġget Bar Value ( Bar . V ) Ġ< Ġ 0 . 5 f ĊĠĠĠĠĠ Ġelse Ġ-> Ġcolor . red Ġ+ Ġcolor . green Ġ+ Ġcolor . blue Ġ< Ġ 1 2 8 Ġ* Ġ 3 ĊĠĠĠ Ġ} ĊĠĠĠ Ġpaint . color Ġ= Ġif Ġ( dark ) ĠColor . WHITE Ġelse ĠColor . BLACK ĊĠĠĠ Ġpaint . shader Ġ= Ġnull ĊĠĠĠ Ġcanvas . draw Rect ( left , Ġrect . top , Ġright , Ġrect . bottom , Ġpaint ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġdraw Bar ( canvas : ĠCanvas , Ġbar : ĠBar ) Ġ{ ĊĠĠĠ Ġval Ġrect Ġ= Ġget Rect ( bar ) ĊĠĠĠ Ġif Ġ( bar Ġ== ĠBar . A ) Ġ{ ĊĠĠĠĠĠ Ġalpha Background . setBounds ( rect . left . toInt (), Ġrect . top . toInt (), Ġrect . right . toInt (), Ġrect . bottom . toInt ()) ĊĠĠĠĠĠ Ġalpha Background . draw ( canvas ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġcolors Ġ= Ġwhen Ġ( bar ) Ġ{ ĊĠĠĠĠĠ ĠBar . H Ġ-> ĠInt Array ( Bar . H . max ) Ġ{ Ġget H SV Color ( Bar . A . max , Ġh Ġ= Ġit . toFloat ()) Ġ} ĊĠĠĠĠĠ ĠBar . S Ġ-> Ġint ArrayOf ( get H SV Color ( Bar . A . max , Ġs Ġ= Ġ 0 f ), Ġget H SV Color ( Bar . A . max , Ġs Ġ= ĠBar . S . max . toFloat ())) ĊĠĠĠĠĠ ĠBar . V Ġ-> Ġint ArrayOf ( get H SV Color ( Bar . A . max , Ġv Ġ= Ġ 0 f ), Ġget H SV Color ( Bar . A . max , Ġv Ġ= ĠBar . V . max . toFloat ())) ĊĠĠĠĠĠ ĠBar . R Ġ-> Ġint ArrayOf ( get RGB Color ( Bar . A . max , Ġr Ġ= Ġ 0 ), Ġget RGB Color ( Bar . A . max , Ġr Ġ= ĠBar . R . max )) ĊĠĠĠĠĠ ĠBar . G Ġ-> Ġint ArrayOf ( get RGB Color ( Bar . A . max , Ġg Ġ= Ġ 0 ), Ġget RGB Color ( Bar . A . max , Ġg Ġ= ĠBar . G . max )) ĊĠĠĠĠĠ ĠBar . B Ġ-> Ġint ArrayOf ( get RGB Color ( Bar . A . max , Ġb Ġ= Ġ 0 ), Ġget RGB Color ( Bar . A . max , Ġb Ġ= ĠBar . B . max )) ĊĠĠĠĠĠ ĠBar . A Ġ-> Ġint ArrayOf ( get Panel Color ( 0 ), Ġget Panel Color ( Bar . A . max )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġpaint . shader Ġ= Ġwhen Ġ( colors . size Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠ Ġtrue Ġ-> ĠLinear Gradient ( rect . left , Ġrect . top , Ġrect . right , Ġrect . top , Ġcolors [ 0 ], Ġcolors [ 1 ], ĠTile Mode . CLAMP ) ĊĠĠĠĠĠ Ġelse Ġ-> ĠLinear Gradient ( rect . left , Ġrect . top , Ġrect . right , Ġrect . top , Ġcolors , Ġnull , ĠTile Mode . CLAMP ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġcanvas . draw Rect ( rect , Ġpaint ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Bar Value ( bar : ĠBar ): ĠFloat Ġ= Ġwhen Ġ( bar ) Ġ{ ĊĠĠĠ ĠBar . H Ġ-> Ġh sv [ 0 ] ĊĠĠĠ ĠBar . S Ġ-> Ġh sv [ 1 ] ĊĠĠĠ ĠBar . V Ġ-> Ġh sv [ 2 ] ĊĠĠĠ ĠBar . R Ġ-> Ġarg b . red . toFloat () ĊĠĠĠ ĠBar . G Ġ-> Ġarg b . green . toFloat () ĊĠĠĠ ĠBar . B Ġ-> Ġarg b . blue . toFloat () ĊĠĠĠ ĠBar . A Ġ-> Ġarg b . alpha . toFloat () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġset Bar Value ( bar : ĠBar , Ġvalue : ĠFloat ) Ġ{ ĊĠĠĠ Ġwhen Ġ( bar ) Ġ{ ĊĠĠĠĠĠ ĠBar . H Ġ-> Ġh sv [ 0 ] Ġ= Ġvalue ĊĠĠĠĠĠ ĠBar . S Ġ-> Ġh sv [ 1 ] Ġ= Ġvalue ĊĠĠĠĠĠ ĠBar . V Ġ-> Ġh sv [ 2 ] Ġ= Ġvalue ĊĠĠĠĠĠ ĠBar . R Ġ-> Ġarg b Ġ= Ġget RGB Color ( r Ġ= Ġvalue . toInt ()) ĊĠĠĠĠĠ ĠBar . G Ġ-> Ġarg b Ġ= Ġget RGB Color ( g Ġ= Ġvalue . toInt ()) ĊĠĠĠĠĠ ĠBar . B Ġ-> Ġarg b Ġ= Ġget RGB Color ( b Ġ= Ġvalue . toInt ()) ĊĠĠĠĠĠ ĠBar . A Ġ-> Ġarg b Ġ= Ġget RGB Color ( a Ġ= Ġvalue . toInt ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġwhen Ġ( bar ) Ġ{ ĊĠĠĠĠĠ ĠBar . H , ĠBar . S , ĠBar . V Ġ-> Ġarg b Ġ= Ġcolor ĊĠĠĠĠĠ ĠBar . R , ĠBar . G , ĠBar . B Ġ-> ĠColor . RGB To H SV ( arg b . red , Ġarg b . green , Ġarg b . blue , Ġh sv ) ĊĠĠĠĠĠ Ġelse Ġ-> ĠUnit ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Bars (): ĠList < Bar > Ġ= Ġwhen Ġ( mode ) Ġ{ ĊĠĠĠ ĠMode . H SV A Ġ-> ĠlistOf ( Bar . H , ĠBar . S , ĠBar . V , ĠBar . A ) ĊĠĠĠ ĠMode . RGBA Ġ-> ĠlistOf ( Bar . R , ĠBar . G , ĠBar . B , ĠBar . A ) ĊĠĠĠ ĠMode . H SV Ġ-> ĠlistOf ( Bar . H , ĠBar . S , ĠBar . V ) ĊĠĠĠ ĠMode . RGB Ġ-> ĠlistOf ( Bar . R , ĠBar . G , ĠBar . B ) ĊĠĠĠ ĠMode . A Ġ-> ĠlistOf ( Bar . A ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Rect ( bar : ĠBar ): ĠRect F Ġ= Ġwhen Ġ{ ĊĠĠĠ Ġbar Ġ== ĠBar . S Ġ|| Ġbar Ġ== ĠBar . G Ġ-> Ġrect s [ 1 ] ĊĠĠĠ Ġbar Ġ== ĠBar . V Ġ|| Ġbar Ġ== ĠBar . B Ġ-> Ġrect s [ 2 ] ĊĠĠĠ Ġbar Ġ== ĠBar . A Ġ&& Ġmode Ġ!= ĠMode . A Ġ-> Ġrect s [ 3 ] ĊĠĠĠ Ġelse Ġ-> Ġrect s [ 0 ] ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġset Panel Color (@ Color Int Ġcolor : ĠInt ) Ġ{ ĊĠĠĠ Ġarg b Ġ= Ġcolor ĊĠĠĠ ĠColor . RGB To H SV ( color . red , Ġcolor . green , Ġcolor . blue , Ġh sv ) ĊĠĠĠ Ġinvalidate () ĊĠ Ġ} ĊĊĠ Ġ@ Color Int ĊĠ Ġprivate Ġfun Ġget Panel Color ( a : ĠInt ): ĠInt Ġ= Ġwhen Ġ( mode ) Ġ{ ĊĠĠĠ ĠMode . H SV , ĠMode . H SV A Ġ-> Ġget H SV Color ( a Ġ= Ġa ) ĊĠĠĠ Ġelse Ġ-> Ġget RGB Color ( a Ġ= Ġa ) ĊĠ Ġ} ĊĊĠ Ġ@ Color Int ĊĠ Ġprivate Ġfun Ġget H SV Color ( a : ĠInt Ġ= Ġarg b . alpha , Ġh : ĠFloat Ġ= Ġh sv [ 0 ], Ġs : ĠFloat Ġ= Ġh sv [ 1 ], Ġv : ĠFloat Ġ= Ġh sv [ 2 ]): ĠInt Ġ{ ĊĠĠĠ Ġreturn ĠColor . H SV To Color ( a , Ġfloat ArrayOf ( h , Ġs Ġ, Ġv )) ĊĠ Ġ} ĊĊĠ Ġ@ Color Int ĊĠ Ġprivate Ġfun Ġget RGB Color ( a : ĠInt Ġ= Ġarg b . alpha , Ġr : ĠInt Ġ= Ġarg b . red , Ġg : ĠInt Ġ= Ġarg b . green , Ġb : ĠInt Ġ= Ġarg b . blue ): ĠInt Ġ{ ĊĠĠĠ Ġreturn ĠColor . arg b ( a , Ġr , Ġg , Ġb ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġval ĠInt . dp : ĠInt Ġget () Ġ= Ġ( this Ġ* Ġresources . display Metrics . density ). round ToInt () ĊĊĠ Ġenum Ġclass ĠMode Ġ{ ĠH SV A , ĠRGBA , ĠH SV , ĠRGB , ĠA Ġ} ĊĊĠ Ġprivate Ġenum Ġclass ĠBar ( val Ġmax : ĠInt ) Ġ{ ĠH ( 3 6 0 ), ĠS ( 1 ), ĠV ( 1 ), ĠR ( 2 5 5 ), ĠG ( 2 5 5 ), ĠB ( 2 5 5 ), ĠA ( 2 5 5 ) Ġ} Ċ } Ċ