package Ġcom . trad wang . r uler view Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . Velocity Tracker Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Scroller Ċ Ċ /** Ċ Ġ* Ġ åĪ» åº¦ å° º Ċ Ġ* ĠæĶ¯æĮģ [ Rule Model ] ç§į åĪ» åº¦ ç±»åŀĭ Ġ æ³¨ ï¼ļ åŀ Ĥ çĽ´ åĴĮ æ°´ å¹³ æĸ¹åĲĳ çļĦ çĽ´ çº¿ åĪ» åº¦ æľª å®ŀçİ° åŁº çº¿ ï¼Į åŀ Ĥ çĽ´ åĴĮ æ°´ å¹³ æĸ¹åĲĳ çļĦ å¼ § å½¢ åĪ» åº¦ å° º æľª å®ŀçİ° éĢī ä¸ŃçļĦ åĪ» åº¦ æł·å¼ı Ċ Ġ* Ġ[ R uler Decorator ] ç±» å¤ĦçĲĨ åħ¨éĥ¨ çļĦ ç»ĺ åĪ¶ åıĬ æ»ĳ åĬ¨ Ċ Ġ* Ġ[ R uler Delegate ] ç±» å¤ĦçĲĨ èĩªå®ļä¹ī å±ŀæĢ§ çļĦ ç®¡çĲĨ Ċ Ġ* Ġ[ R uler View ] ç±» å¤ĦçĲĨ è§¦ æĳ ¸ äºĭä»¶ Ċ Ġ* Ġ@ version Ġ 0 . 0 . 1 Ċ Ġ* Ġ@ author ĠTr ad W ang Ċ Ġ* Ġ@ date Ġ 2 0 1 9 - 4 - 2 5 Ċ Ġ*/ Ċ class ĠR uler View Ġ: ĠView Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġdefault Width Ġ= Ġ 2 0 0 ĊĠĠĠ Ġprivate Ġval Ġdefault Height Ġ= Ġ 2 0 0 ĊĊĠĠĠ Ġ// æĮī ä¸ĭçļĦ X ĊĠĠĠ Ġprivate Ġvar Ġdown X Ġ= Ġ 0 f ĊĠĠĠ Ġ// æĮī ä¸ĭçļĦ Y ĊĠĠĠ Ġprivate Ġvar Ġdown Y Ġ= Ġ 0 f ĊĊĠĠĠ Ġvar Ġview Width Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġview Height Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġ// æĺ¯åĲ¦ åı¯çĶ¨ ĊĠĠĠ Ġvar Ġenable Ġ= Ġtrue ĊĠĠĠ Ġ// ç§»åĬ¨ çļĦ X è·Ŀç¦» ĊĠĠĠ Ġprivate Ġvar Ġmove X Ġ= Ġ 0 f ĊĠĠĠ Ġ// ç§»åĬ¨ çļĦ Y è·Ŀç¦» ĊĠĠĠ Ġprivate Ġvar Ġmove Y Ġ= Ġ 0 f ĊĊĠĠĠ Ġprivate Ġval Ġm Scroller : ĠSc roller Ġby Ġlazy Ġ{ ĠSc roller ( context ) Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm R uler Delegate Ġby Ġlazy Ġ{ ĠR uler Delegate () Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm Velocity Tracker : ĠVe locity Tracker Ġby Ġlazy Ġ{ ĠVe locity Tracker . obtain () Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm R uler Decorator : ĠR uler Decorator ĊĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġsuper ( context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( context , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ?) Ġ: Ġsuper ( context , Ġattrs ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( context , Ġattrs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ?, Ġdef Style Attr : ĠInt ) Ġ: Ġsuper ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( context , Ġattrs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit ( context : ĠContext , Ġattrs : ĠAttributeSet ?) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġm R uler Delegate . setup ( context , Ġattrs ) ĊĠĠĠĠĠĠĠ Ġm R uler Decorator Ġ= ĠR uler Decorator ( this , Ġm R uler Delegate , Ġm Scroller , Ġm Velocity Tracker ) ĊĊĠĠĠĠĠĠĠ Ġinit Value ( m R uler Delegate . m MaxValue , Ġm R uler Delegate . m MinValue , Ġm R uler Delegate . m DefaultValue , Ġm R uler Delegate . m Unit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ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 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( w Ġ> Ġ 0 Ġ&& Ġh Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Width Ġ= Ġw Ġ- Ġ( padding Left Ġ+ Ġpadding Right ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Height Ġ= Ġh Ġ- Ġ( padding Top Ġ+ Ġpadding Bottom ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm R uler Decorator . on Size Changed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Enabled ( enabled : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġenable Ġ= Ġenabled ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Enabled (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġenable ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Measured Dimension ( get Measure Length ( width Measure Spec , Ġtrue ), Ġget Measure Length ( height Measure Spec , Ġfalse )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Measure Length ( length : ĠInt , Ġis Width : ĠBoolean ): ĠInt Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġmode Ġ= ĠMeasure Spec . get Mode ( length ) ĊĠĠĠĠĠĠĠ Ġval Ġmeasure Size Ġ= ĠMeasure Spec . getSize ( length ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġsize : ĠInt ĊĠĠĠĠĠĠĠ Ġval Ġpadding : ĠInt ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Width Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Ġ= Ġpadding Left Ġ+ Ġpadding Right ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mode Ġ== ĠMeasure Spec . EX ACT LY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġmeasure Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġpadding Ġ+ Ġdefault Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mode Ġ== ĠMeasure Spec . AT _ MO ST ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= ĠMath . min ( size , Ġmeasure Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Ġ= Ġpadding Top Ġ+ Ġpadding Bottom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mode Ġ== ĠMeasure Spec . EX ACT LY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġmeasure Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġpadding Ġ+ Ġdefault Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mode Ġ== ĠMeasure Spec . AT _ MO ST ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= ĠMath . min ( size , Ġmeasure Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsize ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Click ableView Accessibility ") ĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! enable ) Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġval Ġtouch X Ġ= Ġevent . x ĊĠĠĠĠĠĠĠ Ġval Ġtouch Y Ġ= Ġevent . y ĊĊĠĠĠĠĠĠĠ Ġm Velocity Tracker . add Movement ( event ) ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( event . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Scroller . force Finished ( true ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown X Ġ= Ġevent . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown Y Ġ= Ġevent . y ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove X Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove Y Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove X Ġ= Ġdown X Ġ- Ġtouch X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove Y Ġ= Ġdown Y Ġ- Ġtouch Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Scroll ( move X , Ġmove Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP , ĠMotion Event . ACTION _ CANCEL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown X Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown Y Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Fl ing Stop ( move X , Ġmove Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Velocity Tracker () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// åĲİ éĿ¢ å°± äº¤ ç»Ļ æĥ ¯ æĢ§ æ»ĳ åĬ¨ äºĨ Ġ è¿ĻéĩĮ çĽ´æİ¥ ä¸į æ¶Īè´¹ äºĭä»¶ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdown X Ġ= Ġtouch X ĊĠĠĠĠĠĠĠ Ġdown Y Ġ= Ġtouch Y ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// è®¡ç®Ĺ è¦ģ æĥ ¯ æĢ§ æ»ĳ åĬ¨ çļĦ è·Ŀç¦» ĊĠĠĠ Ġprivate Ġfun Ġcount Velocity Tracker () Ġ{ ĊĠĠĠĠĠĠĠ Ġm R uler Decorator . handle Fl ing () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcompute Scroll () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . compute Scroll () ĊĊĊĠĠĠĠĠĠĠ Ġif Ġ( m Scroller . compute Scroll Offset ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// X æĸ¹åĲĳ æĥ ¯ æĢ§ æ»ļ åĬ¨ åģľæŃ¢ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Scroller . curr X Ġ!= Ġm Scroller . final X ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove X Ġ= Ġdown X Ġ- Ġm Scroller . curr X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Scroll ( move X , Ġmove Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown X Ġ= Ġm Scroller . curr X . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Fl ing Stop ( move X , Ġmove Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Y æĸ¹åĲĳ æĥ ¯ æĢ§ æ»ļ åĬ¨ åģľæŃ¢ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Scroller . curr Y Ġ!= Ġm Scroller . final Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove Y Ġ= Ġdown Y Ġ- Ġm Scroller . curr Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Scroll ( move X , Ġmove Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown Y Ġ= Ġm Scroller . curr Y . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Fl ing Stop ( move X , Ġmove Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Fl ing Stop ( move X : ĠFloat , Ġmove Y : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm R uler Decorator . handle Fl ing Stop ( move X , Ġmove Y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm R uler Decorator . handle Draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetValue ( max Value : ĠFloat , Ġmin Value : ĠFloat , ĠdefaultValue : ĠFloat , Ġunit : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm R uler Decorator . setValue ( max Value , Ġmin Value , ĠdefaultValue , Ġunit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Value ( max Value : ĠFloat , Ġmin Value : ĠFloat , ĠdefaultValue : ĠFloat , Ġunit : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm R uler Decorator . init Value ( max Value , Ġmin Value , ĠdefaultValue , Ġunit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset Touch () Ġ{ ĊĠĠĠĠĠĠĠ Ġmove X Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġmove Y Ġ= Ġ 0 f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Select Listener ( listener : Ġ(( value : ĠFloat ) Ġ-> ĠUnit )? ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm R uler Decorator . set Select Listener ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Scroll ( x : ĠFloat , Ġy : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm R uler Decorator . handle Scroll ( x , Ġy ) ĊĠĠĠ Ġ} Ċ } Ċ