package Ġcom . workbook . li u wb . workbook . actions . custom view . view group Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Scroller Ċ import Ġcom . workbook . li u wb . my library . utils . Logger Ċ import Ġkotlin . math . abs Ċ Ċ /** Ċ Ġ* Ġåľ¨ èĩªå®ļä¹ī ViewGroup ä¸Ń ï¼Į å¿ħé¡» è¦ģ å®ŀçİ° çļĦ æŃ¥éª¤ ï¼Ī æĸ¹æ³ķ ï¼ī æľī ï¼ļ æµĭ éĩı -- ãĢĭ å¸ĥå±Ģ -- ãĢĭ ç»ĺ åĪ¶ Ċ Ġ* Ġ ç»ĺ åĪ¶ è¿ĩç¨ĭ ï¼ļ å¯¹äºİ èĩªå®ļä¹ī ViewGroup çļĦ ç»ĺ åĪ¶ ï¼Į åħ¶å®ŀ å°±æĺ¯ åŃĲ è§ĨåĽ¾ çļĦ ç»ĺ åĪ¶ è¿ĩç¨ĭ ï¼Į åıª éľĢè¦ģ è®© åŃĲ è§ĨåĽ¾ èĩª è¡Į ç»ĺ åĪ¶ åį³åı¯ Ċ Ġ* Ġ ä¹Łå°±æĺ¯ è¯´ ï¼Į å¯¹äºİ ViewGroup çļĦ ç»ĺ åĪ¶ è¿ĩç¨ĭ ä¸įéľĢè¦ģ éĩį åĨĻ ç»ĺ åĪ¶ çļĦæĸ¹æ³ķ Ċ Ġ*/ Ċ class ĠCar ousel View Ġ: ĠViewGroup Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġchild Views : ĠInt Ġ= Ġ 0 // Ġ åŃĲ è§ĨåĽ¾ ä¸ªæķ° ĊĠĠĠ Ġprivate Ġvar Ġchild Width : ĠInt Ġ= Ġ 0 // Ġ åŃĲ è§ĨåĽ¾ å®½åº¦ ĊĠĠĠ Ġprivate Ġvar Ġchild Height : ĠInt Ġ= Ġ 0 // Ġ åŃĲ è§ĨåĽ¾ é«ĺåº¦ ĊĊĠĠĠ Ġprivate Ġvar Ġx : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġstart X : ĠInt Ġ= Ġ 0 // Ġ æĮī ä¸ĭ æĹ¶çļĦ æ¨ ª åĿĲæłĩ ĊĠĠĠ Ġprivate Ġvar Ġindex Ġ= Ġ 0 // Ġ åĽ¾çīĩ ç´¢å¼ķ ĊĊĠĠĠ Ġprivate Ġvar Ġsc roller : ĠSc roller ? Ġ= Ġnull ĊĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġsuper ( context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Obj () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ) Ġ: Ġsuper ( context , Ġattrs ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Obj () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet , Ġdef Style Attr : ĠInt ) Ġ: Ġsuper ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Obj () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Obj () Ġ{ ĊĠĠĠĠĠĠĠ Ġsc roller Ġ= ĠSc roller ( context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcompute Scroll () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . compute Scroll () ĊĠĠĠĠĠĠĠ Ġif Ġ( sc roller !!. compute Scroll Offset ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscroll To ( sc roller !!. curr X , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¯¹äºİ æµĭ éĩı æĿ¥è¯´ å°±æĺ¯ on Measure ĊĠĠĠĠ Ġ* Ġ çĶ±äºİ è¦ģ å®ŀçİ° çļĦæĺ¯ ä¸Ģä¸ª åŁºäºİ ViewGroup çļĦ å®¹åĻ¨ ï¼Į æīĢä»¥ æĥ³è¦ģ æµĭ éĩı è¿Ļä¸ª ViewGroup çļĦ å®½ é«ĺ ï¼Į éĤ£ä¹Ī å°± å¿ħé¡» åħĪ åİ» æµĭ éĩı æīĢæľī åŃĲ è§ĨåĽ¾ çļĦ ĊĠĠĠĠ Ġ* Ġ å®½ é«ĺ ä¹ĭ åĴĮ ï¼Į æīįèĥ½ çŁ¥éģĵ è¿Ļä¸ª ViewGroup çļĦ å®½ é«ĺ æĺ¯ å¤ļå°ĳ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġwidth Measure Spec ĊĠĠĠĠ Ġ* Ġ@ param Ġheight Measure Spec ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Measure ( width Measure Spec , Ġheight Measure Spec ) ĊĠĠĠĠĠĠĠ Ġ// Ġ 1 ãĢģ æ±Ĥ åĩº åŃĲ è§ĨåĽ¾ çļĦ ä¸ªæķ° ĊĠĠĠĠĠĠĠ Ġchild Views Ġ= Ġchild Count ĊĠĠĠĠĠĠĠ Ġif Ġ( 0 Ġ== Ġchild Views ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Measured Dimension ( 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 2 ãĢģ æµĭ éĩı åŃĲ è§ĨåĽ¾ çļĦ å®½ é«ĺ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeasure Children ( width Measure Spec , Ġheight Measure Spec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// æŃ¤ æĹ¶ å°± èĥ½å¤Ł çŁ¥éģĵ ï¼Į è¯¥ ViewGroup çļĦ é«ĺåº¦ å°±æĺ¯ ç¬¬ä¸Ģä¸ª åŃĲ è§ĨåĽ¾ çļĦ é«ĺåº¦ ï¼Į å®½åº¦ å°±æĺ¯ ç¬¬ä¸Ģä¸ª åŃĲ è§ĨåĽ¾ çļĦ å®½åº¦ Ġ* Ġ åŃĲ è§ĨåĽ¾ çļĦ ä¸ªæķ° ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġget Child At ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 3 ãĢģ æł¹æį® åŃĲ è§ĨåĽ¾ çļĦ å®½ é«ĺ æĿ¥ æ±Ĥ åĩº è¯¥ ViewGroup çļĦ å®½ é«ĺ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild Width Ġ= Ġview . meas ured Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild Height Ġ= Ġview . meas ured Height ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġchild Width Ġ* Ġchild Views ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġchild Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Measured Dimension ( width , Ġheight ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¯¹äºİ å¸ĥå±Ģ æĿ¥è¯´ å°±æĺ¯ on Layout ĊĠĠĠĠ Ġ* Ġ ç»§æī¿ èĩª ViewGroup å¿ħé¡» å®ŀçİ° on Layout æĸ¹æ³ķ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġchanged Ġå½ĵ ViewGroup å¸ĥå±Ģ ä½įç½® åıĳçĶŁ æĶ¹åıĺ çļĦæĹ¶åĢĻ ä¸º true ĊĠĠĠĠ Ġ* Ġ@ param Ġl ĊĠĠĠĠ Ġ* Ġ@ param Ġt ĊĠĠĠĠ Ġ* Ġ@ param Ġr ĊĠĠĠĠ Ġ* Ġ@ param Ġb ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Layout ( changed : ĠBoolean , Ġl : ĠInt , Ġt : ĠInt , Ġr : ĠInt , Ġb : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( changed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġleft Margin Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġchild Views ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġget Child At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . layout ( left Margin , Ġ 0 , Ġleft Margin Ġ+ Ġchild Width , Ġchild Height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Margin Ġ+= Ġchild Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ äºĭä»¶ ä¼łéĢĴ è¿ĩç¨ĭä¸Ń è°ĥçĶ¨ çļĦæĸ¹æ³ķ ï¼ļ ĊĠĠĠĠ Ġ* ĠéľĢè¦ģ è°ĥçĶ¨ å®¹åĻ¨ çļĦ äºĭä»¶ æĭ ¦ æĪª æĸ¹æ³ķ on Intercept Touch Event ĊĠĠĠĠ Ġ* Ġ å¯¹äºİ è¯¥ ViewGroup ï¼Į æĺ¯ å¸ĮæľĽ æİ¥åıĹ è¯¥ äºĭä»¶ çļĦ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġev ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue ï¼ļ å®¹åĻ¨ æĭ ¦ æĪª æŃ¤ æ¬¡ äºĭä»¶ ï¼Į äºĭä»¶ åģľæŃ¢ ä¼łéĢĴ ãĢĤ false ï¼ļ å®¹åĻ¨ ä¸į æĭ ¦ æĪª æŃ¤ æ¬¡ äºĭä»¶ ï¼Į äºĭä»¶ ç»§ç»Ń åĲĳ ä¸ĭ ä¼łéĢĴ ĊĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġoverride Ġfun Ġon Intercept Touch Event ( ev : ĠMotion Event ): ĠBoolean Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġtrue Ċ // ĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ çľŁ æŃ£ å¤ĦçĲĨ çĤ¹åĩ» äºĭä»¶ çļĦæĸ¹æ³ķ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠçĶ¨ ä¸¤ ä¸Ń æĸ¹å¼ı å®ŀçİ° è½® æĴŃ ĊĠĠĠĠ Ġ* Ġ 1 ãĢģ åĪ©çĶ¨ scrollTo ãĢģ scroll By å®ŀçİ° æīĭåĬ¨ è½® æĴŃ ĊĠĠĠĠ Ġ* Ġ 2 ãĢģ åĪ©çĶ¨ Scroller ç±» å®ŀçİ° èĩªåĬ¨ è½® æĴŃ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġevent ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue : åĳĬ è¯ī è¯¥ ViewGroup çļĦ çĪ¶ å®¹åĻ¨ ä»¥ å·²ç»ı å¤ĦçĲĨ å¥½ äºĨ è¯¥ äºĭä»¶ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( event . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! sc roller !!. is Finished ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsc roller !!. abort Animation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġevent . x . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart X Ġ= Ġx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmove X Ġ= Ġevent . x . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance Ġ= Ġmove X Ġ- Ġx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscroll By (- distance , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġmove X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscroll X Ġ= Ġscroll X Ġ// Ġscroll X / scroll Y ä»£è¡¨ è¯ķ åĽ¾ æĢ» åħ± å·² æ»ĳ åĬ¨ è¿ĩ çļĦ è·Ŀç¦» ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . e (" Ġ ĠCar ousel ViewGroup ĠACTION _ UP Ġ 1 1 1 2 2 2 Ġ$ scroll X ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp X Ġ= Ġ( start X Ġ- Ġevent . x ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( abs ( temp X ) Ġ>= Ġchild Width Ġ* Ġ 0 . 1 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( temp X Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ< Ġ 0 ) Ġ{// Ġ è¯´æĺİ æ»ĳ åĬ¨ åĪ°äºĨ æľĢ å·¦ è¾¹ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( index Ġ> Ġchild Views Ġ- Ġ 1 ) Ġ{// Ġ è¯´æĺİ æ»ĳ åĬ¨ åĪ°äºĨ æľĢ åı³ è¾¹ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġchild Views Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscroll To / scroll By çļĦæĸ¹å¼ı ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscroll To ( index Ġ* Ġchild Width , Ġ 0 ); ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSc roller çļĦæĸ¹å¼ı ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdx Ġ= Ġindex Ġ* Ġchild Width Ġ- Ġscroll X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsc roller !!. start Scroll ( scroll X , Ġ 0 , Ġdx , Ġ 0 , Ġ 3 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Invalidate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġperform Click (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġrequest Layout () ĊĠĠĠĠĠĠĠ Ġrequest Focus () ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . perform Click () ĊĠĠĠ Ġ} Ċ } Ċ