/* Ċ Ġ* Ġ ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠNet E ase , ĠInc . Ġ ĠAll Ġrights Ġreserved . Ċ Ġ* Ġ ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġa ĠMIT Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile Ċ Ġ*/ Ċ Ċ package Ġcom . net ease . biz _ live . yun xin . live . audience . ui . view Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . view . View Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . Pager Snap Helper Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroidx . recyclerview . widget . RecyclerView . On Child Attach State ChangeListener Ċ import Ġandroidx . recyclerview . widget . RecyclerView . Recycler Ċ import Ġandroidx . recyclerview . widget . Snap Helper Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġl uc Ġon Ġ 2 0 2 0 / 1 1 / 1 9 . Ċ Ġ*/ Ċ class ĠP ager Vertical LayoutManager ( context : ĠContext ?) Ġ: ĊĠĠĠ ĠLinearLayoutManager ( context , ĠV ERT ICAL , Ġfalse ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæĺ¯åĲ¦ ä¸º recyclerview Ġ é¦ĸ æ¬¡ åĬłè½½ æķ°æį® ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġis First Load Ġ= Ġtrue ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åŃĲ view Ġattach Ġwindow Ġ çĬ¶æĢģ åıĺåĮĸ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġon Child Attach State ChangeListener : ĠOn Child Attach State ChangeListener Ġ= ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠOn Child Attach State ChangeListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Child View Attached To Window ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Changed Listener ?. on Page Init ( getPosition ( view )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is First Load ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis First Load Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġget Position ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Position Ġ= Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( page Changed Listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Changed Listener ?. on Page Selected ( position , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Limit Ġ= Ġtrue Ġ// ĠåĪĿå§ĭåĮĸ ä½įç½® è®¤ä¸º æŃ¤ æ¬¡ æ»ĳ åĬ¨ åľ¨ ç«¯ çĤ¹ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Child View Detached From Window ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Changed Listener ?. on Page Release ( getPosition ( view )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġsnap Helper : ĠSnap Helper ? ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ é¡µéĿ¢ æ»ļ åĬ¨ åĽŀè°ĥ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġpage Changed Listener : ĠOn Page Changed Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġä¸Ĭ ä¸Ģæ¬¡ selected Ġ è®°å½ķ ä½įç½® ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġlast Position Ġ= Ġ- 1 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æłĩè®° æĺ¯åĲ¦ ä¸º é¡µéĿ¢ æľĢ åīį / æľĢåĲİ çļĦæķ°æį® ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġis Limit Ġ= Ġfalse ĊĊĠĠĠ Ġ// Ġ éģ¿åħį è¯·æ±Ĥ çĦ ¦ çĤ¹ åĩºçİ° æ»ļ åĬ¨ ï¼Ľ ĊĠĠĠ Ġoverride Ġfun Ġrequest Child Rectangle On Screen ( ĊĠĠĠĠĠĠĠ Ġparent : ĠRecyclerView , ĊĠĠĠĠĠĠĠ Ġchild : ĠView , ĊĠĠĠĠĠĠĠ Ġrect : ĠRect , ĊĠĠĠĠĠĠĠ Ġimmediate : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġfocused Child Visible : ĠBoolean ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ éģ¿åħį çĦ ¦ çĤ¹ è¯·æ±Ĥ å¤±è´¥ å¯¼èĩ´ é¡µéĿ¢ éĩįæĸ° å¡« åħħ ï¼Į åĩºçİ° ä¸ĭ ä¸Ģä¸ª view è¿Ľè¡Į attach Ġwindow Ġæĵ įä½ľ ï¼Ľ ĊĠĠĠ Ġoverride Ġfun Ġon Focus Search Failed ( ĊĠĠĠĠĠĠĠ Ġfocused : ĠView , ĊĠĠĠĠĠĠĠ Ġfocus Direction : ĠInt , ĊĠĠĠĠĠĠĠ Ġre cycler : ĠRe cycler , ĊĠĠĠĠĠĠĠ Ġstate : ĠRecyclerView . State ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Scroll StateChanged ( state : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( state Ġ!= ĠRecyclerView . SCROLL _ STATE _ IDLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcurrent View Ġ= Ġsnap Helper ?. find Snap View ( this ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġget Position ( current View ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ä½įç½® çĽ¸åĲĮ ä¸Ķ åĪ¤æĸŃ ä¸į ä¸º é¦ĸ éĥ¨ / å°¾ éĥ¨ æķ°æį® æ»ĳ åĬ¨ ä¸į è¿Ľè¡Į åĽŀè°ĥ ĊĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġlast Position Ġ&& Ġ! is Limit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Limit Ġ= Ġtrue Ġ// Ġ ä½įç½® çĽ¸åĲĮ Ġ åĪĻ åı¯èĥ½ æĺ¯ é¦ĸ éĥ¨ / å°¾ éĥ¨ æķ°æį® ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( page Changed Listener Ġ!= Ġnull Ġ&& Ġchild Count Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpage Changed Listener ?. on Page Selected ( position , Ġis Limit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlast Position Ġ= Ġposition ĊĠĠĠĠĠĠĠ Ġis Limit Ġ= Ġtrue Ġ// Ġæ » ĳ åĬ¨ æĹ¶ è®¤ä¸º æ¯ıä¸ª çĤ¹ éĥ½ åı¯èĥ½ æĹ¶ ç«¯ çĤ¹ æķ°æį® ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset On Page Changed Listener ( page Changed Listener : ĠOn Page Changed Listener ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . page Changed Listener Ġ= Ġpage Changed Listener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Attached To Window ( view : ĠRecyclerView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Attached To Window ( view ) ĊĠĠĠĠĠĠĠ Ġsnap Helper ?. attach To RecyclerView ( view ) ĊĠĠĠĠĠĠĠ Ġview . add On Scroll Listener ( object Ġ: ĠRecyclerView . On Scroll Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sc rolled ( re cyclerView : ĠRecyclerView , Ġdx : ĠInt , Ġdy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Sc rolled ( re cyclerView , Ġdx , Ġdy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Limit Ġ= Ġdy Ġ== Ġ 0 Ġ// Ġå¦Ĥæŀľ åŃĺåľ¨ çº µ åĲĳ æ»ĳ åĬ¨ åıĺåĮĸ åĪĻ è¯´æĺİ ä¸į åľ¨ ç«¯ çĤ¹ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġview . add On Child Attach State ChangeListener ( on Child Attach State ChangeListener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ é¡µéĿ¢ æ»ĳ åĬ¨ çĽĳåĲ¬ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinterface ĠOn Page Changed Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ é¡µéĿ¢ åĪĿå§ĭåĮĸ å®ĮæĪĲ ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġposition Ġ é¡µéĿ¢ position ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġopen Ġfun Ġon Page Init ( position : ĠInt ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ é¡µéĿ¢ æ»ĳ åĬ¨ æĹ¶ è°ĥçĶ¨ ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġposition Ġå½ĵåīį é¡µéĿ¢ ä½įç½® ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġis Limit Ġ Ġæĺ¯åĲ¦ ä¸º æ»ĳ åĬ¨ æĸ¹åĲĳ çļĦ æľĢåĲİ ä¸ĢæĿ¡ ï¼Į ç«¯ çĤ¹ åĪ¤æĸŃ éĢ»è¾ĳ ï¼Į è®¤ä¸º æ¯ıæ¬¡ æ»ĳ åĬ¨ åĲİ éĥ½ åĪ° è¾¾ äºĨ ç«¯ çĤ¹ ï¼Į ä½Ĩæĺ¯ éĢļè¿ĩ Ġdy Ġ ä¿®æŃ£ æĺ¯åĲ¦ çľŁ æŃ£ åĪ° è¾¾ ç«¯ çĤ¹ ï¼Ľ ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġopen Ġfun Ġon Page Selected ( position : ĠInt , Ġis Limit : ĠBoolean ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ é¡µéĿ¢ éĶĢ æ¯ ģ æĹ¶ è°ĥçĶ¨ ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġposition Ġ é¡µéĿ¢ position ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġopen Ġfun Ġon Page Release ( position : ĠInt ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġsnap Helper Ġ= ĠP ager Snap Helper () ĊĠĠĠ Ġ} Ċ }