package Ġglobal . ut ut ax free . tax free android ui . picker view Ċ Ċ import Ġandroid . annotation . Target Api Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . os . Handler Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Gesture Detector Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġandroidx . core . content . res . Resources Compat Ċ import Ġglobal . ut ut ax free . tax free android ui . R Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . Scheduled ExecutorService Ċ import Ġjava . util . concurrent . Scheduled Future Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . math . abs Ċ Ċ class ĠAtomic Picker DO B Ġ: ĠView Ġ{ ĊĠĠĠ Ġprivate Ġval ĠexecutorService : ĠScheduled ExecutorService ĊĠĠĠ Ġprivate Ġvar Ġscheduled Future : ĠScheduled Future < *> ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġloop Scroll Listener : ĠLoop Scroll Listener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġon Gesture Listener : ĠGest ure Detector . Simple On Gesture Listener ĊĠĠĠ Ġprivate Ġvar Ġgesture Detector : ĠGest ure Detector ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġtop Bottom Text Paint : ĠPaint ĊĠĠĠ Ġprivate Ġval Ġcenter Text Paint : ĠPaint ĊĠĠĠ Ġprivate Ġval Ġcenter Line Paint : ĠPaint ĊĠĠĠ Ġprivate Ġvar Ġdata : ĠList < String >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġitem Count : ĠArray < String ?> ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġline Spacing Multiplier Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġitem Height Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġcan Loop Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġtotal Scroll Y Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġselected Item Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġprivate Ġvar Ġtext Size Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġmax Text Width Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġmax Text Height Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġtop Bottom TextColor Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġcenter TextColor Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġcenter Line Color Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġtop Line Y Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġbottom Line Y Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar ĠcurrentIndex Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġinitial Position Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġpadding Left Right Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġpadding Top Bottom Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġdraw Items Count Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġcircular Di ameter Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġwidget Height Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġcircular Radius Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġwidget Width Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġlocal Handler : ĠHandler ĊĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext ?, ĊĠĠĠĠĠĠĠ Ġattrs : ĠAttributeSet ? Ġ= Ġnull Ġas ĠAttributeSet ?, ĊĠĠĠĠĠĠĠ Ġdef Style Attr : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ) Ġ: Ġsuper ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĠĠĠĠĠĠĠ ĠexecutorService Ġ= ĠExec utors . new Single Thread Scheduled Executor () ĊĠĠĠĠĠĠĠ Ġon Gesture Listener Ġ= ĠW heel View Gesture Listener () ĊĠĠĠĠĠĠĠ Ġtop Bottom Text Paint Ġ= ĠPaint () ĊĠĠĠĠĠĠĠ Ġcenter Text Paint Ġ= ĠPaint () ĊĠĠĠĠĠĠĠ Ġcenter Line Paint Ġ= ĠPaint () ĊĠĠĠĠĠĠĠ Ġlocal Handler Ġ= ĠHandler (` Atomic Picker DO B $$ Lambda $ 1 `.` lambda Factory $ `( this )) ĊĠĠĠĠĠĠĠ Ġif Ġ(! this . isIn Edit Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit View ( attrs !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Target Api ( 2 1 ) ĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext ?, ĊĠĠĠĠĠĠĠ Ġattrs : ĠAttributeSet , ĊĠĠĠĠĠĠĠ Ġdef Style Attr : ĠInt , ĊĠĠĠĠĠĠĠ Ġdef Style Res : ĠInt ĊĠĠĠ Ġ) Ġ: Ġsuper ( context , Ġattrs , Ġdef Style Attr , Ġdef Style Res ) Ġ{ ĊĠĠĠĠĠĠĠ ĠexecutorService Ġ= ĠExec utors . new Single Thread Scheduled Executor () ĊĠĠĠĠĠĠĠ Ġon Gesture Listener Ġ= ĠW heel View Gesture Listener () ĊĠĠĠĠĠĠĠ Ġtop Bottom Text Paint Ġ= ĠPaint () ĊĠĠĠĠĠĠĠ Ġcenter Text Paint Ġ= ĠPaint () ĊĠĠĠĠĠĠĠ Ġcenter Line Paint Ġ= ĠPaint () ĊĠĠĠĠĠĠĠ Ġlocal Handler Ġ= ĠHandler (` Atomic Picker DO B $$ Lambda $ 2 `.` lambda Factory $ `( this )) ĊĠĠĠĠĠĠĠ Ġif Ġ(! this . isIn Edit Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit View ( attrs ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit View ( attrs : ĠAttributeSet ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarray Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . context . obtain Styled Attributes ( attrs , ĠR . style able . Atomic Picker ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Bottom TextColor Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray . getColor ( R . style able . Atomic Picker _ top Bottom TextColor , Ġ- 5 2 6 3 4 4 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcenter TextColor Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray . getColor ( R . style able . Atomic Picker _ center TextColor , Ġ- 1 3 5 5 3 3 5 9 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcenter Line Color Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray . getColor ( R . style able . Atomic Picker _ line Color , Ġ- 3 8 1 5 9 9 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcan Loop Ġ= Ġarray . getBoolean ( R . style able . Atomic Picker _ can Loop , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Position Ġ= Ġarray . getInt ( R . style able . Atomic Picker _ init Position , Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Size Ġ= Ġarray . get Dimension Pixel Size ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Atomic Picker _ text Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsp 2 px ( this . context , Ġ 1 6 . 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Items Count Ġ= Ġarray . getInt ( R . style able . Atomic Picker _ draw ItemCount , Ġ 7 ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray . recycle () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġline Spacing Multiplier Ġ= Ġ 2 . 0 f ĊĠĠĠĠĠĠĠ Ġset Layer Type ( 1 , Ġnull Ġas ĠPaint ?) ĊĊĠĠĠĠĠĠĠ Ġitem Count Ġ= ĠarrayOf Null s ( draw Items Count ) ĊĠĠĠĠĠĠĠ Ġgesture Detector Ġ= ĠGest ure Detector ( this . context , Ġon Gesture Listener ) ĊĠĠĠĠĠĠĠ Ġgesture Detector !!. setIs Long press Enabled ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire NotNull ( data ) Ġ{ Ġ" data Ġlist Ġmust Ġnot Ġbe Ġnull !" Ġ} ĊĠĠĠĠĠĠĠ Ġtop Bottom Text Paint . color Ġ= Ġtop Bottom TextColor ĊĠĠĠĠĠĠĠ Ġtop Bottom Text Paint . is Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġtop Bottom Text Paint . type face Ġ= ĠResources Compat . getFont ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . font . not os ans _ regular ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtop Bottom Text Paint . text Size Ġ= Ġtext Size . toFloat () ĊĠĠĠĠĠĠĠ Ġcenter Text Paint . color Ġ= Ġcenter TextColor ĊĠĠĠĠĠĠĠ Ġcenter Text Paint . is Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġcenter Text Paint . text Scale X Ġ= Ġ 1 . 0 5 f ĊĠĠĠĠĠĠĠ Ġcenter Text Paint . type face Ġ= ĠResources Compat . getFont ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . font . not os ans _ bold ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcenter Text Paint . text Size Ġ= Ġtext Size . toFloat () ĊĠĠĠĠĠĠĠ Ġcenter Line Paint . color Ġ= Ġcenter Line Color ĊĠĠĠĠĠĠĠ Ġcenter Line Paint . is Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġcenter Line Paint . type face Ġ= ĠResources Compat . getFont ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . font . not os ans _ bold ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcenter Line Paint . text Size Ġ= Ġtext Size . toFloat () ĊĠĠĠĠĠĠĠ Ġmeasure Text Width Height () ĊĠĠĠĠĠĠĠ Ġval Ġm Half Circ um ference Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( max Text Height . toFloat () Ġ* Ġline Spacing Multiplier Ġ* Ġ( draw Items Count Ġ- Ġ 1 ). toFloat ()). toInt () ĊĠĠĠĠĠĠĠ Ġcircular Di ameter Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ(( m Half Circ um ference Ġ* Ġ 2 ). toDouble () Ġ/ Ġ 3 . 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 ). toInt () ĊĠĠĠĠĠĠĠ Ġcircular Radius Ġ= Ġ( m Half Circ um ference . toDouble () Ġ/ Ġ 3 . 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 ). toInt () ĊĠĠĠĠĠĠĠ Ġif Ġ( initial Position Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Position Ġ= Ġif Ġ( can Loop ) Ġ( data !!. size Ġ+ Ġ 1 ) Ġ/ Ġ 2 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠcurrentIndex Ġ= Ġinitial Position ĊĠĠĠĠĠĠĠ Ġthis . invalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmeasure Text Width Height () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrect Ġ= ĠRect () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġdata !!. indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs 1 Ġ= Ġdata ! ![ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcenter Text Paint . getText Bounds ( s 1 , Ġ 0 , Ġs 1 . length , Ġrect ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Width Ġ= Ġrect . width () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Height Ġ= Ġrect . height () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Text Width Ġ= Ġif Ġ( text Width Ġ> Ġmax Text Width ) Ġtext Width Ġelse Ġmax Text Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Text Height Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text Height Ġ> Ġmax Text Height ) Ġtext Height Ġelse Ġmax Text Height ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Measure ( width Measure Spec , Ġheight Measure Spec ) ĊĠĠĠĠĠĠĠ Ġwidget Width Ġ= Ġthis . meas ured Width ĊĠĠĠĠĠĠĠ Ġwidget Height Ġ= ĠMeasure Spec . getSize ( height Measure Spec ) ĊĠĠĠĠĠĠĠ Ġval Ġheight Mode Ġ= ĠMeasure Spec . get Mode ( height Measure Spec ) ĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" on Measure Ġ-> Ġheight Mode :$ height Mode ") ĊĠĠĠĠĠĠĠ Ġitem Height Ġ= Ġline Spacing Multiplier Ġ* Ġmax Text Height . toFloat () ĊĠĠĠĠĠĠĠ Ġpadding Left Right Ġ= Ġ( widget Width Ġ- Ġmax Text Width ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġpadding Top Bottom Ġ= Ġ( widget Height Ġ- Ġcircular Di ameter ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġtop Line Y Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ(( circular Di ameter . toFloat () Ġ- Ġitem Height ) Ġ/ Ġ 2 . 0 f ). toInt () Ġ+ Ġpadding Top Bottom ĊĠĠĠĠĠĠĠ Ġbottom Line Y Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ(( circular Di ameter . toFloat () Ġ+ Ġitem Height ) Ġ/ Ġ 2 . 0 f ). toInt () Ġ+ Ġpadding Top Bottom ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Changing Item Ġ= Ġ( total Scroll Y . toFloat () Ġ/ Ġitem Height ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentIndex Ġ= Ġinitial Position Ġ+ Ġm Changing Item Ġ% Ġdata !!. size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! can Loop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentIndex Ġ= Ġif Ġ( currentIndex Ġ< Ġ 0 ) Ġ 0 Ġelse ĠcurrentIndex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentIndex Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentIndex Ġ> Ġdata !!. size Ġ- Ġ 1 ) Ġdata !!. size Ġ- Ġ 1 Ġelse ĠcurrentIndex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentIndex Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentIndex Ġ< Ġ 0 ) ĠcurrentIndex Ġ+ Ġdata !!. size Ġelse ĠcurrentIndex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentIndex Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentIndex Ġ> Ġdata !!. size Ġ- Ġ 1 ) ĠcurrentIndex Ġ- Ġdata !!. size Ġelse ĠcurrentIndex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtemplate Item : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( count Ġ< Ġdraw Items Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemplate Item Ġ= ĠcurrentIndex Ġ- Ġ( draw Items Count Ġ/ Ġ 2 Ġ- Ġcount ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( can Loop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemplate Item Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( template Item Ġ< Ġ 0 ) Ġtemplate Item Ġ+ Ġdata !!. size Ġelse Ġtemplate Item ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemplate Item Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( template Item Ġ> Ġdata !!. size Ġ- Ġ 1 ) Ġtemplate Item Ġ- Ġdata !!. size Ġelse Ġtemplate Item ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Count ! ![ count ] Ġ= Ġdata ! ![ template Item ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( template Item Ġ>= Ġ 0 Ġ&& Ġtemplate Item Ġ<= Ġdata !!. size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Count ! ![ count ] Ġ= Ġdata ! ![ template Item ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Count ! ![ count ] Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ++ count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Line ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Line Y . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidget Width . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Line Y . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcenter Line Paint ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Line ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Line Y . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidget Width . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Line Y . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcenter Line Paint ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemplate Item Ġ= Ġ( total Scroll Y . toFloat () Ġ% Ġitem Height ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( count Ġ< Ġdraw Items Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . save () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Height Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Text Height . toFloat () Ġ* Ġline Spacing Multiplier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrad ian Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( item Height Ġ* Ġcount . toFloat () Ġ- Ġtemplate Item . toFloat ()) Ġ/ Ġcircular Radius . toFloat ()). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġangle Ġ= Ġ( rad ian Ġ* Ġ 1 8 0 . 0 Ġ/ Ġ 3 . 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( angle Ġ< Ġ 1 8 0 . 0 f Ġ&& Ġangle Ġ> Ġ 0 . 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠtranslateY Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( circular Radius . toDouble () Ġ- ĠMath . cos ( rad ian ) Ġ* Ġcircular Radius . toDouble () Ġ- ĠMath . sin ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrad ian ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ* Ġmax Text Height . toDouble () Ġ/ Ġ 2 . 0 ). toInt () Ġ+ Ġpadding Top Bottom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . translate ( 0 . 0 f , ĠtranslateY . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . scale ( 1 . 0 f , ĠMath . sin ( rad ian ). toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( translate Y Ġ> Ġtop Line Y Ġ&& Ġmax Text Height Ġ+ ĠtranslateY Ġ< Ġbottom Line Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( translate Y Ġ>= Ġtop Line Y Ġ&& Ġmax Text Height Ġ+ ĠtranslateY Ġ<= Ġbottom Line Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . clip Rect ( 0 , Ġ 0 , Ġwidget Width , Ġitem Height . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Count ! ![ count ] !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Left Right . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Text Height . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcenter Text Paint ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Item Ġ= Ġdata !!. indexOf ( item Count ! ![ count ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdiff Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( translate Y Ġ<= Ġtop Line Y ) Ġtop Line Y Ġ- ĠtranslateY Ġelse Ġbottom Line Y Ġ- ĠtranslateY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtop Bottom Paint Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( translate Y Ġ<= Ġtop Line Y ) Ġtop Bottom Text Paint Ġelse Ġcenter Text Paint ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcenter Paint Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( translate Y Ġ<= Ġtop Line Y ) Ġcenter Text Paint Ġelse Ġtop Bottom Text Paint ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . save () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . clip Rect ( 0 , Ġ 0 , Ġwidget Width , Ġdiff ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Count ! ![ count ] !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Left Right . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Text Height . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Bottom Paint ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . restore () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . save () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . clip Rect ( 0 , Ġdiff , Ġwidget Width , Ġitem Height . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Count ! ![ count ] !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Left Right . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Text Height . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcenter Paint ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . restore () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . restore () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . restore () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ++ count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( motion event : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( motion event . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! gesture Detector !!. on Touch Event ( motion event )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . start Smooth Scroll To () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! gesture Detector !!. on Touch Event ( motion event )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . start Smooth Scroll To () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Can Loop ( can Loop : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . can Loop Ġ= Ġcan Loop ĊĠĠĠĠĠĠĠ Ġthis . invalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Text Size ( size : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ> Ġ 0 . 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Size Ġ= Ġsp 2 px ( this . context , Ġsize ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Init Position ( init Position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinitial Position Ġ= Ġinit Position ĊĠĠĠĠĠĠĠ Ġthis . invalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Loop Listener ( Loop Listener : ĠLoop Scroll Listener ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġloop Scroll Listener Ġ= ĠLoop Listener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Items ( list : ĠList < String > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġdata Ġ= Ġlist ĊĠĠĠĠĠĠĠ Ġinit Data () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġitem Selected () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( loop Scroll Listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Delayed (` Atomic Picker DO B $$ Lambda $ 3 `.` lambda Factory $ `( this ), Ġ 2 0 0 L ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon ItemSelected () Ġ{ ĊĠĠĠĠĠĠĠ Ġdata ! ![ selected Item ] ĊĠĠĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġloop Scroll Listener ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloop Scroll Listener !!. on Item Select ( selected Item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcancel Schedule () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġscheduled Future Ġ&& Ġ! scheduled Future !!. is Cancelled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscheduled Future !!. cancel ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscheduled Future Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Smooth Scroll To () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġ( total Scroll Y . toFloat () Ġ% Ġitem Height ). toInt () ĊĠĠĠĠĠĠĠ Ġcancel Schedule () ĊĠĠĠĠĠĠĠ Ġscheduled Future Ġ= ĠexecutorService . schedule With Fixed Delay ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHalf Height Runnable ( offset ), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 L , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 0 L , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTimeUnit . MILLISECONDS ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Smooth Scroll To ( velocity Y : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcancel Schedule () ĊĠĠĠĠĠĠĠ Ġval Ġvelocity Fl ing Ġ= Ġ 2 0 ĊĠĠĠĠĠĠĠ Ġscheduled Future Ġ= ĠexecutorService . schedule With Fixed Delay ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF ling Runnable ( velocity Y ), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 L , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity Fl ing . to Long (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTimeUnit . MILLISECONDS ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsp 2 px ( context : ĠContext , Ġsp Value : ĠFloat ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfont Scale Ġ= Ġcontext . resources . display Metrics . scaled Density ĊĠĠĠĠĠĠĠ Ġreturn Ġ( sp Value Ġ* Ġfont Scale Ġ+ Ġ 0 . 5 f ). toInt () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġinner Ġclass ĠF ling Runnable ( val Ġvelocity Y : ĠFloat ) Ġ: ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġvelocity Ġ= Ġ 2 . 1 4 7 4 8 3 6 5 E 9 f ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( velocity Ġ== Ġ 2 . 1 4 7 4 8 3 6 5 E 9 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( abs ( velocity Y ) Ġ> Ġ 2 0 0 0 . 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity Ġ= Ġif Ġ( velocity Y Ġ> Ġ 0 . 0 f ) Ġ 2 0 0 0 . 0 f Ġelse Ġ- 2 0 0 0 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity Ġ= Ġvelocity Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" velocity ->" Ġ+ Ġvelocity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Math . abs ( velocity ) Ġin Ġ 0 . 0 f .. 2 0 . 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Schedule () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Handler . send Empty Message ( 2 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġ( velocity Ġ* Ġ 1 0 . 0 f Ġ/ Ġ 1 0 0 0 . 0 f ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Scroll Y Ġ-= Ġi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! can Loop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Height Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Spacing Multiplier Ġ* Ġmax Text Height . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( total Scroll Y Ġ<= Ġ(( - initial Position ). toFloat () Ġ* Ġitem Height ). toInt ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity Ġ= Ġ 4 0 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Scroll Y Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( - initial Position ). toFloat () Ġ* Ġitem Height ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( total Scroll Y Ġ>= Ġ(( data !!. size Ġ- Ġ 1 Ġ- Ġinitial Position ). toFloat () Ġ* Ġitem Height ). toInt ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Scroll Y Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( data !!. size Ġ- Ġ 1 Ġ- Ġinitial Position ). toFloat () Ġ* Ġitem Height ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity Ġ= Ġ- 4 0 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( velocity Ġ< Ġ 0 . 0 f ) Ġvelocity Ġ+ Ġ 2 0 . 0 f Ġelse Ġvelocity Ġ- Ġ 2 0 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Handler . send Empty Message ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġinner Ġclass ĠHalf Height Runnable ( var Ġoffset : ĠInt ) Ġ: ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġreal Total Offset Ġ= Ġ 2 1 4 7 4 8 3 6 4 7 ĊĠĠĠĠĠĠĠ Ġvar Ġreal Offset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( real Total Offset Ġ== Ġ 2 1 4 7 4 8 3 6 4 7 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( offset . toFloat () Ġ> Ġitem Height Ġ/ Ġ 2 . 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreal Total Offset Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( item Height Ġ- Ġoffset . toFloat ()). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreal Total Offset Ġ= Ġ- offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreal Offset Ġ= Ġ( real Total Offset . toFloat () Ġ* Ġ 0 . 1 f ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( real Offset Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreal Offset Ġ= Ġif Ġ( real Total Offset Ġ< Ġ 0 ) Ġ- 1 Ġelse Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Math . abs ( real Total Offset ) Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Schedule () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Handler . send Empty Message ( 3 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Scroll Y Ġ+= Ġreal Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Handler . send Empty Message ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreal Total Offset Ġ-= Ġreal Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġinner Ġclass ĠW heel View Gesture Listener Ġ: ĠGest ure Detector . Simple On Gesture Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Down ( motion event : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Schedule () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Wheel View Gesture Listener Ġ-> Ġon Down ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Fl ing ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe 1 : ĠMotion Event , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe 2 : ĠMotion Event , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity X : ĠFloat , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity Y : ĠFloat ĊĠĠĠĠĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Atomic Picker DO B . start Smooth Scroll To ( velocity Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Wheel View Gesture Listener Ġ-> Ġon Fl ing ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scroll ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe 1 : ĠMotion Event , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe 2 : ĠMotion Event , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdistance X : ĠFloat , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdistance Y : ĠFloat ĊĠĠĠĠĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Wheel View Gesture Listener Ġ-> Ġon Scroll " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Scroll Y Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( total Scroll Y . toFloat () Ġ+ Ġdistance Y ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! can Loop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcircle Length Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( data !!. size Ġ- Ġ 1 Ġ- Ġinitial Position ). toFloat () Ġ* Ġitem Height ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinit Position Circle Length Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( initial Position . toFloat () Ġ* Ġitem Height ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinit Position Start Y Ġ= Ġ- 1 Ġ* Ġinit Position Circle Length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Scroll Y Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( total Scroll Y Ġ< Ġinit Position Start Y ) Ġinit Position Start Y Ġelse Ġtotal Scroll Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Scroll Y Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( total Scroll Y Ġ>= Ġcircle Length ) Ġcircle Length Ġelse Ġtotal Scroll Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Atomic Picker DO B . invalidate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠAtomic Picker :: class . java . simple Name ĊĠĠĠ Ġ} Ċ }