/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 0 8 ĠGoogle ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . wave . aud i ore cord ing . aud iop layer . trim Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . KeyEvent Ċ import Ġandroid . view . Motion Event Ċ import Ġandroidx . appcompat . widget . AppCompat ImageView Ċ Ċ /** Ċ Ġ* ĠRepresents Ġa Ġdraggable Ġstart Ġor Ġend Ġmarker . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠMost Ġevents Ġare Ġpassed Ġback Ġto Ġthe Ġclient Ġclass Ġusing Ġa Ċ Ġ* Ġlistener Ġinterface . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠThis Ġclass Ġdirectly Ġkeeps Ġtrack Ġof Ġits Ġown Ġvelocity , Ġthough , Ċ Ġ* Ġaccel er ating Ġas Ġthe Ġuser Ġholds Ġdown Ġthe Ġleft Ġor Ġright Ġarrows Ċ Ġ* Ġwhile Ġthis Ġcontrol Ġis Ġfocused . Ċ Ġ*/ Ċ class ĠMarker View ( context : ĠContext ?, Ġattrs : ĠAttributeSet ?) Ġ: ĠAppCompat ImageView ( context !! , Ġattrs ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġm Velocity : ĠInt ĊĠĠĠ Ġprivate Ġvar Ġm Listener : ĠMarker Listener ? ĊĠĠĠ Ġfun Ġset Listener ( listener : ĠMarker Listener ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Listener Ġ= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( event . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Focus () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġuse Ġraw Ġx Ġbecause Ġthis Ġwindow Ġitself Ġis Ġgoing Ġto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmove , Ġwhich Ġwill Ġscre w Ġup Ġthe Ġ" local " Ġcoordinates ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Listener Ġ!= Ġnull ) Ġm Listener ?. marker Touch Start ( this , Ġevent . raw X ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġuse Ġraw Ġx Ġbecause Ġthis Ġwindow Ġitself Ġis Ġgoing Ġto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmove , Ġwhich Ġwill Ġscre w Ġup Ġthe Ġ" local " Ġcoordinates ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Listener Ġ!= Ġnull ) Ġm Listener ?. marker Touch Move ( this , Ġevent . raw X ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġif Ġ( m Listener Ġ!= Ġnull ) Ġm Listener ?. marker Touch End ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Focus Changed ( gain Focus : ĠBoolean , Ġdirection : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreviously Focused Rect : ĠRect ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( gain Focus Ġ&& Ġm Listener Ġ!= Ġnull ) Ġm Listener ?. marker Focus ( this ) ĊĠĠĠĠĠĠĠ Ġsuper . on Focus Changed ( gain Focus , Ġdirection , Ġpreviously Focused Rect ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġif Ġ( m Listener Ġ!= Ġnull ) Ġm Listener ?. marker Draw () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon KeyDown ( keyCode : ĠInt , Ġevent : ĠKeyEvent ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġm Velocity ++ ĊĠĠĠĠĠĠĠ Ġval Ġv Ġ= ĠMath . sqrt (( 1 Ġ+ Ġm Velocity Ġ/ Ġ 2 ). toDouble ()). toInt () ĊĠĠĠĠĠĠĠ Ġif Ġ( m Listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( keyCode Ġ== ĠKeyEvent . KEYCODE _ DP AD _ LEFT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Listener ?. marker Left ( this , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( keyCode Ġ== ĠKeyEvent . KEYCODE _ DP AD _ RIGHT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Listener ?. marker Right ( this , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( keyCode Ġ== ĠKeyEvent . KEYCODE _ DP AD _ CENTER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Listener ?. marker Enter ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on KeyDown ( keyCode , Ġevent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon KeyUp ( keyCode : ĠInt , Ġevent : ĠKeyEvent ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġm Velocity Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( m Listener Ġ!= Ġnull ) Ġm Listener ?. marker KeyUp () ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on KeyDown ( keyCode , Ġevent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠMarker Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġmarker Touch Start ( marker : ĠMarker View ?, Ġpos : ĠFloat ) ĊĠĠĠĠĠĠĠ Ġfun Ġmarker Touch Move ( marker : ĠMarker View ?, Ġpos : ĠFloat ) ĊĠĠĠĠĠĠĠ Ġfun Ġmarker Touch End ( marker : ĠMarker View ?) ĊĠĠĠĠĠĠĠ Ġfun Ġmarker Focus ( marker : ĠMarker View ?) ĊĠĠĠĠĠĠĠ Ġfun Ġmarker Left ( marker : ĠMarker View ?, Ġvelocity : ĠInt ) ĊĠĠĠĠĠĠĠ Ġfun Ġmarker Right ( marker : ĠMarker View ?, Ġvelocity : ĠInt ) ĊĠĠĠĠĠĠĠ Ġfun Ġmarker Enter ( marker : ĠMarker View ?) ĊĠĠĠĠĠĠĠ Ġfun Ġmarker KeyUp () ĊĠĠĠĠĠĠĠ Ġfun Ġmarker Draw () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġwe Ġget Ġkeys ĊĠĠĠĠĠĠĠ Ġis Focus able Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġm Velocity Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġm Listener Ġ= Ġnull ĊĠĠĠ Ġ} Ċ }