package Ġcom . github . jd mb otero . ag end av iew . util Ċ Ċ import Ġandroid . annotation . Target Api Ċ import Ġandroid . os . Build Ċ import Ġandroid . support . v 4 . view . View Compat Ċ import Ġandroid . support . v 7 . widget .* Ċ import Ġandroid . util . Display Metrics Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . view . animation . Interpolator Ċ import Ġandroid . widget . Scroller ĊĊ Ċ class ĠSnap To Block Ġinternal Ġconstructor ( // ĠMax im Ġblocks Ġto Ġmove Ġduring Ġmost Ġv ig or ous Ġfl ing . ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġm Max Fl ing Blocks : ĠInt ) Ġ: ĠSnap Helper () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġm RecyclerView : ĠRecyclerView ? Ġ= Ġnull ĊĊĠĠĠ Ġ// ĠTotal Ġnumber Ġof Ġitems Ġin Ġa Ġblock Ġof Ġview Ġin Ġthe ĠRecyclerView ĊĠĠĠ Ġprivate Ġvar Ġm Block size : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġ// ĠMaximum Ġnumber Ġof Ġpositions Ġto Ġmove Ġon Ġa Ġfl ing . ĊĠĠĠ Ġprivate Ġvar Ġm Max Positions To Move : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġ// ĠWidth Ġof Ġa ĠRecyclerView Ġitem Ġif Ġorientation Ġis Ġh oriz onal ; Ġheight Ġof Ġthe Ġitem Ġif Ġvertical ĊĠĠĠ Ġprivate Ġvar Ġm Item Dimension : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġ// ĠCallback Ġinterface Ġwhen Ġblocks Ġare Ġsn apped . ĊĠĠĠ Ġprivate Ġvar Ġm Snap Block Callback : ĠSnap Block Callback ? Ġ= Ġnull ĊĊĠĠĠ Ġ// ĠWhen Ġsn apping , Ġused Ġto Ġdetermine Ġdirection Ġof Ġsnap . ĊĠĠĠ Ġprivate Ġvar Ġm Prior First Position Ġ= ĠRecyclerView . NO _ POSITION ĊĊĠĠĠ Ġ// ĠOur Ġprivate Ġsc roller ĊĠĠĠ Ġprivate Ġvar Ġm Scroller : ĠSc roller ? Ġ= Ġnull ĊĊĠĠĠ Ġ// ĠHorizontal / vertical Ġlayout Ġhelper ĊĠĠĠ Ġprivate Ġvar Ġm Orientation Helper : ĠOrientation Helper ? Ġ= Ġnull ĊĊĠĠĠ Ġ// ĠL TR / RTL Ġhelper ĊĠĠĠ Ġprivate Ġvar Ġm Layout Direction Helper : ĠLayout Direction Helper ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Throws ( IllegalStateException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġattach To RecyclerView ( re cyclerView : ĠRecyclerView ?) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( re cyclerView Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm RecyclerView Ġ= Ġre cyclerView ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Manager Ġ= Ġre cyclerView . layout Manager Ġas ĠLinearLayoutManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( layout Manager . can Scroll H orizontally ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Orientation Helper Ġ= ĠOrientation Helper . create Horizontal Helper ( layout Manager ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Layout Direction Helper Ġ= ĠLayout Direction Helper ( View Compat . get Layout Direction ( m RecyclerView )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( layout Manager . can Scroll Vert ically ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Orientation Helper Ġ= ĠOrientation Helper . create Vertical Helper ( layout Manager ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRTL Ġdoesn 't Ġmatter Ġfor Ġvertical Ġscrolling Ġfor Ġthis Ġclass . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Layout Direction Helper Ġ= ĠLayout Direction Helper ( RecyclerView . LAYOUT _ DIRECTION _ LTR ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" RecyclerView Ġmust Ġbe Ġscroll able ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Scroller Ġ= ĠSc roller ( m RecyclerView !!. context , Ġs Interpolator ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Item Dimension IfNeeded ( layout Manager ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . attach To RecyclerView ( re cyclerView ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCalled Ġwhen Ġthe Ġtarget Ġview Ġis Ġavailable Ġand Ġwe Ġneed Ġto Ġknow Ġhow Ġmuch Ġmore ĊĠĠĠ Ġ// Ġto Ġscroll Ġto Ġget Ġit Ġl ined Ġup Ġwith Ġthe Ġside Ġof Ġthe ĠRecyclerView . ĊĠĠĠ Ġoverride Ġfun Ġcalculate Distance To Final Snap ( layout Manager : ĠRecyclerView . LayoutManager , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget View : ĠView ): ĠInt Array Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠInt Array ( 2 ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( layout Manager . can Scroll H orizontally ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout [ 0 ] Ġ= Ġm Layout Direction Helper !!. get Scroll To Align View ( target View ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( layout Manager . can Scroll Vert ically ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout [ 1 ] Ġ= Ġm Layout Direction Helper !!. get Scroll To Align View ( target View ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( m Snap Block Callback Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( out [ 0 ] Ġ== Ġ 0 Ġ&& Ġout [ 1 ] Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Snap Block Callback !!. on Block Sn apped ( layout Manager . getPosition ( target View )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Snap Block Callback !!. on Block Snap ( layout Manager . getPosition ( target View )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġout ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠWe Ġare Ġfl ing ing Ġand Ġneed Ġto Ġknow Ġwhere Ġwe Ġare Ġheading . ĊĠĠĠ Ġoverride Ġfun Ġfind Target Snap Position ( layout Manager : ĠRecyclerView . LayoutManager , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity X : ĠInt , Ġvelocity Y : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlm Ġ= Ġlayout Manager Ġas ĠLinearLayoutManager ĊĊĠĠĠĠĠĠĠ Ġinit Item Dimension IfNeeded ( layout Manager ) ĊĠĠĠĠĠĠĠ Ġm Scroller !!. fl ing ( 0 , Ġ 0 , Ġvelocity X , Ġvelocity Y , ĠInteger . MIN _ VALUE , ĠInteger . MAX _ VALUE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInteger . MIN _ VALUE , ĠInteger . MAX _ VALUE ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( velocity X Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġm Layout Direction Helper !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Positions To Move ( lm , Ġm Scroller !!. final X , Ġm Item Dimension ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( velocity Y Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Layout Direction Helper !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Positions To Move ( lm , Ġm Scroller !!. final Y , Ġm Item Dimension ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse ĠRecyclerView . NO _ POSITION ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠWe Ġhave Ġsc rolled Ġto Ġthe Ġneighborhood Ġwhere Ġwe Ġwill Ġsnap . ĠDetermine Ġthe Ġsnap Ġposition . ĊĠĠĠ Ġoverride Ġfun Ġfind Snap View ( layout Manager : ĠRecyclerView . LayoutManager ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSnap Ġto Ġa Ġview Ġthat Ġis Ġeither Ġ 1 ) Ġtoward Ġthe Ġbottom Ġof Ġthe Ġdata Ġand Ġtherefore Ġon Ġscreen , ĊĠĠĠĠĠĠĠ Ġ// Ġor , Ġ 2 ) Ġtoward Ġthe Ġtop Ġof Ġthe Ġdata Ġand Ġmay Ġbe Ġoff - screen . ĊĠĠĠĠĠĠĠ Ġval Ġsnap Pos Ġ= Ġcalc Target Position ( layout Manager Ġas ĠLinearLayoutManager ) ĊĠĠĠĠĠĠĠ Ġval Ġsnap View Ġ= Ġif Ġ( snap Pos Ġ== ĠRecyclerView . NO _ POSITION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager . find View By Position ( snap Pos ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( snap View Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" <<<< find Snap View Ġis Ġreturning Ġnull !") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" <<<< find Snap View Ġsnap os =" Ġ+ Ġsnap Pos ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsnap View ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠDoes Ġthe Ġheavy Ġl ifting Ġfor Ġfind Snap View . ĊĠĠĠ Ġprivate Ġfun Ġcalc Target Position ( layout Manager : ĠLinearLayoutManager ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsnap Pos : ĠInt ĊĠĠĠĠĠĠĠ Ġval Ġfirst Visible Pos Ġ= Ġlayout Manager . findFirst Visible Item Position () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( first Visible Pos Ġ== ĠRecyclerView . NO _ POSITION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRecyclerView . NO _ POSITION ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinit Item Dimension IfNeeded ( layout Manager ) ĊĠĠĠĠĠĠĠ Ġif Ġ( first Visible Pos Ġ>= Ġm Prior First Position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠScroll ing Ġtoward Ġbottom Ġof Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Complete Position Ġ= Ġlayout Manager . findFirst Comp let ely Visible Item Position () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first Complete Position Ġ!= ĠRecyclerView . NO _ POSITION Ġ&& Ġfirst Complete Position Ġ% Ġm Block size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsnap Pos Ġ= Ġfirst Complete Position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsnap Pos Ġ= Ġround Down To BlockSize ( first Visible Pos Ġ+ Ġm Block size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠScroll ing Ġtoward Ġtop Ġof Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsnap Pos Ġ= Ġround Down To BlockSize ( first Visible Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġto Ġsee Ġif Ġtarget Ġview Ġexists . ĠIf Ġit Ġdoesn 't , Ġforce Ġa Ġsmooth Ġscroll . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSnap Helper Ġonly Ġsnap s Ġto Ġexisting Ġviews Ġand Ġwill Ġnot Ġscroll Ġto Ġa Ġnon - ex istant Ġone . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġlimiting Ġfl ing Ġto Ġsingle Ġblock , Ġthen Ġthe Ġfollowing Ġis Ġnot Ġneeded Ġsince Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġviews Ġare Ġlikely Ġto Ġbe Ġin Ġthe ĠRecyclerView Ġpool . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( layout Manager . find View By Position ( snap Pos ) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Scroll Ġ= Ġm Layout Direction Helper !!. calculate Distance To Scroll ( layout Manager , Ġsnap Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm RecyclerView !!. smooth Scroll By ( to Scroll [ 0 ], Ġto Scroll [ 1 ], Ġs Interpolator ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Prior First Position Ġ= Ġfirst Visible Pos ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsnap Pos ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Item Dimension IfNeeded ( layout Manager : ĠRecyclerView . LayoutManager ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Item Dimension Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġchild : ĠView Ġ= Ġlayout Manager . getChild At ( 0 ) Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġif Ġ( layout Manager . can Scroll H orizontally ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Item Dimension Ġ= Ġchild . width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Block size Ġ= Ġget Span Count ( layout Manager ) Ġ* Ġ( m RecyclerView !!. width Ġ/ Ġm Item Dimension ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( layout Manager . can Scroll Vert ically ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Item Dimension Ġ= Ġchild . height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Block size Ġ= Ġget Span Count ( layout Manager ) Ġ* Ġ( m RecyclerView !!. height Ġ/ Ġm Item Dimension ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Max Positions To Move Ġ= Ġm Block size Ġ* Ġm Max Fl ing Blocks ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Span Count ( layout Manager : ĠRecyclerView . LayoutManager ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( layout Manager Ġis ĠGrid LayoutManager ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager . span Count ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġround Down To BlockSize ( trial Position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtrial Position Ġ- Ġtrial Position Ġ% Ġm Block size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġround Up To BlockSize ( trial Position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġround Down To BlockSize ( trial Position Ġ+ Ġm Block size Ġ- Ġ 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Scroller ( layout Manager : ĠRecyclerView . LayoutManager ): ĠLinear Smooth Scroller ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( layout Manager Ġ! is ĠRecyclerView . Smooth Scroller . Scroll Vector Provider ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġobject Ġ: ĠLinear Smooth Scroller ( m RecyclerView !!. getContext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Target Found ( target View : ĠView , Ġstate : ĠRecyclerView . State , Ġaction : ĠAction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsnap Dist ances Ġ= Ġcalculate Distance To Final Snap ( m RecyclerView !!. layout Manager , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdx Ġ= Ġsnap Dist ances [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdy Ġ= Ġsnap Dist ances [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġcalculate Time For De cel eration ( Math . max ( Math . abs ( dx ), ĠMath . abs ( dy ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( time Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction . update ( dx , Ġdy , Ġtime , Ġs Interpolator ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcalculate Speed Per Pixel ( display Metrics : ĠDisplay Metrics ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMIL LI SECONDS _ PER _ IN CH Ġ/ Ġdisplay Metrics . density D pi ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Snap Block Callback ( callback : ĠSnap Block Callback ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Snap Block Callback Ġ= Ġcallback ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠ ĠHelper Ġclass Ġthat Ġhandles Ġcalculations Ġfor ĠL TR Ġand ĠRTL Ġlayouts . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġinner Ġclass ĠLayout Direction Helper Ġ@ Target Api ( Build . VERSION _ CODES . J EL LY _ BE AN _ MR 1 ) ĊĠĠĠ Ġinternal Ġconstructor ( direction : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠIs Ġthe Ġlayout Ġan ĠRTL Ġone ? ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġm Is RTL : ĠBoolean Ġ= Ġdirection Ġ== ĠView . LAYOUT _ DIRECTION _ RTL ĊĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCalculate Ġthe Ġamount Ġof Ġscroll Ġneeded Ġto Ġalign Ġthe Ġtarget Ġview Ġwith Ġthe Ġlayout Ġedge . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġget Scroll To Align View ( target View : ĠView ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( m Is RTL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Orientation Helper !!. get Decorated End ( target View ) Ġ- Ġm RecyclerView !!. width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Orientation Helper !!. get Decorated Start ( target View ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalculate Ġthe Ġdistance Ġto Ġfinal Ġsnap Ġposition Ġwhen Ġthe Ġview Ġcorresponding Ġto Ġthe Ġsnap ĊĠĠĠĠĠĠĠĠ Ġ* Ġposition Ġis Ġnot Ġcurrently Ġavailable . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġlayout Manager ĠLinearLayoutManager Ġor Ġdesc end ent Ġclass ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtarget Pos ĠĠĠĠ Ġ- ĠAdapter Ġposition Ġto Ġsnap Ġto ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġint [ 2 ] Ġ{ x - distance Ġin Ġpixels , Ġy - distance Ġin Ġpixels } ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġcalculate Distance To Scroll ( layout Manager : ĠLinearLayoutManager , Ġtarget Pos : ĠInt ): ĠInt Array Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠInt Array ( 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Visible Pos : ĠInt ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Visible Pos Ġ= Ġlayout Manager . findFirst Visible Item Position () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( layout Manager . can Scroll H orizontally ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( target Pos Ġ<= Ġfirst Visible Pos ) Ġ{ Ġ// Ġscrolling Ġtoward Ġtop Ġof Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Is RTL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast View Ġ= Ġlayout Manager . find View By Position ( layout Manager . find Last Visible Item Position ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout [ 0 ] Ġ= Ġm Orientation Helper !!. get Decorated End ( last View ) Ġ+ Ġ( first Visible Pos Ġ- Ġtarget Pos ) Ġ* Ġm Item Dimension ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst View Ġ= Ġlayout Manager . find View By Position ( first Visible Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout [ 0 ] Ġ= Ġm Orientation Helper !!. get Decorated Start ( first View ) Ġ- Ġ( first Visible Pos Ġ- Ġtarget Pos ) Ġ* Ġm Item Dimension ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( layout Manager . can Scroll Vert ically ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( target Pos Ġ<= Ġfirst Visible Pos ) Ġ{ Ġ// Ġscrolling Ġtoward Ġtop Ġof Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst View Ġ= Ġlayout Manager . find View By Position ( first Visible Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout [ 1 ] Ġ= Ġfirst View . get Top () Ġ- Ġ( first Visible Pos Ġ- Ġtarget Pos ) Ġ* Ġm Item Dimension ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġout ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCalculate Ġthe Ġnumber Ġof Ġpositions Ġto Ġmove Ġin Ġthe ĠRecyclerView Ġgiven Ġa Ġscroll Ġamount ĊĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġthe Ġsize Ġof Ġthe Ġitems Ġto Ġbe Ġsc rolled . ĠReturn Ġintegral Ġmultiple Ġof Ġm BlockSize Ġnot ĊĠĠĠĠĠĠĠĠĠĠĠ Ġequal Ġto Ġzero . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġget Positions To Move ( ll m : ĠLinearLayoutManager , Ġscroll : ĠInt , Ġitem Size : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpositions To Move : ĠInt ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpositions To Move Ġ= Ġround Up To BlockSize ( Math . abs ( scroll ) Ġ/ Ġitem Size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( positions To Move Ġ< Ġm Block size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMust Ġmove Ġat Ġleast Ġone Ġblock ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpositions To Move Ġ= Ġm Block size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( positions To Move Ġ> Ġm Max Positions To Move ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCl amp Ġnumber Ġof Ġpositions Ġto Ġmove Ġso Ġwe Ġdon 't Ġget Ġwild Ġfl ing ing . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpositions To Move Ġ= Ġm Max Positions To Move ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( scroll Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpositions To Move Ġ*= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Is RTL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpositions To Move Ġ*= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( m Layout Direction Helper !!. is Direction To Bottom ( scroll Ġ< Ġ 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠScroll ing Ġtoward Ġthe Ġbottom Ġof Ġdata . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġround Down To BlockSize ( ll m . findFirst Visible Item Position ()) Ġ+ Ġpositions To Move ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġround Down To BlockSize ( ll m . find Last Visible Item Position ()) Ġ+ Ġpositions To Move ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠScroll ing Ġtoward Ġthe Ġtop Ġof Ġthe Ġdata . ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġis Direction To Bottom ( velocity Negative : ĠBoolean ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( m Is RTL ) Ġvelocity Negative Ġelse Ġ! velocity Negative ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠSnap Block Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Block Snap ( snap Position : ĠInt ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġon Block Sn apped ( snap Position : ĠInt ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġs Interpolator Ġ= ĠInterpol ator Ġ{ Ġt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ-= Ġ 1 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ* Ġi Ġ* Ġi Ġ+ Ġ 1 . 0 f ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠMIL LI SECONDS _ PER _ IN CH Ġ= Ġ 1 0 0 f ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" Snap To Block " ĊĠĠĠ Ġ} Ċ }