package Ġcom . he w king . u ikit . sticky top čĊč Ċ import Ġandroid . content . Context č Ċ import Ġandroidx . core . view . Motion Event Compat č Ċ import Ġandroid . util . Attribute Set č Ċ import Ġandroid . view . Motion Event č Ċ import Ġandroid . view . Velocity Tracker č Ċ import Ġandroid . view . View č Ċ import Ġandroid . view . ViewGroup č Ċ import Ġandroid . widget . Scroller č Ċ import Ġcom . he w king . u ikit . R čĊč Ċ /** čĊ Ġ* Ġ ç±»çļĦ æııè¿° ï¼ļ čĊ Ġ* ĠåĪĽå»º äººåĳĺ ï¼ļ he w king čĊ Ġ* ĠåĪĽå»º æĹ¶éĹ´ ï¼ļ 2 0 1 8 / 5 / 6 čĊ Ġ* Ġä¿®æĶ¹ äººåĳĺ ï¼ļ he w king čĊ Ġ* Ġä¿®æĶ¹ æĹ¶éĹ´ ï¼ļ 2 0 1 8 / 5 / 6 čĊ Ġ* Ġä¿®æĶ¹ å¤ĩ æ³¨ ï¼ļ čĊ Ġ* ĠVersion : Ġ 1 . 0 . 0 čĊ Ġ* čĊ Ġ* Ġ éľĢæ±Ĥ čĊ Ġ* Ġ 1 . ä¸¤ éĥ¨åĪĨ Ġheader Ġtarget čĊ Ġ* Ġ 2 . Ġheader ĠåĴĮ Ġtarget Ġæĺ¯ è¿ŀ ç»Ń çļĦ Ġ ç±»ä¼¼ äºİ ĠLinearLayout Ġvertical čĊ Ġ* Ġ 3 . Ġå½ĵ header Ġæ » ĳ åĬ¨ åĪ° éļĲèĹı æĹ¶ Ġï¼Į æŃ¤ æĹ¶ äºĭä»¶ åĪĨ åıĳ éľĢè¦ģ èĢĥèĻĳ åĪ° target Ġæĺ¯åĲ¦ æĶ¯æĮģ æ»ĳ åĬ¨ čĊ Ġ* Ġ 4 . å¦Ĥæŀľ æĶ¯æĮģ Ġ åĪĻ æĬĬ æ»ĳ åĬ¨ äºĭä»¶ äº¤ ç»Ļ Ġtarget Ġï¼Į æ»ĳ åĬ¨ åĮħæĭ¬ äºĨ Ġ Ġ åĲĳ ä¸Ĭ æ»ĳ æĪĸèĢħ åĲĳ ä¸ĭ æ»ĳ Ġå¦Ĥæŀľ æĺ¯ åĲĳ ä¸ĭ æ»ĳ åĬ¨ Ġ å¹¶ä¸Ķ ä¸įèĥ½ æ»ĳ åĬ¨ äºĨ čĊ Ġ* Ġ äºĭä»¶ ä¸į äº¤ ç»Ļ target Ġ èĩªå·± å¤ĦçĲĨ ĠæĬ Ĭ header Ġæ » ĳ ä¸ĭ æĿ¥ čĊ Ġ* čĊ Ġ*/ č Ċ class ĠSt ick Top Pane Layout ( ctx Ġ: ĠContext , attrs Ġ: ĠAttributeSet ) Ġ: ĠViewGroup ( ctx , attrs ) Ġ{ čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* Ġ å¤´ éĥ¨ view čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġprivate Ġvar Ġm Head View Ġ: ĠView ? Ġ= Ġnull čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* Ġ çĶ¨äºİ å¤ĦçĲĨ æ»ĳ åĬ¨ äºĭä»¶ åĪĨ åıĳ çļĦ v åŃĲ iew čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġprivate Ġvar Ġm Target View Ġ: ĠView ? Ġ= Ġnull čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* Ġsc roller Ġ å¤ĦçĲĨ æ»ĳ åĬ¨ čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġprivate Ġval Ġm Scroller Ġ: ĠSc roller Ġby Ġlazy { čĊĠĠĠĠĠĠĠ ĠSc roller ( context ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* Ġ å¤ĦçĲĨ èİ·åıĸ éĢŁåº¦ čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġprivate Ġval Ġm Velocity Tracker Ġ: ĠVe locity Tracker Ġby Ġlazy Ġ{ čĊĠĠĠĠĠĠĠ ĠVe locity Tracker . obtain () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġinit Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġtype Array Ġ= Ġctx . obtain Styled Attributes ( attrs , ĠR . style able . Stick Top Pane Layout ) čĊĠĠĠĠĠĠĠ Ġtype Array . recycle () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġon Finish Inf late () Ġ{ čĊĠĠĠĠĠĠĠ Ġsuper . on Finish Inf late () čĊĠĠĠĠĠĠĠ Ġ// Ġ ç»Ļ view Ġ èµĭåĢ¼ čĊĠĠĠĠĠĠĠ Ġif Ġ( m Head View Ġ== Ġnull ) Ġ{ čĊčĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( m Target View Ġ== Ġnull ) Ġ{ čĊčĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ čĊĠĠĠĠĠĠĠ Ġ// Ġæµ ĭ éĩı è¿ĩ Ġ çİ°åľ¨ å·²ç»ı æľī æµĭ éĩı è¿ĩ çļĦåĢ¼ äºĨ č Ċ // ĠĠĠĠĠĠĠ Ġsuper . on Measure ( width Measure Spec , Ġheight Measure Spec ) čĊĠĠĠĠĠĠĠ Ġensure Header And Target View () čĊĠĠĠĠĠĠĠ Ġmeasure Children ( width Measure Spec , height Measure Spec ) čĊĠĠĠĠĠĠĠ Ġvar ĠmaxWidth Ġ= Ġ 0 čĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. child Count Ġ- Ġ 1 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( getChild At ( i ). meas ured Width Ġ> ĠmaxWidth ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmaxWidth Ġ= Ġget Child At ( i ). meas ured Width čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġset Measured Dimension ( maxWidth ,( m Head View ?. meas ured Height ?: 0 ) Ġ+ Ġ( m Target View ?. meas ured Height !! Ġ?: 0 )) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġensure Header And Target View () Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( m Head View Ġ!= Ġnull Ġ&& Ġm Target View Ġ!= Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġif Ġ( m Head View Ġ== Ġnull Ġ&& Ġm Target View Ġ== Ġnull Ġ&& Ġchild Count Ġ> Ġ 1 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ è¿ĻéĩĮ è¿ĺ éľĢè¦ģ ä¿Ŀè¯ģ head view ĠåĴĮ Ġtarget view ĠçļĦ é¡ºåºı ä¸Ģå®ļ æĺ¯ Ġ 0 Ġæĺ¯ header Ġ 1 Ġæĺ¯ Ġtarget view čĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Head View Ġ= Ġget Child At ( 0 ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Target View Ġ= Ġget Child At ( 1 ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġon Layout ( changed : ĠBoolean , Ġl : ĠInt , Ġt : ĠInt , Ġr : ĠInt , Ġb : ĠInt ) Ġ{ čĊĠĠĠĠĠĠĠ Ġensure Header And Target View () čĊĠĠĠĠĠĠĠ Ġm Head View ?. let Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . layout ( l , t , r , it . meas ured Height ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġm Target View ?. let Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . layout ( l , m Head View ?. meas ured Height ?: t , r , it . meas ured Height Ġ+ Ġm Head View ?. meas ured Height !! ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġvar Ġlast Y Ġ= Ġ 0 f čĊčĊĠĠĠ Ġoverride Ġfun Ġdispatch Touch Event ( ev : ĠMotion Event ): ĠBoolean Ġ{ čĊĠĠĠĠĠĠĠ Ġwhen ( ev . action Mask ed ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġ{ čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġ{ čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . dispatch Touch Event ( ev ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġon Intercept Touch Event ( ev : ĠMotion Event ): ĠBoolean Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= ĠMotion Event Compat . getAction Mask ed ( ev ) čĊĠĠĠĠĠĠĠ Ġval Ġoffset End Ġ= Ġm Head View !!. height čĊĠĠĠĠĠĠĠ Ġvar Ġintercept Ġ= Ġfalse čĊĠĠĠĠĠĠĠ Ġwhen ( action ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġheader Ġæ ² ¡ æľī æ»ĳ åĬ¨ åĪ° é¡¶ éĥ¨ Ġ ç»§ç»Ń æĭ ¦ æĪª čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Y Ġ= Ġev . y čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintercept Ġ= Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ åĨħéĥ¨ æĭ ¦ æĪª æ³ķ Ġå¦Ĥæŀľ éľĢè¦ģ æĭ ¦ æĪª å°± æĭ ¦ æĪª čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( scroll Y Ġ< Ġoffset End Ġ|| Ġscroll Y Ġ< Ġ 0 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintercept Ġ= Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ, ĠMotion Event . ACTION _ CANCEL -> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġreturn Ġintercept čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( ev : ĠMotion Event ): ĠBoolean Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġoffset End Ġ= Ġm Head View !!. height čĊĠĠĠĠĠĠĠ Ġwhen ( ev ?. action Mask ed ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Y Ġ= Ġev . y čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdy Ġ= Ġev . y Ġ- Ġlast Y čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Y Ġ= Ġev . y čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġæ » ĳ åĬ¨ åĪ° header ĠçļĦ é«ĺåº¦ åģľæŃ¢ æ»ĳ åĬ¨ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ å¹¶ä¸Ķ éĩįæĸ° åĪĨ åıĳ down äºĭä»¶ ç»Ļ åŃĲ view čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( scroll Y Ġ- Ġdy Ġ> Ġoffset End ) Ġ{ č Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Action Ġ= Ġev . action č Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġev . action Ġ= ĠMotion Event . ACTION _ DOWN č Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Touch Event ( ev ) č Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġev . action Ġ= Ġold Action čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( scroll Y Ġ<= Ġ 0 Ġ&& Ġdy Ġ> Ġ 0 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscroll By ( 0 ,- dy . toInt ()) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Touch Event ( ev ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġsmooth To ( dis X Ġ: ĠInt Ġ, Ġdis Y Ġ: ĠInt ){ čĊĠĠĠĠĠĠĠ Ġval Ġdx Ġ= Ġdis X Ġ- Ġscroll X čĊĠĠĠĠĠĠĠ Ġval Ġdy Ġ= Ġdis Y Ġ- Ġscroll Y čĊĠĠĠĠĠĠĠ Ġm Scroller . start Scroll ( scroll X , dx , scroll Y , dy ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġcompute Scroll () Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( m Scroller . compute Scroll Offset ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġscroll To ( 0 , m Scroller . curr X ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġrequest Dis allow Intercept Touch Event ( dis allow Intercept : ĠBoolean ) Ġ{ čĊĠĠĠĠĠĠĠ Ġsuper . request Dis allow Intercept Touch Event ( dis allow Intercept ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġacquire Velocity (){ čĊčĊĠĠĠ Ġ} čĊč Ċ }