/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠTr inity . ĠAll Ġrights Ġreserved . Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠWang ĠL ian J ie Ġ< w lan j ie 8 8 8 @ gmail . com > Ċ Ġ* Ċ Ġ* Ġ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 . tr inity . sample . view Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . Color Filter Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Typed Value Ċ import Ġandroid . view . Gravity Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . LinearLayout Ċ import Ġandroid . widget . ScrollView Ċ import Ġandroid . widget . TextView Ċ Ċ @ Suppress (" DE PREC ATION ") Ċ class ĠW heel View Ġ: ĠScroll View Ġ{ ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠOFF _ SET _ DEFAULT Ġ= Ġ 1 ĊĠĠĠ Ġprivate Ġconst Ġval ĠSC ROLL _ DIRECTION _ UP Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġconst Ġval ĠSC ROLL _ DIRECTION _ DOWN Ġ= Ġ 1 ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġitems Ġ= Ġmutable ListOf < DataModel >() ĊĠ Ġprivate Ġvar Ġviews : ĠLinearLayout ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġoffset Ġ= ĠOFF _ SET _ DEFAULT ĊĠ Ġprivate Ġvar Ġdisplay ItemCount Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġselected Index Ġ= Ġ 1 ĊĠ Ġprivate Ġvar Ġinitial Y Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġsc roller Task : ĠRunnable ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġnew Check Ġ= Ġ 5 0 ĊĠ Ġprivate Ġvar Ġitem Height Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġselected Area Border Ġ= Ġint ArrayOf () ĊĠ Ġprivate Ġvar Ġscroll Direction Ġ= Ġ- 1 ĊĠ Ġprivate Ġvar Ġpaint : ĠPaint ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġview Width Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġon Wheel View Listener : ĠOn Wheel View Listener ? Ġ= Ġnull ĊĊĠ Ġinterface ĠOn Wheel View Listener Ġ{ ĊĠĠĠ Ġfun Ġon Selected ( selectedIndex : ĠInt , Ġitem : ĠString ?) ĊĠ Ġ} ĊĊĠ Ġconstructor ( context : ĠContext ) Ġ: Ġsuper ( context ) Ġ{ ĊĠĠĠ Ġinit ( context ) ĊĠ Ġ} ĊĊĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ?) Ġ: Ġsuper ( context , Ġattrs ) Ġ{ ĊĠĠĠ Ġinit ( context ) ĊĠ Ġ} ĊĊĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ?, Ġdef Style : ĠInt ) Ġ: Ġsuper ( context , Ġattrs , Ġdef Style ) Ġ{ ĊĠĠĠ Ġinit ( context ) ĊĠ Ġ} ĊĊĠ Ġfun Ġset Offset ( offset : ĠInt ) Ġ{ ĊĠĠĠ Ġthis . offset Ġ= Ġoffset ĊĠ Ġ} ĊĊĠ Ġfun Ġset Items ( list : ĠList < DataModel > ?) Ġ{ ĊĠĠĠ Ġitems . clear () ĊĠĠĠ Ġitems . addAll ( list !! ) ĊĊĠĠĠ Ġ// Ġ åīį éĿ¢ åĴĮ åĲİ éĿ¢ è¡¥ åħ¨ ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġoffset ) Ġ{ ĊĠĠĠĠĠ Ġitems . add ( 0 , Ġobject Ġ: ĠData Model Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetText (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠ Ġitems . add ( object Ġ: ĠData Model Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetText (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĠĠĠ Ġinit Data () ĊĠ Ġ} ĊĊĊĠ Ġprivate Ġfun Ġinit ( context : ĠContext ) Ġ{ ĊĠĠĠ Ġthis . is Vertical ScrollBar Enabled Ġ= Ġfalse ĊĠĠĠ Ġviews Ġ= ĠLinearLayout ( context ) ĊĠĠĠ Ġviews !!. orientation Ġ= ĠLinearLayout . VERTICAL ĊĠĠĠ Ġthis . addView ( views ) ĊĠĠĠ Ġsc roller Task Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠ Ġval Ġnew Y Ġ= Ġscroll Y ĊĠĠĠĠĠ Ġif Ġ( initial Y Ġ- Ġnew Y Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremainder Ġ= Ġinitial Y Ġ% Ġitem Height ĊĠĠĠĠĠĠĠ Ġval Ġdivided Ġ= Ġinitial Y Ġ/ Ġitem Height ĊĠĠĠĠĠĠĠ Ġif Ġ( remainder Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġselected Index Ġ= Ġdivided Ġ+ Ġoffset ĊĠĠĠĠĠĠĠĠĠ Ġon Se leted CallBack () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( remainder Ġ> Ġitem Height Ġ/ Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsmooth Scroll To ( 0 , Ġinitial Y Ġ- Ġremainder Ġ+ Ġitem Height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Index Ġ= Ġdivided Ġ+ Ġoffset Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Se leted CallBack () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsmooth Scroll To ( 0 , Ġinitial Y Ġ- Ġremainder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Index Ġ= Ġdivided Ġ+ Ġoffset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Se leted CallBack () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġinitial Y Ġ= Ġscroll Y ĊĠĠĠĠĠĠĠ Ġpost Delayed ( sc roller Task , Ġnew Check . to Long ()) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġstart Scroller Task () Ġ{ ĊĠĠĠ Ġinitial Y Ġ= Ġscroll Y ĊĠĠĠ Ġpost Delayed ( sc roller Task , Ġnew Check . to Long ()) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġinit Data () Ġ{ ĊĠĠĠ Ġdisplay ItemCount Ġ= Ġoffset Ġ* Ġ 2 Ġ+ Ġ 1 ĊĠĠĠ Ġfor Ġ( i Ġin Ġitems . indices ) Ġ{ ĊĠĠĠĠĠ Ġviews !!. addView ( create View ( items [ i ]. getText (), Ġi , Ġdisplay ItemCount )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġrefresh Item View ( 0 ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate View ( item : ĠString , Ġposition : ĠInt , Ġcount : ĠInt ): ĠTextView Ġ{ ĊĠĠĠ Ġval Ġtv Ġ= ĠTextView ( context ) ĊĠĠĠ Ġtv . layout Params Ġ= ĠLayout Params ( ViewGroup . LayoutParams . MATCH _ PARENT , ĠViewGroup . LayoutParams . WRAP _ CONTENT ) ĊĠĠĠ Ġtv . is Single Line Ġ= Ġtrue ĊĠĠĠ Ġtv . setText Size ( Typed Value . COMPLEX _ UNIT _ SP , Ġ 1 8 f ) ĊĠĠĠ Ġtv . text Ġ= Ġitem ĊĠĠĠ Ġtv . gravity Ġ= ĠGr avity . CENTER ĊĠĠĠ Ġval Ġpadding Ġ= Ġdip 2 px ( 1 2 f ) ĊĠĠĠ Ġtv . set Padding ( padding , Ġpadding , Ġpadding , Ġpadding ) ĊĠĠĠ Ġif Ġ( 0 Ġ== Ġitem Height ) Ġ{ ĊĠĠĠĠĠ Ġitem Height Ġ= Ġget View Measured Height ( tv ) ĊĠĠĠĠĠ Ġviews !!. layout Params Ġ= ĠLayout Params ( ViewGroup . LayoutParams . MATCH _ PARENT , Ġitem Height Ġ* Ġdisplay ItemCount ) ĊĠĠĠĠĠ Ġval Ġlp Ġ= Ġthis . layout Params Ġas ĠLinearLayout . LayoutParams ĊĠĠĠĠĠ Ġthis . layout Params Ġ= ĠLinearLayout . LayoutParams ( lp . width , Ġitem Height Ġ* Ġdisplay ItemCount ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtv ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Scroll Changed ( l : ĠInt , Ġt : ĠInt , Ġold l : ĠInt , Ġold t : ĠInt ) Ġ{ ĊĠĠĠ Ġsuper . on Scroll Changed ( l , Ġt , Ġold l , Ġold t ) ĊĠĠĠ Ġrefresh Item View ( t ) ĊĠĠĠ Ġscroll Direction Ġ= Ġif Ġ( t Ġ> Ġold t ) Ġ{ ĊĠĠĠĠĠ ĠSC ROLL _ DIRECTION _ DOWN ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ ĠSC ROLL _ DIRECTION _ UP ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġrefresh Item View ( y : ĠInt ) Ġ{ ĊĠĠĠ Ġvar Ġposition Ġ= Ġy Ġ/ Ġitem Height Ġ+ Ġoffset ĊĠĠĠ Ġval Ġremainder Ġ= Ġy Ġ% Ġitem Height ĊĠĠĠ Ġval Ġdivided Ġ= Ġy Ġ/ Ġitem Height ĊĠĠĠ Ġif Ġ( remainder Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġposition Ġ= Ġdivided Ġ+ Ġoffset ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġif Ġ( remainder Ġ> Ġitem Height Ġ/ Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġposition Ġ= Ġdivided Ġ+ Ġoffset Ġ+ Ġ 1 ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġchild Size Ġ= Ġviews !!. child Count ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġchild Size ) Ġ{ ĊĠĠĠĠĠ Ġval ĠitemView Ġ= Ġviews !!. getChild At ( i ) Ġas ĠTextView Ġ?: Ġreturn ĊĠĠĠĠĠ Ġif Ġ( position Ġ== Ġi ) Ġ{ ĊĠĠĠĠĠĠĠ ĠitemView . setTextColor ( Color . parse Color ("# 0 2 8 8 ce ")) ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠitemView . setTextColor ( Color . parse Color ("# bbbb bb ")) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġèİ·åıĸ éĢī ä¸Ń åĮºåŁŁ çļĦ è¾¹ çķĮ ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġobtain Selected Area Border (): ĠInt Array Ġ{ ĊĠĠĠ Ġselected Area Border [ 0 ] Ġ= Ġitem Height Ġ* Ġoffset ĊĠĠĠ Ġselected Area Border [ 1 ] Ġ= Ġitem Height Ġ* Ġ( offset Ġ+ Ġ 1 ) ĊĠĠĠ Ġreturn Ġselected Area Border ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġset Background Drawable ( background : ĠDrawable ?) Ġ{ ĊĠĠĠ Ġif Ġ( view Width Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġview Width Ġ= Ġ( context Ġas ĠActivity ). window Manager . default Display . width ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( null Ġ== Ġpaint ) Ġ{ ĊĠĠĠĠĠ Ġpaint Ġ= ĠPaint () ĊĠĠĠĠĠ Ġpaint ?. color Ġ= ĠColor . parse Color ("# 8 3 cde 6 ") ĊĠĠĠĠĠ Ġpaint ?. stroke Width Ġ= Ġdip 2 px ( 1 f ). toFloat () ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( selected Area Border . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġdrawable Ġ= Ġobject Ġ: ĠDrawable () Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġdraw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpaint ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Line ( 0 f , Ġobtain Selected Area Border ()[ 0 ]. toFloat (), Ġview Width . toFloat (), Ġobtain Selected Area Border ()[ 0 ]. toFloat (), Ġit ) ĊĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Line ( 0 f , Ġobtain Selected Area Border ()[ 1 ]. toFloat (), Ġview Width . toFloat (), Ġobtain Selected Area Border ()[ 1 ]. toFloat (), Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġset Alpha ( alpha : ĠInt ) Ġ{} ĊĠĠĠĠĠ Ġoverride Ġfun Ġset Color Filter ( cf : ĠColor Filter ?) Ġ{} ĊĊĠĠĠĠĠ Ġ@ Suppress Lint (" Wrong Constant ") ĊĠĠĠĠĠ Ġoverride Ġfun Ġget Opacity (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġsuper . setBackground Drawable ( drawable ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Size Changed ( w : ĠInt , Ġh : ĠInt , Ġold w : ĠInt , Ġold h : ĠInt ) Ġ{ ĊĠĠĠ Ġsuper . on Size Changed ( w , Ġh , Ġold w , Ġold h ) ĊĠĠĠ Ġview Width Ġ= Ġw ĊĠĠĠ Ġset Background Drawable ( null ) ĊĠ Ġ} ĊĊĠ Ġfun Ġset On Wheel View Listener ( l : ĠOn Wheel View Listener ) Ġ{ ĊĠĠĠ Ġon Wheel View Listener Ġ= Ġl ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġon Se leted CallBack () Ġ{ ĊĠĠĠ Ġon Wheel View Listener ?. on Selected ( selectedIndex Ġ- Ġoffset , Ġitems [ selectedIndex ]. getText ()) ĊĠ Ġ} ĊĊĠ Ġfun Ġset Selection ( position : ĠInt ) Ġ{ ĊĠĠĠ Ġselected Index Ġ= Ġposition Ġ+ Ġoffset ĊĠĠĠ Ġpost Delayed ({ Ġscroll To ( 0 , Ġposition Ġ* Ġitem Height ) Ġ}, Ġ 3 0 0 ) ĊĠ Ġ} ĊĊĠ Ġval Ġse leted Item : ĠString ĊĠĠĠ Ġget () Ġ= Ġitems [ selectedIndex ]. getText () ĊĊĠ Ġval Ġse leted Index : ĠInt ĊĠĠĠ Ġget () Ġ= Ġselected Index Ġ- Ġoffset ĊĊĠ Ġoverride Ġfun Ġfl ing ( velocity Y : ĠInt ) Ġ{ ĊĠĠĠ Ġsuper . fl ing ( velocity Y Ġ/ Ġ 3 ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Touch Event ( ev : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( ev . action Ġ== ĠMotion Event . ACTION _ UP ) Ġ{ ĊĠĠĠĠĠ Ġstart Scroller Task () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġsuper . on Touch Event ( ev ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġdip 2 px ( dp Value : ĠFloat ): ĠInt Ġ{ ĊĠĠĠ Ġval Ġscale Ġ= Ġcontext !!. resources . display Metrics . density ĊĠĠĠ Ġreturn Ġ( dp Value Ġ* Ġscale Ġ+ Ġ 0 . 5 f ). toInt () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget View Measured Height ( view : ĠView ): ĠInt Ġ{ ĊĠĠĠ Ġval Ġwidth Ġ= ĠMeasure Spec . make Measure Spec ( 0 , ĠMeasure Spec . UNSPECIFIED ) ĊĠĠĠ Ġval Ġexpand Spec Ġ= ĠMeasure Spec . make Measure Spec ( Int . MAX _ VALUE Ġshr Ġ 2 , ĠMeasure Spec . AT _ MO ST ) ĊĠĠĠ Ġview . measure ( width , Ġexpand Spec ) ĊĠĠĠ Ġreturn Ġview . meas ured Height ĊĠ Ġ} ĊĊĠ Ġinterface ĠData Model Ġ{ ĊĠĠĠ Ġfun ĠgetText (): ĠString ĊĠ Ġ} Ċ }