package Ġcn . l vs ong . lib . library . banner Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . PointF Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . recyclerview . widget .* Ċ Ċ /** Ċ Ġ* Ġhttps :// www . jian shu . com / p / 3 9 9 4 bb dcc 6 2 4 Ġ Ġ--> Ġæ » ĳ åĬ¨ å¤§å°ı æ¸ Ĳ åıĺ Ċ Ġ* Ġhttps :// www . jian shu . com / p / ba 8 ad 2 ab 9 a 5 7 Ċ Ġ* Ġhttps :// blog . cs dn . net / qq _ 4 0 8 6 1 3 6 8 / article / details / 1 0 1 1 9 9 4 7 0 Ċ Ġ* Ġhttps :// blog . cs dn . net / qq _ 3 4 1 9 8 2 0 6 / article / details / 8 9 8 8 1 8 1 7 Ġ--> ĠæĬ ĺ åı ł ç¼© æĶ¾ Ċ Ġ* Ġhttps :// blog . cs dn . net / my self 0 7 1 9 / article / details / 7 9 7 9 5 6 2 4 Ġ Ġ--> Ġ åĪĨæŀĲ éĢı å½ » Ċ Ġ* Ġhttps :// blog . cs dn . net / ww 8 9 7 5 3 2 1 6 7 / article / details / 8 6 5 8 5 2 1 4 Ċ Ġ* ĠDesc : Ġ æĹł éĻĲ å¾ªçİ¯ Ġ, ĠåĴĮ ä¸Ĭ ä¸Ģä¸ª æĢĿ è·¯ ä¸Ģèĩ´ Ċ Ġ* ĠAuthor : ĠJ oo yer Ċ Ġ* ĠDate : Ġ 2 0 1 9 - 0 8 - 2 8 Ċ Ġ* ĠTime : Ġ 1 8 : 2 5 Ċ Ġ*/ ĊĊ Ċ /** Ċ Ġ* Ġ@ param Ġitem Margin Ġ--> ĠItem Ġ éĹ´ éļĶ , é»ĺè®¤ Ġ 0 Ċ Ġ* Ġ@ param Ġitem Scroll Time Ġ--> ĠItem Ġä»İ å±ı å¹ķ å·¦ ä¾§ å®ĮæĪĲ æ¶Ī å¤± çļĦæĹ¶éĹ´ , æŃ¤ åĢ¼ è¶Ĭ å¤§ åľ¨ å±ı å¹ķ æ»ĳ è¿ĩ æĹ¶éĹ´ è¶Ĭ éķ¿ , åįķä½į æĺ¯ æ¯ « ç§Ĵ Ċ Ġ*/ Ċ open Ġclass ĠHorizontal LayoutManager ( ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠContext , ĊĠĠĠ Ġprivate Ġval Ġitem Margin : ĠInt Ġ= Ġ 0 , ĊĠĠĠ Ġprivate Ġval Ġitem Scroll Time : ĠLong Ġ= Ġ 1 2 0 0 Ċ ) Ġ: ĊĠĠĠ ĠRecyclerView . LayoutManager (), ĊĠĠĠ ĠRecyclerView . Smooth Scroller . Scroll Vector Provider Ġ{ ĊĊĠĠĠ Ġopen Ġlateinit Ġvar Ġm Orientation Helper : ĠOrientation Helper ĊĊĠĠĠ Ġopen Ġvar Ġitem Width : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è®°å½ķ Ġon Layout Children Ġæ ¬ ¡ æķ° , åĽłä¸º é¦ĸ æ¬¡ æīĭåĬ¨ æ»ĳ åĬ¨ æĹ¶ , ä¼ļ åľ¨ æĬ ¬ èµ· æīĭ æĿ¥ , è¿ĺ ä¼ļ åĽŀè°ĥ ä¸Ģæ¬¡ Ġon Layout Children () ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ æľī å°ı ä¼ Ļ ä¼ ´ çŁ¥éģĵ æĽ´ ä¼ĺ è§£åĨ³ æĸ¹æ³ķ , è®° å¾Ĺ æıĲ Ġissue Ġ, Ġ åħĪ è°¢ è¿ĩ !!! ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġm Layout Count Ġ= Ġ 1 ĊĊĠĠĠ Ġfun ĠgetItem Width And Margin (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġitem Width Ġ+ Ġitem Margin ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetItem Margin () Ġ= Ġitem Margin ĊĊĠĠĠ Ġprivate Ġval Ġlinear Smooth Scroller : ĠLinear Smooth Scroller Ġ= ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠLinear Smooth Scroller ( context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġè¿ĶåĽŀ è¶Ĭ å°ĳ , æ»ĳ åĬ¨ è¶Ĭ å¿« ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcalculate Time For De cel eration ( dx : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( item Scroll Time Ġ* Ġ( 1 Ġ- Ġ. 3 3 5 6 ) Ġ/ Ġ 2 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcalculate Dt To Fit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Start : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview End : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbox Start : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbox End : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsnap Preference : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhttps :// blog . cs dn . net / u 0 1 4 6 7 4 8 6 2 / article / details / 8 1 1 7 7 2 6 1 Ġ Ġ--> ĠAPI è§£æŀĲ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhttps :// blog . cs dn . net / u 0 1 3 6 5 1 0 2 6 / article / details / 1 0 5 9 8 9 9 1 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġåľ¨ Ġsuper . calculate Dt To Fit () ä¸Ń , ĠĠĠĠ Ġcase ĠS NAP _ TO _ START : Ġreturn Ġbox Start Ġ- Ġview Start ; ĠéĢļè¿ĩ æĹ¥å¿Ĺ åıĳçİ° åıªæľī Ġbox Start Ġ- Ġview Start Ġ< Ġ 0 Ġæĺ¯ åĲĳ å·¦ æ»ĳ åĬ¨ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ èĢĮ Ġbox Start Ġ== Ġ 0 Ġ, Ġåıª éľĢè¦ģ Ġview Start Ġ> Ġ 0 Ġ åį³åı¯ , Ġ æīĢä»¥ äºº ä¸º çļĦ å°Ĩ Ġview Start Ġ è¿Ľè¡Į è°ĥæķ´ , ä¿Ŀè¯ģ çķĮéĿ¢ åľ¨ èĩªåĬ¨ æ»ĳ åĬ¨ æĹ¶ æ°¸ éĺ³ å¾Ģ å·¦ æ»ĳ åĬ¨ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . calculate Dt To Fit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view Start Ġ> Ġ 0 ) Ġview Start Ġelse Ġ- view Start , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview End , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbox Start , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbox End , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsnap Preference ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Horizontal Snap Preference (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠS NAP _ TO _ START ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcompute Scroll Vector For Position ( target Position : ĠInt ): ĠPoint F ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġä¸ĭ éĿ¢ è¿Ļä¸ª åĨ³å®ļ äºĨ RecyclerView Ġ å·¦ åı³ æ»ĳ åĬ¨ çļĦ æĸ¹åĲĳ , åıªæľī èĩªåĬ¨ æ»ļ åĬ¨ æĹ¶ æīį ä¼ļ è§¦åıĳ æŃ¤ æĸ¹æ³ķ ĊĠĠĠĠĠĠĠ Ġ// Ġ çĶ±äºİ æīĭåĬ¨ æ»ĳ åĬ¨ æĶ¹åıĺ äºĨ Ġtarget Position , Ġ æīĢä»¥ ä¸ĭéĿ¢ åĪ¤æĸŃ ä¼ļ å¯¼èĩ´ ĊĠĠĠĠĠĠĠ Ġ// Ġå¦Ĥæŀľ èĩªåĬ¨ æ»ĳ åĬ¨ åĲĳ åı³ çļĦ , èĢĮ æīĭåĬ¨ æĺ¯ åĲĳ å·¦ çļĦ , éĤ£ æīĭåĬ¨ æ»ĳ åĬ¨ ç»ĵæĿŁ åĲİ , èĩªåĬ¨ å¼Ģå§ĭ æ»ĳ åĬ¨ ä¼ļ ä¹Ł åĲĳ å·¦ , Item View ä¼ļ æ»ĳ åĬ¨ å¤ļä¸ª ĊĠĠĠĠĠĠĠ Ġ// Ġ æīĢä»¥ å¼º åĪ¶ èĩªåĬ¨ æ»ĳ åĬ¨ åĲĳ åı³ Ċ // ĠĠĠĠĠĠĠ Ġval Ġfirst Child Pos Ġ= Ġget Position ( getChild At ( 0 ) !! ) Ċ // ĠĠĠĠĠĠĠ Ġval Ġdirection Ġ= Ġif Ġ( target Position Ġ< Ġfirst Child Pos ) Ġ- 1 Ġelse Ġ 1 ĊĠĠĠĠĠĠĠ Ġreturn ĠPoint F ( 1 F , Ġ 0 F ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate Default LayoutParams (): ĠRecyclerView . LayoutParams Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠRecyclerView . LayoutParams ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠViewGroup . LayoutParams . MATCH _ PARENT , ĠViewGroup . LayoutParams . WRAP _ CONTENT ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġdetach And Sc rap View () Ġ Ġremove And Re cycle View (), ä¸İ Ġdetach And Sc rap Attached Views () Ġ åĮº åĪ« ĊĠĠĠĠ Ġ* Ġdetach And Sc rap View () Ġ--> ĠéľĢè¦ģ åĪ·æĸ° çļĦæĹ¶åĢĻ ä½¿çĶ¨ ï¼Į åŃĲ view ä¸´ æĹ¶ ä¿Ŀ åŃĺåľ¨ Recycler ä¸ŃçļĦ m Attached Sc rap ä¸Ń , ä¸įä¼ļ å¼ķ èµ· éĩįæĸ° å¸ĥå±Ģ ï¼Į åĽłæŃ¤ æĺ¯ è½» éĩı çº§ çļĦ ĊĠĠĠĠ Ġ* Ġremove And Re cycle View () Ġ--> Ġåľ¨ åŃĲ view ç§» åĩº å±ı å¹ķ åĽŀ æĶ¶ æĹ¶ ä½¿çĶ¨ ï¼Į ä¿Ŀ åŃĺåľ¨ Recycler ä¸ŃçļĦ m Cached Views ä¸Ń , ä¼ļ å¼ķ èµ· éĩįæĸ° å¸ĥå±Ģ ĊĠĠĠĠ Ġ* Ġdetach And Sc rap Attached Views () Ġ--> Ġ åĽłä¸º RecyclerView åĪĿå§ĭåĮĸ çļĦæĹ¶åĢĻ on Layout Children ä¼ļ è°ĥçĶ¨ ä¸¤ æ¬¡ ï¼Į ç¬¬ ä¸Ģæ¬¡ çļĦæĹ¶åĢĻ å±ı å¹ķ ä¸Ĭ å·²ç»ı å¡« åħħ å¥½ åŃĲ view äºĨ ï¼Į ĊĠĠĠĠ Ġ* Ġ ç¬¬äºĮ æ¬¡ åĪ° æĿ¥ çļĦæĹ¶åĢĻ åıĪ ä¼ļ éĩįæĸ° è°ĥçĶ¨ ä¸Ģæ¬¡ fill å¡« åħħ åŃĲ view ï¼Į åĽłæŃ¤ fill ä¹ĭåīį åħĪ è°ĥçĶ¨ è½» éĩı çº§ çļĦ detach And Sc rap Attached Views æĬĬ åŃĲ view éĥ½ ç»Ļ ç§»éĻ¤ æİī ï¼Į ĊĠĠĠĠ Ġ* Ġ ä¸´ æĹ¶ ä¿Ŀ åŃĺåľ¨ ä¸Ģä¸ª éĽĨåĲĪ éĩĮ ï¼Į çĦ¶åĲİ è¿Ľåħ¥ fill çļĦæĹ¶åĢĻ ä¼ļ ä»İ è¿Ļä¸ª éĽĨåĲĪ åıĸ åĩºæĿ¥ éĩįæĸ° æ·»åĬł åĪ° RecyclerView ä¸Ń ï¼Į è¿Ļ å°±æĺ¯ åīį éĿ¢ è¯´ çļĦ ä¿Ŀ åŃĺåľ¨ m Attached Sc rap çļĦ åŃĲ view ä¼ļ é©¬ ä¸Ĭ çĶ¨ åĪ°çļĦ åİŁåĽł ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Layout Children ( recycler : ĠRecyclerView . Recycler , Ġstate : ĠRecyclerView . State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! this :: m Orientation Helper . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Orientation Helper Ġ= ĠOrientation Helper . create Horizontal Helper ( this ) ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( m Layout Count Ġ> Ġitem Count ) Ġ{ Ġ// Ġé»ĺè®¤ Ġm Layout Count = 1 , Ġå¦Ĥæŀľ Ġitem Count = 1 , Ġ åĪĻ ä¼ļ å¯¼èĩ´ çķĮéĿ¢ ç©º çĻ½ , Ġ æīĢä»¥ æĶ¹ ä¸º Ġ> Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( item Count Ġ== Ġ 0 Ġ|| Ġstate . is Pre Layout ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove And Re cycle All Views ( recycler ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// åĪĨ ç¦» å¹¶ä¸Ķ åĽŀ æĶ¶ å½ĵåīį éĻĦ åĬł çļĦæīĢæľī View ĊĠĠĠĠĠĠĠ Ġdetach And Sc rap Attached Views ( recycler ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ è®¡ç®Ĺ ä¸Ģä¸ª Item å®½åº¦ ĊĠĠĠĠĠĠĠ Ġval Ġscrap Ġ= Ġre cycler . getView For Position ( 0 ) ĊĠĠĠĠĠĠĠ Ġmeasure Child With Margins ( scrap , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġitem Width Ġ= Ġget Decorated Measured Width ( scrap ) ĊĊĠĠĠĠĠĠĠ Ġ// æ¨ ª åĲĳ ç»ĺ åĪ¶ åŃĲ View , åĪĻ éľĢè¦ģ çŁ¥éģĵ ĠX è½´ çļĦ åģı ç§» éĩı ĊĠĠĠĠĠĠĠ Ġvar Ġoffset X Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( m Orientation Helper . total Space Ġ- Ġm Orientation Helper . get Decorated Measurement ( scrap )) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġ// ç»ĺ åĪ¶ å¹¶ æ·»åĬł view ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġitem Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġre cycler . getView For Position ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( view ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeasure Child With Margins ( view , Ġ 0 , Ġ 0 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Width Ġ= Ġget Decorated Measured Width ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Height Ġ= Ġget Decorated Measured Height ( view ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Decorated ( view , Ġoffset X , Ġ 0 , Ġoffset X Ġ+ Ġview Width , Ġview Height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Decorated With Margins ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset X , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetItem Top ( view ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset X Ġ+ Ġitem Width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetItem Top ( view ) Ġ+ Ġview Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset X Ġ+= Ġitem Width Ġ+ Ġitem Margin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġä¼ļ éĢł æĪĲ æĮĩ ç¤º åĻ¨ å¼Ĥå¸¸ ( ä¸»è¦ģ æĺ¯ å¯¼èĩ´ è®¡ç®Ĺ child Count åĩºçİ° éĹ®é¢ĺ ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( offset X Ġ> Ġm Orientation Helper . total Space ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdo With Item () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetTotal Height (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġheight Ġ- Ġpadding Top Ġ- Ġpadding Bottom ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetItem Top ( item : ĠView ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( getTotal Height () Ġ- Ġget Decorated Measured Height ( item )) Ġ/ Ġ 2 Ġ+ Ġpadding Top ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// æĺ¯åĲ¦ åı¯ æ¨ ª åĲĳ æ»ĳ åĬ¨ ĊĠĠĠ Ġoverride Ġfun Ġcan Scroll H orizontally () Ġ= Ġitem Count Ġ> Ġ 1 ĊĊĊĠĠĠ Ġoverride Ġfun Ġsmooth Scroll To Position ( ĊĠĠĠĠĠĠĠ Ġre cyclerView : ĠRecyclerView , ĊĠĠĠĠĠĠĠ Ġstate : ĠRecyclerView . State , ĊĠĠĠĠĠĠĠ Ġposition : ĠInt ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlinear Smooth Scroller . target Position Ġ= Ġposition ĊĠĠĠĠĠĠĠ Ġstart Smooth Scroll ( linear Smooth Scroller ) Ċ Ċ // ĠĠĠĠĠĠĠ Ġsmooth Scroll By ( re cyclerView , Ġposition ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġscroll H orizontally By ()/ scroll Vert ically By () Ġæĸ¹æ³ķ ä¸Ń , ä¸ĢèĪ¬ æī§è¡Į åĽĽ ä¸ª æŃ¥éª¤ ĊĠĠĠĠ Ġ* Ġ 1 . Ġdx / dy ä¿®æŃ£ ĊĠĠĠĠ Ġ* Ġ 2 . ĠItem View Ġ å¡« åħħ ĊĠĠĠĠ Ġ* Ġ 3 . ĠItem View Ġ åģı ç§» ĊĠĠĠĠ Ġ* Ġ 4 . ĠItem View Ġ åĽŀ æĶ¶ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġscroll H orizontally By ( ĊĠĠĠĠĠĠĠ Ġdx : ĠInt , Ġre cycler : ĠRecyclerView . Recycler , Ġstate : ĠRecyclerView . State ĊĠĠĠ Ġ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġre cycle Views ( dx , Ġre cycler ) ĊĠĠĠĠĠĠĠ Ġfill ( dx , Ġre cycler ) ĊĠĠĠĠĠĠĠ Ġoffset Children Horizontal ( dx Ġ* Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġdo With Item () ĊĠĠĠĠĠĠĠ Ġreturn Ġdx ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfill ( dx : ĠInt , Ġre cycler : ĠRecyclerView . Recycler ) Ġ{ Ċ // ĠĠĠĠĠĠĠ ĠLog . e (" Horizontal "," fill =========== dx : Ġ$ dx , Ġ${ if Ġ( dx Ġ> 0 ) Ġ" å·¦ æ»ĳ " Ġelse Ġ" åı³ æ»ĳ "} " Ġ) ĊĠĠĠĠĠĠĠ Ġ// å·¦ æ»ĳ ĊĠĠĠĠĠĠĠ Ġif Ġ( dx Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// å¾ĹåĪ° å½ĵåīį å·² æ·»åĬł ï¼Ī åı¯ è§ģ ï¼ī çļĦ æľĢåĲİ ä¸Ģä¸ª åŃĲ View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Visible View Ġ= Ġget Child At ( child Count Ġ- Ġ 1 ) Ġ?: Ġbreak ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// å¦Ĥæŀľ æ»ĳ åĬ¨ è¿ĩ åĲİ ï¼Į View è¿ĺæĺ¯ æľª å®Įåħ¨ æĺ¾ç¤º åĩºæĿ¥ å°± Ġä¸į è¿Ľè¡Į ç»ĺ åĪ¶ ä¸ĭ ä¸Ģä¸ª View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Visible View . right Ġ- Ġdx Ġ> Ġwidth ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// å¾ĹåĪ° View å¯¹åºĶçļĦ ä½įç½® ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Position Ġ= Ġget Position ( last Visible View ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ ä¾ĭå¦Ĥ è¦ģ æĺ¾ç¤º 2 0 ä¸ª View ï¼Į å½ĵåīį åı¯ è§ģ çļĦ æľĢåĲİ ä¸Ģä¸ª View å°±æĺ¯ ç¬¬ 2 0 ä¸ª ï¼Į éĤ£ä¹Ī ä¸ĭ ä¸Ģä¸ª è¦ģ æĺ¾ç¤º çļĦ å°±æĺ¯ ç¬¬ä¸Ģä¸ª ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġå¦Ĥæŀľ å½ĵåīį æĺ¾ç¤º çļĦ View ä¸įæĺ¯ ç¬¬ 2 0 ä¸ª ï¼Į éĤ£ä¹Ī å°± æĺ¾ç¤º ä¸ĭ ä¸Ģä¸ª ï¼Į å¦Ĥ å½ĵåīį æĺ¾ç¤º çļĦæĺ¯ ç¬¬ 1 5 ä¸ª View ï¼Į éĤ£ä¹Ī ä¸ĭ ä¸Ģä¸ª æĺ¾ç¤º ç¬¬ 1 6 ä¸ª ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ æ³¨æĦı åĮº åĪĨ Ġchild Count Ġ ä¸İ Ġitem Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext View : ĠView Ġ= Ġif Ġ( layout Position Ġ== Ġitem Count Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cycler . getView For Position ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cycler . getView For Position ( layout Position Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( next View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeasure Child With Margins ( next View , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Width Ġ= Ġget Decorated Measured Width ( next View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Height Ġ= Ġget Decorated Measured Height ( next View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset X Ġ= Ġlast Visible View . right Ġ+ Ġitem Margin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Decorated ( next View , Ġoffset X , Ġ 0 , Ġoffset X Ġ+ Ġview Width , Ġview Height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġ// åı³ æ»ĳ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Visible View Ġ= Ġget Child At ( 0 ) Ġ?: Ġbreak ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first Visible View . left Ġ- Ġdx Ġ< Ġ 0 ) Ġbreak ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Position Ġ= Ġget Position ( first Visible View ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġå¦Ĥæŀľ å½ĵåīį ç¬¬ä¸Ģä¸ª åı¯ è§ģ View ä¸º ç¬¬ 0 ä¸ª ï¼Į åĪĻ å·¦ ä¾§ æĺ¾ç¤º ç¬¬ 2 0 ä¸ª View Ġå¦Ĥæŀľ ä¸įæĺ¯ ï¼Į ä¸ĭ ä¸Ģä¸ª å°± æĺ¾ç¤º åīį ä¸Ģä¸ª ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext View Ġ= Ġif Ġ( layout Position Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cycler . getView For Position ( item Count Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cycler . getView For Position ( layout Position Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( next View , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeasure Child With Margins ( next View , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Width Ġ= Ġget Decorated Measured Width ( next View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Height Ġ= Ġget Decorated Measured Height ( next View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset X Ġ= Ġfirst Visible View . left Ġ- Ġitem Margin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Decorated ( next View , Ġoffset X Ġ- Ġview Width , Ġ 0 , Ġoffset X , Ġview Height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġre cycle Views ( dx : ĠInt , Ġre cycler : ĠRecyclerView . Recycler ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġitem Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild View Ġ= Ġget Child At ( i ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// å·¦ æ»ĳ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dx Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ç§»éĻ¤ å¹¶ åĽŀ æĶ¶ Ġ åİŁ çĤ¹ Ġ å·¦ ä¾§ çļĦ åŃĲ View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child View . right Ġ+ Ġitem Margin Ġ- Ġdx Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove And Re cycle View At ( i , Ġre cycler ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġ// åı³ æ»ĳ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ç§»éĻ¤ å¹¶ åĽŀ æĶ¶ Ġ åı³ ä¾§ åį³ RecyclerView å®½åº¦ ä¹ĭ ä»¥ å¤ĸ çļĦ åŃĲ View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child View . left Ġ- Ġdx Ġ> Ġwidth Ġ+ Ġitem Margin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove And Re cycle View At ( i , Ġre cycler ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¤ĦçĲĨ Item ä¸įåĲĮ æķĪæŀľ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġdo With Item () Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Scroll Time () Ġ= Ġitem Scroll Time Ċ }