package Ġcom . k yle du o . al add in . managers . view Ċ Ċ import Ġandroid . animation . Animator Ċ import Ġandroid . animation . Animator Listener Adapter Ċ import Ġandroid . animation . Value Animator Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġandroid . view . View Configuration Ċ import Ġandroid . view . animation . De cel erate Interpolator Ċ import Ġcom . k yle du o . al add in . api . Al add in Context Ċ import Ġcom . k yle du o . al add in . api . manager . view . Al add in View Ċ import Ġcom . k yle du o . al add in . api . manager . view . Al add in View . Snap Edge Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ Ċ /** Ċ Ġ* ĠHelper Ġclass Ġcontains Ġimplementation Ġof Ġdragging Ġand Ġsn apping . Ċ Ġ* Ċ Ġ* Ġ@ author Ġk yle du o Ġon Ġ 2 0 2 1 / 6 / 1 5 Ċ Ġ*/ Ċ class ĠView Dragging Helper ( ĊĠĠĠ Ġval Ġcontext : ĠAl add in Context , ĊĠĠĠ Ġval Ġview : ĠAl add in View , ĊĠĠĠ Ġprivate Ġval Ġsn apped Listener : ĠOn View Sn apped Listener ? Ċ ) Ġ: ĠView . On Touch Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġdragging Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġval Ġtouch Slot Ġby Ġlazy Ġ{ ĠView Configuration . get ( context . app ). scaled Touch S lop Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġstart X : ĠFloat Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġstart Y : ĠFloat Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġlast X : ĠFloat Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġlast Y : ĠFloat Ġ= Ġ 0 f ĊĊĠĠĠ Ġ@ Suppress Lint (" Click ableView Accessibility ") ĊĠĠĠ Ġoverride Ġfun Ġon Touch ( v : ĠView ?, Ġevent : ĠMotion Event ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġevent Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġevent . raw X ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġevent . raw Y ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( event . action Mask ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart X Ġ= Ġx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Y Ġ= Ġy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! drag ging Ġ&& Ġ( abs ( x Ġ- Ġstart X ) Ġ> Ġtouch Slot Ġ|| Ġabs ( y Ġ- Ġstart Y ) Ġ> Ġtouch Slot )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdragging Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast X Ġ= Ġstart X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Y Ġ= Ġstart Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( drag ging ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdx Ġ= Ġx Ġ- Ġlast X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdy Ġ= Ġy Ġ- Ġlast Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . agent . move By ( dx . toInt (), Ġdy . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast X Ġ= Ġx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Y Ġ= Ġy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP , ĠMotion Event . ACTION _ CANCEL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( drag ging ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdragging Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Snap ( v ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdragging Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdragging ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtry Snap To Edge () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Snap ( view . view ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtry Snap ( v : ĠView ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġv Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġsnap Edges Ġ= Ġview . auto Snap Edges ĊĠĠĠĠĠĠĠ Ġval Ġagent Ġ= Ġview . agent ĊĊĠĠĠĠĠĠĠ Ġif Ġ( snap Edges Ġ== ĠSnap Edge . NONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsnap To Left Ġ= Ġsnap Edges Ġand ĠSnap Edge . LEFT Ġ> Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġsnap To Top Ġ= Ġsnap Edges Ġand ĠSnap Edge . TOP Ġ> Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġsnap To Right Ġ= Ġsnap Edges Ġand ĠSnap Edge . RIGHT Ġ> Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġsnap To Bottom Ġ= Ġsnap Edges Ġand ĠSnap Edge . BOTTOM Ġ> Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġparent Size Ġ= Ġagent . getParent Size () ĊĊĠĠĠĠĠĠĠ Ġval Ġoffset Left Ġ= Ġif Ġ( snap To Left ) Ġagent . getX () Ġelse ĠInt . MAX _ VALUE ĊĠĠĠĠĠĠĠ Ġval Ġoffset Top Ġ= Ġif Ġ( snap To Top ) Ġagent . getY () Ġelse ĠInt . MAX _ VALUE ĊĠĠĠĠĠĠĠ Ġval Ġoffset Right Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( snap To Right ) Ġmax ( 0 , Ġparent Size . width Ġ- Ġagent . getX () Ġ- Ġv . width ) Ġelse ĠInt . MAX _ VALUE ĊĠĠĠĠĠĠĠ Ġval Ġoffset Bottom Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( snap To Bottom ) Ġmax ( 0 , Ġparent Size . height Ġ- Ġagent . getY () Ġ- Ġv . height ) Ġelse ĠInt . MAX _ VALUE ĊĊĠĠĠĠĠĠĠ Ġval Ġmin Ġ= Ġmin ( min ( offset Left , Ġoffset Top ), Ġmin ( offset Right , Ġoffset Bottom )) ĊĊĠĠĠĠĠĠĠ Ġval Ġanim ator Ġ= ĠValue Animator (). set Duration ( 2 0 0 L ) ĊĠĠĠĠĠĠĠ Ġanim ator . interpol ator Ġ= ĠDec el erate Interpolator () ĊĊĠĠĠĠĠĠĠ Ġval Ġx Or Y Ġ= Ġwhen Ġ( min ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Left Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . setInt Values ( agent . getX (), Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Top Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . setInt Values ( agent . getY (), Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Right Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . setInt Values ( agent . getX (), Ġparent Size . width Ġ- Ġv . width ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Bottom Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . setInt Values ( agent . getY (), Ġparent Size . height Ġ- Ġv . height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( x Or Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . add Update Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġagent . moveTo ( it . animated Value Ġas ĠInt , Ġagent . getY ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . add Update Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġagent . moveTo ( agent . getX (), Ġit . animated Value Ġas ĠInt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsn apped Listener ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . addListener ( object Ġ: ĠAn imator Listener Adapter () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation End ( animation : ĠAn imator ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . on View Sn apped () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġanim ator . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠListener Ġused Ġto Ġget Ġcallback Ġwhen Ġview Ġhas Ġbeen Ġsn apped Ġto Ġedge . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinterface ĠOn View Sn apped Listener Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġon View Sn apped () ĊĠĠĠ Ġ} Ċ } Ċ