package Ġru . kr ay nov . library . drag linear layout Ċ Ċ import Ġandroid . animation .* Ċ import Ġandroid . animation . Value Animator . Animator Update Listener Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . graphics . drawable . Bitmap Drawable Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Log Ċ import Ġandroid . util . Sparse Array Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġandroid . view . View Configuration Ċ import Ġandroid . view . View Tree Observer Ċ import Ġandroid . widget . LinearLayout Ċ import Ġandroidx . core . view . Motion Event Compat Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . round ToInt Ċ Ċ class ĠDrag LinearLayout Ġ@ Jvm Over loads Ġconstructor ( context : ĠContext ?, Ġattrs : ĠAttributeSet ? Ġ= Ġnull ) Ġ: ĊĠĠĠĠĠĠĠ ĠLinearLayout ( context , Ġattrs ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠDrag LinearLayout :: class . java . simple Name ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠNO MIN AL _ SWITCH _ DURATION : ĠLong Ġ= Ġ 1 5 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMIN _ SWITCH _ DURATION Ġ= ĠNO MIN AL _ SWITCH _ DURATION ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMAX _ SWITCH _ DURATION Ġ= ĠNO MIN AL _ SWITCH _ DURATION Ġ* Ġ 2 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠNO MIN AL _ DISTANCE Ġ= Ġ 2 0 f ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠINVALID _ POINTER _ ID Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Bitmap From View ( view : ĠView ): ĠBitmap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= ĠBitmap . create Bitmap ( view . width , Ġview . height , ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcanvas Ġ= ĠCanvas ( bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . draw ( canvas ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbitmap ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm Nominal Distance Scaled : ĠFloat ĊĠĠĠ Ġprivate Ġval Ġm Drag Item : ĠDrag Item ĊĠĠĠ Ġprivate Ġval Ġm S lop : ĠInt ĊĠĠĠ Ġprivate Ġvar Ġm Down Y Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġvar Ġm Down X Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġvar Ġm Active Pointer Id Ġ= ĠINVALID _ POINTER _ ID ĊĠĠĠ Ġprivate Ġvar Ġm Layout Transition : ĠLayout Transition ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġm Drag gable Children : ĠSparse Array < Drag gable Child > Ġ= ĠSparse Array () ĊĠĠĠ Ġprivate Ġvar Ġm Is Long Click Drag gable Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġm Click To Drag Listener : ĠI Long Click To Drag Listener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Is Enter Long Click Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġval Ġm Long Click Drag Listener Ġ= ĠLong Click Drag Listener () ĊĠĠĠ Ġprivate Ġvar Ġswap Listener : ĠOn View Swap Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġm Drag Item Ġ= ĠDrag Item () ĊĠĠĠĠĠĠĠ Ġval Ġvc Ġ= ĠView Configuration . get ( context ) ĊĠĠĠĠĠĠĠ Ġm S lop Ġ= Ġvc . scaled Touch S lop ĊĠĠĠĠĠĠĠ Ġval Ġresources Ġ= Ġresources ĊĠĠĠĠĠĠĠ Ġm Nominal Distance Scaled Ġ= Ġ( NO MIN AL _ DISTANCE Ġ* Ġresources . display Metrics . density Ġ+ Ġ 0 . 5 f ). round ToInt (). toFloat () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Drag View ( child : ĠView ?, Ġdrag Handle : ĠView ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd View ( child ) ĊĠĠĠĠĠĠĠ Ġset View Drag gable ( child , Ġdrag Handle ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset View Drag gable ( child : ĠView ?, Ġdrag Handle : ĠView ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire (!( null Ġ== Ġchild Ġ|| Ġnull Ġ== Ġdrag Handle )) Ġ{ Ġ" Drag gable Ġchildren Ġand Ġtheir Ġdrag Ġhandles Ġmust Ġnot Ġbe Ġnull ." Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġchild !!. parent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrag Handle !!. setOn Touch Listener ( Drag Handle On Touch Listener ( child !! )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrag Handle !!. setOn Long ClickListener ( m Long Click Drag Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag gable Children . put ( indexOf Child ( child ), ĠDrag gable Child ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ"$ child Ġis Ġnot Ġa Ġchild , Ġcannot Ġmake Ġdraggable .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove All Views () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġchild Count ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġcount ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Child At ( i ). setOn Long ClickListener ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Child At ( i ). setOn Touch Listener ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . removeAll Views () ĊĠĠĠĠĠĠĠ Ġm Drag gable Children . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Translate Animation Duration ( distance : ĠFloat ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMath . min ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMAX _ SWITCH _ DURATION , ĠMath . max ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMIN _ SWITCH _ DURATION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( NO MIN AL _ SWITCH _ DURATION Ġ* ĠMath . abs ( distance ) Ġ/ Ġm Nominal Distance Scaled ). to Long () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Detect ing Drag ( child : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Drag Item . m Detect ing ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= ĠindexOf Child ( child ) ĊĠĠĠĠĠĠĠ Ġif Ġ( position Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag gable Children [ position ]. end Existing Animation () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Item . start Detect ing On Possible Drag ( child , Ġposition ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Drag () Ġ{ ĊĠĠĠĠĠĠĠ Ġswap Listener ?. onStart Drag () ĊĊĠĠĠĠĠĠĠ Ġm Layout Transition Ġ= Ġlayout Transition ĊĠĠĠĠĠĠĠ Ġif Ġ( m Layout Transition Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Transition Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Drag Item . on Drag Start () ĊĠĠĠĠĠĠĠ Ġrequest Dis allow Intercept Touch Event ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Drag Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( orientation Ġ== ĠV ERT ICAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Item . m Set tle Animation Ġ= ĠValue Animator . of Float ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Item . m Total Drag Offset . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Item . m Total Drag Offset Ġ- Ġm Drag Item . m Target Top Offset . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Duration ( get Translate Animation Duration ( m Drag Item . m Target Top Offset . toFloat ())) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Item . m Set tle Animation Ġ= ĠValue Animator . of Float ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Item . m Total Drag Offset . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Item . m Total Drag Offset Ġ- Ġm Drag Item . m Target Left Offset . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Duration ( get Translate Animation Duration ( m Drag Item . m Target Left Offset . toFloat ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Drag Item . m Set tle Animation ?. add Update Listener ( Animator Update Listener Ġ{ Ġanimation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! m Drag Item . m Detect ing ) Ġreturn @ Animator Update Listener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Item . set Total Offset (( animation . animated Value Ġas ĠFloat ). toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġm Drag Item . m Set tle Animation ?. addListener ( object Ġ: ĠAn imator Listener Adapter () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Start ( animation : ĠAn imator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Item . on Drag Stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation End ( animation : ĠAn imator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! m Drag Item . m Detect ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswap Listener ?. on End Drag () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Item . m Set tle Animation Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Item . stop Detect ing () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Layout Transition Ġ!= Ġnull Ġ&& Ġlayout Transition Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Transition Ġ= Ġm Layout Transition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġm Drag Item . m Set tle Animation ?. start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Drag ( offset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( orientation Ġ== ĠV ERT ICAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Item . set Total Offset ( offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Top Ġ= Ġm Drag Item . m Start Top Ġ+ Ġm Drag Item . m Total Drag Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbelow Position Ġ= Ġnext Drag gable Position ( m Drag Item . m Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġabove Position Ġ= Ġprevious Drag gable Position ( m Drag Item . m Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbelow View Ġ= Ġget Child At ( below Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġabove View Ġ= Ġget Child At ( above Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Below Ġ= Ġbelow View Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Top Ġ+ Ġm Drag Item . m Height Ġ> Ġbelow View . top Ġ+ Ġbelow View . height Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Above Ġ= Ġabove View Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Top Ġ< Ġabove View . top Ġ+ Ġabove View . height Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Below Ġ|| Ġis Above ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġswitch View Ġ= Ġif Ġ( is Below ) Ġbelow View Ġelse Ġabove View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Position Ġ= Ġm Drag Item . m Position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġswitch Position Ġ= Ġif Ġ( is Below ) Ġbelow Position Ġelse Ġabove Position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag gable Children [ switch Position ]. cancel Existing Animation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġswitch View Start Y Ġ= Ġswitch View !!. y ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswap Listener ?. on Swap ( m Drag Item . m View , Ġm Drag Item . m Position , Ġswitch View , Ġswitch Position ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Below ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove View At ( original Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove View At ( switch Position Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( below View , Ġoriginal Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( m Drag Item . m View , Ġswitch Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove View At ( switch Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove View At ( original Position Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( m Drag Item . m View , Ġswitch Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( above View , Ġoriginal Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Item . m Position Ġ= Ġswitch Position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġswitch View Observer Ġ= Ġswitch View . view Tree Observer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitch View Observer . add On Pre Draw Listener ( object Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView Tree Observer . On Pre Draw Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Pre Draw (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitch View Observer . remove On Pre Draw Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġswitch Animator Ġ= ĠObject Animator . of Float ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitch View , Ġ" y ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitch View Start Y , Ġswitch View . top . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Duration ( get Translate Animation Duration ( switch View . top Ġ- Ġswitch View Start Y )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitch Animator . addListener ( object Ġ: ĠAn imator Listener Adapter () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Start ( animation : ĠAn imator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag gable Children [ original Position ]. m Value Animator Ġ= Ġswitch Animator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation End ( animation : ĠAn imator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag gable Children [ original Position ]. m Value Animator Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitch Animator . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobserver Ġ= Ġm Drag Item . m View !!. view Tree Observer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . add On Pre Draw Listener ( object Ġ: ĠView Tree Observer . On Pre Draw Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Pre Draw (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . remove On Pre Draw Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Item . update Target Location () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Drag Item . set t ling ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Updating Ġset tle Ġanimation ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Item . m Set tle Animation !!. removeAll Listeners () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Item . m Set tle Animation !!. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Drag Stop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Item . set Total Offset ( offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Left Ġ= Ġm Drag Item . m Start Left Ġ+ Ġm Drag Item . m Total Drag Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Position Ġ= Ġnext Drag gable Position ( m Drag Item . m Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpre Position Ġ= Ġprevious Drag gable Position ( m Drag Item . m Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext View Ġ= Ġget Child At ( next Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpre View Ġ= Ġget Child At ( pre Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis To Next Ġ= Ġnext View Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Left Ġ+ Ġm Drag Item . m Width Ġ> Ġnext View . left Ġ+ Ġnext View . width Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis To Pre Ġ= Ġpre View Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Left Ġ< Ġpre View . left Ġ+ Ġpre View . width Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is To Next Ġ|| Ġis To Pre ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġswitch View Ġ= Ġif Ġ( is To Next ) Ġnext View Ġelse Ġpre View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Position Ġ= Ġm Drag Item . m Position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġswitch Position Ġ= Ġif Ġ( is To Next ) Ġnext Position Ġelse Ġpre Position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag gable Children [ switch Position ]. cancel Existing Animation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġswitch View Start X Ġ= Ġswitch View !!. x ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswap Listener ?. on Swap ( m Drag Item . m View , Ġm Drag Item . m Position , Ġswitch View , Ġswitch Position ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is To Next ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove View At ( original Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove View At ( switch Position Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( next View , Ġoriginal Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( m Drag Item . m View , Ġswitch Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove View At ( switch Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove View At ( original Position Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( m Drag Item . m View , Ġswitch Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( pre View , Ġoriginal Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Item . m Position Ġ= Ġswitch Position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġswitch View Observer Ġ= Ġswitch View . view Tree Observer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitch View Observer . add On Pre Draw Listener ( object Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView Tree Observer . On Pre Draw Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Pre Draw (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitch View Observer . remove On Pre Draw Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġswitch Animator Ġ= ĠObject Animator . of Float ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitch View , Ġ" x ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitch View Start X , Ġswitch View . left . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Duration ( get Translate Animation Duration ( switch View . left Ġ- Ġswitch View Start X )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitch Animator . addListener ( object Ġ: ĠAn imator Listener Adapter () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Start ( animation : ĠAn imator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag gable Children [ original Position ]. m Value Animator Ġ= Ġswitch Animator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation End ( animation : ĠAn imator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag gable Children [ original Position ]. m Value Animator Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitch Animator . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobserver Ġ= Ġm Drag Item . m View !!. view Tree Observer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . add On Pre Draw Listener ( object Ġ: ĠView Tree Observer . On Pre Draw Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Pre Draw (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . remove On Pre Draw Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Item . update Target Location () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Drag Item . set t ling ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Item . m Set tle Animation !!. removeAll Listeners () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Item . m Set tle Animation !!. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Drag Stop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprevious Drag gable Position ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠstartIndex Ġ= Ġm Drag gable Children . indexOf Key ( position ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( startIndex Ġ< Ġ 1 Ġ|| ĠstartIndex Ġ> Ġm Drag gable Children . size ()) Ġ- 1 Ġelse Ġm Drag gable Children . key At ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartIndex Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnext Drag gable Position ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠstartIndex Ġ= Ġm Drag gable Children . indexOf Key ( position ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( startIndex Ġ< Ġ- 1 Ġ|| ĠstartIndex Ġ> Ġm Drag gable Children . size () Ġ- Ġ 2 ) Ġ- 1 Ġelse Ġm Drag gable Children . key At ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartIndex Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispatch Draw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . dispatch Draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġif Ġ( m Drag Item . m Detect ing Ġ&& Ġ( m Drag Item . m Dragging Ġ|| Ġm Drag Item . set t ling ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . save () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( orientation Ġ== ĠV ERT ICAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . translate ( 0 f , Ġm Drag Item . m Total Drag Offset . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . translate ( m Drag Item . m Total Drag Offset . toFloat (), Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Item . m Bitmap Drawable !!. draw ( canvas ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . restore () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Intercept Touch Event ( event : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! m Is Long Click Drag gable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Intercept Touch Event ( event ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( Motion Event Compat . getAction Mask ed ( event )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent . request Dis allow Intercept Touch Event ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Drag Item . m Detect ing ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Down Y Ġ= ĠMotion Event Compat . getY ( event , Ġ 0 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Down X Ġ= ĠMotion Event Compat . getX ( event , Ġ 0 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Active Pointer Id Ġ= ĠMotion Event Compat . get Pointer Id ( event , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! m Is Long Click Drag gable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Intercept Touch Event ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! m Drag Item . m Detect ing ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( INVALID _ POINTER _ ID Ġ== Ġm Active Pointer Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpointer Index Ġ= Ġevent . find Pointer Index ( m Active Pointer Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= ĠMotion Event Compat . getY ( event , Ġpointer Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= ĠMotion Event Compat . getX ( event , Ġpointer Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdy Ġ= Ġy Ġ- Ġm Down Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdx Ġ= Ġx Ġ- Ġm Down X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( orientation Ġ== ĠV ERT ICAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( abs ( dy ) Ġ> Ġm S lop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Drag () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( abs ( dx ) Ġ> Ġm S lop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Drag () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ POINTER _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpointer Index Ġ= ĠMotion Event Compat . getAction Index ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpointer Id Ġ= ĠMotion Event Compat . get Pointer Id ( event , Ġpointer Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pointer Id Ġ!= Ġm Active Pointer Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent . request Dis allow Intercept Touch Event ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Touch End () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Drag Item . m Detect ing ) Ġm Drag Item . stop Detect ing () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ CANCEL , ĠMotion Event . ACTION _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent . request Dis allow Intercept Touch Event ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Touch End () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Drag Item . m Detect ing ) Ġm Drag Item . stop Detect ing () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Click ableView Accessibility ") ĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! m Is Long Click Drag gable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Touch Event ( event ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( Motion Event Compat . getAction Mask ed ( event )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! m Drag Item . m Detect ing Ġ|| Ġm Drag Item . set t ling ()) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Drag () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! m Is Enter Long Click ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Touch Event ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! m Drag Item . m Dragging ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( INVALID _ POINTER _ ID Ġ== Ġm Active Pointer Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpointer Index Ġ= Ġevent . find Pointer Index ( m Active Pointer Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Event Y Ġ= ĠMotion Event Compat . getY ( event , Ġpointer Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Event X Ġ= ĠMotion Event Compat . getX ( event , Ġpointer Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( orientation Ġ== ĠV ERT ICAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta Y Ġ= Ġlast Event Y Ġ- Ġm Down Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Drag ( delta Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta X Ġ= Ġlast Event X Ġ- Ġm Down X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Drag ( delta X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ POINTER _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpointer Index Ġ= ĠMotion Event Compat . getAction Index ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpointer Id Ġ= ĠMotion Event Compat . get Pointer Id ( event , Ġpointer Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pointer Id Ġ!= Ġm Active Pointer Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Touch End () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Drag Item . m Dragging ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Drag Stop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( m Drag Item . m Detect ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Item . stop Detect ing () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ CANCEL , ĠMotion Event . ACTION _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Touch End () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Drag Item . m Dragging ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Drag Stop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( m Drag Item . m Detect ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Item . stop Detect ing () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Touch End () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Down Y Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġm Down X Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġm Is Enter Long Click Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġm Active Pointer Id Ġ= ĠINVALID _ POINTER _ ID ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Drag Drawable ( view : ĠView ): ĠBitmap Drawable Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtop Ġ= Ġview . top ĊĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġview . left ĊĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= Ġget Bitmap From View ( view ) ĊĠĠĠĠĠĠĠ Ġval Ġdrawable Ġ= ĠBitmap Drawable ( resources , Ġbitmap ) ĊĠĠĠĠĠĠĠ Ġdrawable . bounds Ġ= ĠRect ( left , Ġtop , Ġleft Ġ+ Ġview . width , Ġtop Ġ+ Ġview . height ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdrawable ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Click To Drag Listener ( click To Drag Listener : ĠI Long Click To Drag Listener ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Click To Drag Listener Ġ= Ġclick To Drag Listener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Long Click Drag ( long Click Drag : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Is Long Click Drag gable Ġ!= Ġlong Click Drag ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Long Click Drag gable Ġ= Ġlong Click Drag ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset View Swap Listener ( swap Listener : ĠOn View Swap Listener ){ ĊĠĠĠĠĠĠĠ Ġthis . swap Listener Ġ= Ġswap Listener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠDrag Item Ġinternal Ġconstructor () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġm View : ĠView ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġm Start Visibility Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġm Bitmap Drawable : ĠBitmap Drawable ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġm Position Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġm Start Top Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġm Height Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġm Total Drag Offset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġm Target Top Offset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġm Start Left Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġm Width Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġm Target Left Offset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġm Set tle Animation : ĠValue Animator ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġm Detect ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġm Dragging Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġfun Ġstart Detect ing On Possible Drag ( view : ĠView , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm View Ġ= Ġview ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Start Visibility Ġ= Ġview . visibility ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Bitmap Drawable Ġ= Ġget Drag Drawable ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Position Ġ= Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Start Top Ġ= Ġview . top ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Height Ġ= Ġview . height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Start Left Ġ= Ġview . left ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Width Ġ= Ġview . width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Total Drag Offset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Target Top Offset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Target Left Offset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Set tle Animation Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Detect ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġon Drag Start () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm View !!. visibility Ġ= ĠIN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Dragging Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Total Offset ( offset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Total Drag Offset Ġ= Ġoffset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Target Location () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġupdate Target Location () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( orientation Ġ== ĠV ERT ICAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Target Top () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Target Left () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġupdate Target Left () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Target Left Offset Ġ= Ġm Start Left Ġ- Ġm View !!. left Ġ+ Ġm Total Drag Offset ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġupdate Target Top () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Target Top Offset Ġ= Ġm Start Top Ġ- Ġm View !!. top Ġ+ Ġm Total Drag Offset ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġon Drag Stop () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Dragging Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset t ling (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull Ġ!= Ġm Set tle Animation ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġstop Detect ing () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Detect ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġm View ) Ġm View !!. visibility Ġ= Ġm Start Visibility ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm View Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Start Visibility Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Bitmap Drawable Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Position Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Start Top Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Height Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Start Left Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Width Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Total Drag Offset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Target Top Offset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Target Left Offset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġm Set tle Animation ) Ġm Set tle Animation !!. end () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Set tle Animation Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Detect ing () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠDrag gable Child Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġm Value Animator : ĠValue Animator ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġfun Ġend Existing Animation () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Value Animator ?. end () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcancel Existing Animation () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Value Animator ?. cancel () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠDrag Handle On Touch Listener Ġinternal Ġconstructor ( private Ġval Ġview : ĠView ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOn Touch Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress Lint (" Click ableView Accessibility ") ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Touch ( v : ĠView , Ġevent : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Motion Event . ACTION _ DOWN Ġ== ĠMotion Event Compat . getAction Mask ed ( event )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Detect ing Drag ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠLong Click Drag Listener Ġ: ĠOn Long ClickListener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Long Click ( v : ĠView ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! m Is Long Click Drag gable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Enter Long Click Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Click To Drag Listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Click To Drag Listener !!. on Long Click To Drag ( v ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Detect ing Drag ( v ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠI Long Click To Drag Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Long Click To Drag ( drag ableView : ĠView ?) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠOn View Swap Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun ĠonStart Drag (){} ĊĠĠĠĠĠĠĠ Ġfun Ġon End Drag (){} ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠInv oked Ġright Ġbefore Ġthe Ġtwo Ġitems Ġare Ġsw apped Ġdue Ġto Ġa Ġdrag Ġevent . ĊĠĠĠĠĠĠĠĠ Ġ* ĠAfter Ġthe Ġswap , Ġthe Ġfirst View Ġwill Ġbe Ġin Ġthe Ġsecond Position , Ġand Ġvice Ġvers a . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠNo Ġguarantee Ġis Ġmade Ġas Ġto Ġwhich Ġof Ġthe Ġtwo Ġhas Ġa Ġless er / greater Ġposition . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġon Swap ( first View : ĠView ?, Ġfirst Position : ĠInt , Ġsecond View : ĠView ?, Ġsecond Position : ĠInt ){} ĊĠĠĠ Ġ} Ċ }