package Ġcom . xy o ye . stream _ component . ui . weight Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics .* Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Motion Event Ċ import Ġandroidx . appcompat . widget . AppCompat ImageView Ċ import Ġcom . xy o ye . common _ component . utils . dp 2 px Ċ import Ġcom . xy o ye . stream _ component . R Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ import Ġkotlin . math . sqrt ĊĊ Ċ /** Ċ Ġ* ĠCreated Ġby Ġx yo ye Ġon Ġ 2 0 2 1 / 3 / 2 9 . Ċ Ġ*/ Ċ Ċ class ĠRemote Control View Ġ: ĠAppCompat ImageView Ġ{ ĊĊĠĠĠ Ġ// ç»ĺ åĪ¶ æ¨¡å¼ı ï¼ļ ä¸Ĭ ãĢģ ä¸ĭ ãĢģ å·¦ ãĢģ åı³ ĊĠĠĠ Ġprivate Ġvar Ġm Mode : ĠInt Ġ= Ġ 4 ĊĊĠĠĠ Ġ// çĤ¹åĩ» æĹ¶ é¢ľèī² ĊĠĠĠ Ġprivate Ġvar Ġm Pressed Color : ĠInt Ġ= ĠColor . RED ĊĊĠĠĠ Ġ// æŃ£å¸¸ èĥĮæĻ¯ é¢ľèī² ĊĠĠĠ Ġprivate Ġvar Ġm Color : ĠInt Ġ= ĠColor . BLUE ĊĊĠĠĠ Ġ// åľĨ çļĦ è¾¹ æ¡Ĩ é¢ľèī² ĊĠĠĠ Ġprivate Ġvar Ġm Center Stroke Color Ġ= ĠColor . WHITE ĊĊĠĠĠ Ġ// æĺ¯åĲ¦ å¤Ħ äºİ çĤ¹åĩ» çĬ¶æĢģ ĊĠĠĠ Ġprivate Ġvar Ġm Is Pressed Ġ= Ġfalse ĊĊĠĠĠ Ġ// å¤ĸ åľĨ ĊĠĠĠ Ġprivate Ġvar Ġfull Sector Rect F Ġ= ĠRect F ( 0 f , Ġ 0 f , Ġ 0 f , Ġ 0 f ) ĊĊĠĠĠ Ġ// åĨħ åľĨ ĊĠĠĠ Ġprivate Ġvar Ġinner Sector Rect F Ġ= ĠRect F ( 0 f , Ġ 0 f , Ġ 0 f , Ġ 0 f ) ĊĊĠĠĠ Ġprivate Ġvar Ġsector Path Ġ= ĠPath () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Paint : ĠPaint ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Stroke Paint : ĠPaint ĊĊĠĠĠ Ġconstructor ( context : ĠContext ?) Ġ: Ġthis ( context , Ġnull ) ĊĠĠĠ Ġconstructor ( context : ĠContext ?, Ġattrs : ĠAttributeSet ?) Ġ: Ġthis ( context , Ġattrs , Ġ 0 ) ĊĠĠĠ Ġconstructor ( context : ĠContext ?, Ġattrs : ĠAttributeSet ?, Ġdef Style Attr : ĠInt ) Ġ: Ġsuper ( ĊĠĠĠĠĠĠĠ Ġcontext !! , ĊĠĠĠĠĠĠĠ Ġattrs , ĊĠĠĠĠĠĠĠ Ġdef Style Attr ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( attrs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit ( attrs : ĠAttributeSet ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġattribute Ġ= Ġcontext . obtain Styled Attributes ( attrs , ĠR . style able . Remote Control View ) ĊĠĠĠĠĠĠĠ Ġm Mode Ġ= Ġattribute . getInt ( R . style able . Remote Control View _ control _ mode , Ġm Mode ) ĊĠĠĠĠĠĠĠ Ġm Color Ġ= Ġattribute . getColor ( R . style able . Remote Control View _ control _ color , Ġm Color ) ĊĠĠĠĠĠĠĠ Ġm Pressed Color Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattribute . getColor ( R . style able . Remote Control View _ control _ pressed _ color , Ġm Pressed Color ) ĊĠĠĠĠĠĠĠ Ġm Center Stroke Color Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattribute . getColor ( R . style able . Remote Control View _ center _ stroke _ color , Ġm Center Stroke Color ) ĊĠĠĠĠĠĠĠ Ġattribute . recycle () ĊĊĠĠĠĠĠĠĠ Ġm Paint Ġ= ĠPaint (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= ĠPaint . Style . FILL _ AND _ ST RO KE ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstrokeWidth Ġ= Ġdp 2 px ( 1 ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Stroke Paint Ġ= ĠPaint (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= ĠPaint . Style . ST RO KE ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstrokeWidth Ġ= Ġdp 2 px ( 1 ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= Ġm Center Stroke Color ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// æł¹æį® çĪ¶ å¸ĥå±Ģ å®½ é«ĺ ï¼Į è°ĥæķ´ åľĨ å¼ § å®½ é«ĺ ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= ĠMeasure Spec . getSize ( width Measure Spec ) ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= ĠMeasure Spec . getSize ( height Measure Spec ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( m Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Width Ġ= Ġwidth Ġ/ Ġ 2 f Ġ* Ġsqrt ( 2 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Measured Dimension ( new Width . toInt (), Ġheight ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 , Ġ 3 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Height Ġ= Ġheight Ġ/ Ġ 2 f Ġ* Ġsqrt ( 2 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Measured Dimension ( width , Ġnew Height . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Size Ġ= Ġwidth Ġ* Ġsqrt ( 2 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Measured Dimension ( new Size . toInt (), Ġnew Size . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// è¾ĥ éķ¿ çļĦ è¾¹ è®° ä¸º å®½ ï¼Į è¾ĥ çŁŃ ä¸º é«ĺ ĊĠĠĠĠĠĠĠ Ġval Ġcalc Width Ġ= Ġmax ( meas ured Height , Ġmeasured Width ). toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġcalc Height Ġ= Ġmin ( meas ured Height , Ġmeasured Width ). toFloat () ĊĊĠĠĠĠĠĠĠ Ġcanvas ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Mode Ġ== Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Center Circle ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Sector ( it , Ġcalc Width , Ġcalc Height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Click ableView Accessibility ") ĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( event Ġ== Ġnull Ġ|| Ġ! is Touch Valid ( event )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Pressed Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( event . action Ġ== ĠMotion Event . ACTION _ DOWN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Pressed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( event . action Ġ== ĠMotion Event . ACTION _ UP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Pressed Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Touch Event ( event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ çĶ» æī ĩ å½¢ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdraw Sector ( canvas : ĠCanvas , Ġcalc Width : ĠFloat , Ġcalc Height : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// æī ĩ å½¢ è¶Ĭ è¿ĩ è§Ĵ åº¦ ä¸º 9 0 ĊĠĠĠĠĠĠĠ Ġval Ġangle Ġ= Ġ 3 6 0 Ġ/ Ġ 4 f ĊĊĠĠĠĠĠĠĠ Ġ// åľĨ å¿ĥ X , ĠY ĊĠĠĠĠĠĠĠ Ġvar Ġcircle Center X Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġvar Ġcircle Center Y Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġ// èµ· å§ĭ è§Ĵ åº¦ ĊĠĠĠĠĠĠĠ Ġvar Ġstart Angle Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( m Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ä¸Ĭ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Angle Ġ= Ġ- 1 3 5 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcircle Center X Ġ= Ġwidth Ġ/ Ġ 2 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcircle Center Y Ġ= Ġcalc Width Ġ/ Ġsqrt ( 2 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ä¸ĭ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Angle Ġ= Ġ 4 5 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcircle Center X Ġ= Ġwidth Ġ/ Ġ 2 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcircle Center Y Ġ= Ġcalc Height Ġ- Ġ( calc Width Ġ/ Ġsqrt ( 2 f )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// å·¦ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Angle Ġ= Ġ 1 3 5 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcircle Center X Ġ= Ġcalc Width Ġ/ Ġsqrt ( 2 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcircle Center Y Ġ= Ġheight Ġ/ Ġ 2 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// åı³ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Angle Ġ= Ġ- 4 5 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcircle Center X Ġ= Ġcalc Height Ġ- Ġ( calc Width Ġ/ Ġsqrt ( 2 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcircle Center Y Ġ= Ġheight Ġ/ Ġ 2 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// å¤ĸ åľĨ åįĬ å¾Ħ ĊĠĠĠĠĠĠĠ Ġval Ġouter Radius Ġ= Ġcalc Width Ġ/ Ġsqrt ( 2 f ) ĊĊĠĠĠĠĠĠĠ Ġfull Sector Rect F . set ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( circle Center X Ġ- Ġouter Radius ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( circle Center Y Ġ- Ġouter Radius ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( circle Center X Ġ+ Ġouter Radius ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( circle Center Y Ġ+ Ġouter Radius ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// åĨħ åľĨ åįĬ å¾Ħ ĊĠĠĠĠĠĠĠ Ġval Ġinner Radius Ġ= Ġ( outer Radius Ġ- Ġcalc Height ) Ġ* Ġsqrt ( 2 f ) ĊĊĠĠĠĠĠĠĠ Ġinner Sector Rect F . set ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( circle Center X Ġ- Ġinner Radius ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( circle Center Y Ġ- Ġinner Radius ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( circle Center X Ġ+ Ġinner Radius ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( circle Center Y Ġ+ Ġinner Radius ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// è·¯å¾Ħ ĊĠĠĠĠĠĠĠ Ġsector Path . arc To ( full Sector Rect F , Ġstart Angle , Ġangle ) ĊĠĠĠĠĠĠĠ Ġsector Path . arc To ( inner Sector Rect F , Ġ( start Angle Ġ+ Ġangle ), Ġ(- angle )) ĊĠĠĠĠĠĠĠ Ġsector Path . close () ĊĊĠĠĠĠĠĠĠ Ġ// ä¸įåĲĮ çĤ¹åĩ» çĬ¶æĢģ ä¸ĭ é¢ľèī² ĊĠĠĠĠĠĠĠ Ġif Ġ( m Is Pressed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Paint . color Ġ= Ġm Pressed Color ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Paint . color Ġ= Ġm Color ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcanvas . draw Path ( sector Path , Ġm Paint ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ çĶ» åľĨ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdraw Center Circle ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġradius Ġ= Ġmeasured Width Ġ/ Ġ 2 f Ġ- Ġ 1 f ĊĠĠĠĠĠĠĠ Ġval Ġcircle Center X Ġ= Ġmeasured Width Ġ/ Ġ 2 f ĊĠĠĠĠĠĠĠ Ġval Ġcircle Center Y Ġ= Ġmeasured Height Ġ/ Ġ 2 f ĊĊĠĠĠĠĠĠĠ Ġ// è·¯å¾Ħ ĊĠĠĠĠĠĠĠ Ġsector Path . add Circle ( circle Center X , Ġcircle Center Y , Ġradius , ĠPath . Direction . CW ) ĊĠĠĠĠĠĠĠ Ġsector Path . close () ĊĊĠĠĠĠĠĠĠ Ġ// ä¸įåĲĮ çĤ¹åĩ» çĬ¶æĢģ ä¸ĭ é¢ľèī² ĊĠĠĠĠĠĠĠ Ġif Ġ( m Is Pressed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Paint . color Ġ= Ġm Pressed Color ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Paint . color Ġ= Ġm Color ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcanvas . draw Path ( sector Path , Ġm Paint ) ĊĠĠĠĠĠĠĠ Ġcanvas . draw Circle ( circle Center X , Ġcircle Center Y , Ġradius , Ġm Stroke Paint ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** * ĊĠĠĠĠ Ġ* ĠåĪ¤æĸŃ çĤ¹åĩ» æĺ¯åĲ¦ åľ¨ è·¯å¾Ħ åĮºåŁŁ åĨħ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Touch Valid ( event : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbounds Ġ= ĠRect F () ĊĠĠĠĠĠĠĠ Ġval Ġregion Ġ= ĠRegion () ĊĊĠĠĠĠĠĠĠ Ġsector Path . compute Bounds ( bounds , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġregion . set Path ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsector Path , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRegion ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbounds . left . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbounds . top . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbounds . right . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbounds . bottom . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġregion . contains ( event . x . toInt (), Ġevent . y . toInt ()) ĊĠĠĠ Ġ} Ċ }