package Ġcom . z ys . swipe Ċ Ċ import Ġandroid . animation . Object Animator Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroidx . lifecycle . Lifecycle Ċ import Ġandroidx . lifecycle . Lifecycle Event Observer Ċ import Ġandroidx . lifecycle . Lifecycle Owner Ċ import Ġandroidx . recyclerview . widget . Item Touch Helper Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ Ċ /** Ċ Ġ* Ġæı ı è¿° : RecyclerView Ġ ä¾§ æ»ĳ Item Touch Helper . Callback Ġ å®ŀçİ° ç±» Ċ Ġ* Ċ Ġ* Ġauthor Ġz ys Ċ Ġ* Ġcreate Ġby Ġ 2 0 2 1 / 3 / 1 6 Ċ Ġ*/ Ċ internal Ġclass ĠSw ipe Callback Impl ( lifecycle : ĠLifecycle ) Ġ: ĠItem Touch Helper . Callback () Ġ{ ĊĊĠĠĠ Ġvar Ġmax Swipe Width : ĠInt Ġ= Ġ 8 8 . dp ĊĊĠĠĠ Ġprivate Ġval Ġduration : ĠLong ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ( max Swipe Width Ġ/ Ġ 3 0 . dp f Ġ* Ġ 3 0 ). to Long () ĊĊĠĠĠ Ġprivate Ġvar Ġcur RecyclerView : ĠRecyclerView ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcur Position Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġvar Ġcurrent Scroll X Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġflag Ġ= Ġfalse ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġlifecycle . add Observer ( object Ġ: ĠLifecycle Event Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon StateChanged ( source : ĠLifecycle Owner , Ġevent : ĠLifecycle . Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" æµĭè¯ķ TAG ", Ġevent . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event Ġ== ĠLifecycle . Event . ON _ PAUSE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Movement Flags ( ĊĠĠĠĠĠĠĠ Ġre cyclerView : ĠRecyclerView , ĠviewHolder : ĠRecyclerView . ViewHolder ĊĠĠĠ Ġ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġsetup RecyclerView ( re cyclerView ) ĊĠĠĠĠĠĠĠ Ġval Ġsupport Swipe Ġ= Ġwhen Ġ( view Holder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠItem Swipe Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view Holder . max Swipe Width () Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Swipe Width Ġ= ĠviewHolder . max Swipe Width () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder . enable () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġswipe Flag Ġ= Ġif Ġ( support Swipe ) Ġ 1 2 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( view Holder . layout Position Ġ!= Ġcur Position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( support Swipe ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur Position Ġ= ĠviewHolder . layout Position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmake Movement Flags ( 0 , Ġswipe Flag ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Move ( ĊĠĠĠĠĠĠĠ Ġre cyclerView : ĠRecyclerView , ĊĠĠĠĠĠĠĠ ĠviewHolder : ĠRecyclerView . ViewHolder , ĊĠĠĠĠĠĠĠ Ġtarget : ĠRecyclerView . ViewHolder ĊĠĠĠ Ġ): ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġon Sw ip ed ( view Holder : ĠRecyclerView . ViewHolder , Ġdirection : ĠInt ) Ġ{ ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Child Draw ( ĊĠĠĠĠĠĠĠ Ġc : ĠCanvas , ĊĠĠĠĠĠĠĠ Ġre cyclerView : ĠRecyclerView , ĊĠĠĠĠĠĠĠ ĠviewHolder : ĠRecyclerView . ViewHolder , ĊĠĠĠĠĠĠĠ Ġd X : ĠFloat , ĊĠĠĠĠĠĠĠ Ġd Y : ĠFloat , ĊĠĠĠĠĠĠĠ Ġaction State : ĠInt , ĊĠĠĠĠĠĠĠ Ġis Currently Active : ĠBoolean ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( action State Ġ!= ĠItem Touch Helper . ACTION _ STATE _ SW I PE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( view Holder . layout Position Ġ!= Ġcur Position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠviewHolder . item View ĊĠĠĠĠĠĠĠ Ġif Ġ( dX Ġ== Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Scroll X Ġ= Ġview . scroll X ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( is Currently Active ) Ġ{// æīĭ æĮĩ æ»ĳ åĬ¨ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dX Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scroll X Ġ= Ġmin (( current Scroll X Ġ- Ġd X ). toInt (), Ġmax Swipe Width ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( dX Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . scroll X Ġ= Ġmax (( current Scroll X Ġ- Ġd X ). toInt (), Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĠĠĠ Ġ// æīĭ æĮĩ ç¦» å¼Ģ åĲİ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dX Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscroll Item View ( view , Ġfalse , Ġview . scroll X , Ġmax Swipe Width ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( dX Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscroll Item View ( view , Ġtrue , Ġview . scroll X , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æīĭ éĩĮ ç¦» å¼Ģ å±ı å¹ķ åĲİçļĦ åĬ¨çĶ» æĵįä½ľ Ġ å®ĮæĪĲ åĲİ Ġ è°ĥçĶ¨ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġclear View ( re cyclerView : ĠRecyclerView , ĠviewHolder : ĠRecyclerView . ViewHolder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( view Holder . item View . scroll X Ġ> Ġmax Swipe Width Ġ/ Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder . item View . scroll X Ġ= Ġmax Swipe Width ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( view Holder . item View . scroll X Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder . item View . scroll X Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Swipe Threshold ( view Holder : ĠRecyclerView . ViewHolder ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFloat . MAX _ VALUE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Swipe Escape Velocity ( defaultValue : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFloat . MAX _ VALUE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup RecyclerView ( re cyclerView : ĠRecyclerView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . cur RecyclerView Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . cur RecyclerView Ġ= Ġre cyclerView ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( flag ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġflag Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġcur RecyclerView ?. add On Item Touch Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠItem Touch Listener ( re cyclerView ) Ġ{ Ġ_: ĠView , Ġ_: ĠInt Ġ-> Ġreset () Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcur RecyclerView ?. add On Scroll Listener ( object Ġ: ĠRecyclerView . On Scroll Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scroll StateChanged ( re cyclerView : ĠRecyclerView , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġscroll Item View ( view : ĠView , Ġis Reset : ĠBoolean Ġ= Ġtrue , Ġstart : ĠInt , Ġend : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġduration Ġ= Ġabs ( current Scroll X Ġ- Ġend ) Ġ* Ġ 1 f Ġ/ Ġmax Swipe Width Ġ* Ġduration ĊĠĠĠĠĠĠĠ Ġif Ġ( is Reset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcur Position Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠObject Animator . of Int ( view , Ġ" Scroll X ", Ġstart , Ġend ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Duration ( duration . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ éĩį ç½® åĪ° åĪĿå§ĭ çĬ¶æĢģ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġthis . cur RecyclerView ?. find ViewHolder For Layout Position ( cur Position )?. item View ĊĠĠĠĠĠĠĠ Ġview Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġcur Position Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ ĠObject Animator . of Int ( view , Ġ" Scroll X ", Ġcurrent Scroll X , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Duration ( duration ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. start () ĊĠĠĠ Ġ} Ċ }