/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 . ĠVari ance Ġtechnologies . ĠAll Ġrights Ġreserved . Ċ Ġ* ĠCreated ĠBy ĠT EK OM BO ĠG ab riel Ġ< tek om bo . gab riel @ gmail . com > Ġon Ġ 0 7 / 1 0 / 1 9 Ġ 1 3 : 4 2 . Ċ Ġ*/ Ċ package Ġcom . an anya . x inder . widgets Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġandroid . view . animation . Interpolator Ċ import Ġandroid . view . animation . Translate Animation Ċ import Ġandroidx . core . view . Margin LayoutParams Compat Ċ import Ġandroidx . core . view . View Compat Ċ import Ġandroidx . core . widget . Nested ScrollView Ċ import Ġcom . the code . t inder clone . R Ċ Ċ class ĠBo unce ScrollView ( context : ĠContext , Ġattrs : ĠAttributeSet ?, Ġdef Style Attr : ĠInt ) Ġ: ĠNested ScrollView ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĠĠĠ Ġvar Ġis Scroll H orizontally : ĠBoolean ĊĠĠĠ Ġprivate Ġvar Ġm D amping : ĠFloat ĊĠĠĠ Ġvar Ġis Incremental D amping : ĠBoolean ĊĠĠĠ Ġprivate Ġvar Ġm Bo unce Delay : ĠLong ĊĠĠĠ Ġprivate Ġvar Ġm Trigger Over Scroll Threshold : ĠInt ĊĠĠĠ Ġprivate Ġvar Ġm Interpolator : ĠInterpol ator ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Child View : ĠView ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Start Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġm Pre Delta Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm Over Sc rolled Distance Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġm Normal Rect Ġ= ĠRect () ĊĠĠĠ Ġprivate Ġvar Ġm Scroll Listener : ĠOn Scroll Listener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Over Scroll Listener : ĠOn Over Scroll Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġthis ( context , Ġnull ) Ġ{} ĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ?) Ġ: Ġthis ( context , Ġattrs , Ġ 0 ) Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġon Finish Inf late () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Finish Inf late () ĊĠĠĠĠĠĠĠ Ġif Ġ( child Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Child View Ġ= Ġget Child At ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Measure ( width Measure Spec , Ġheight Measure Spec ) ĊĠĠĠĠĠĠĠ Ġif Ġ( child Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġget Child At ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġchild Measured Height Ġ= Ġchild . meas ured Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child Measured Height Ġ<= Ġ 0 ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġchild Measured Width Ġ= Ġchild . meas ured Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmargin Start : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtop Margin : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmargin End : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbottom Margin : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlp Ġ= Ġchild . layout Params ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lp Ġis ĠMargin LayoutParams ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmargin Start Ġ= ĠMargin LayoutParams Compat . get Margin Start ( lp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Margin Ġ= Ġlp . top Margin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmargin End Ġ= ĠMargin LayoutParams Compat . get Margin End ( lp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Margin Ġ= Ġlp . bottom Margin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( margin Start Ġ!= Ġ 0 Ġ|| Ġtop Margin Ġ!= Ġ 0 Ġ|| Ġmargin End Ġ!= Ġ 0 Ġ|| Ġbottom Margin Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child Measured Height Ġ<= Ġmeasured Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Measured Width Ġ-= Ġmargin Start Ġ+ Ġmargin End ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Measured Height Ġ-= Ġtop Margin Ġ+ Ġbottom Margin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Measured Height Ġ+= Ġtop Margin Ġ+ Ġbottom Margin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidth Spec Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMeasure Spec . make Measure Spec ( child Measured Width , ĠMeasure Spec . EX ACT LY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Spec Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMeasure Spec . make Measure Spec ( child Measured Height , ĠMeasure Spec . EX ACT LY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . measure ( width Spec , Ġheight Spec ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcan Scroll Vert ically ( direction : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ! is Scroll H orizontally ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcan Scroll H orizontally ( direction : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġis Scroll H orizontally ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Intercept Touch Event ( ev : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( ev . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġm Start Ġ= Ġif Ġ( is Scroll H orizontally ) Ġev . x Ġelse Ġev . y ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġreturn Ġif Ġ( is Scroll H orizontally ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscroll X Ġ= Ġev . x Ġ- Ġm Start ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMath . abs ( scroll X ) Ġ>= Ġm Trigger Over Scroll Threshold ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscroll Y Ġ= Ġev . y Ġ- Ġm Start ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMath . abs ( scroll Y ) Ġ>= Ġm Trigger Over Scroll Threshold ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Intercept Touch Event ( ev ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġperform Click (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . perform Click () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( ev : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Child View Ġ== Ġnull ) Ġreturn Ġsuper . on Touch Event ( ev ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( ev . action Mask ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow : ĠFloat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta : ĠFloat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd amping Delta : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnow Ġ= Ġif Ġ( is Scroll H orizontally ) Ġev . x Ġelse Ġev . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelta Ġ= Ġm Start Ġ- Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd amping Delta Ġ= Ġ( delta Ġ/ Ġcalculate D amping ()). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Start Ġ= Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġone Pointer Touch Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Pre Delta Ġ<= Ġ 0 Ġ&& Ġd amping Delta Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġone Pointer Touch Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( m Pre Delta Ġ>= Ġ 0 Ġ&& Ġd amping Delta Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġone Pointer Touch Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Pre Delta Ġ= Ġd amping Delta ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( one Pointer Touch Ġ&& Ġcan Move ( d amping Delta )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Normal Rect . isEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Normal Rect [ m Child View !!. left , Ġm Child View !!. top , Ġm Child View !!. right ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Child View !!. bottom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Scroll H orizontally ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Child View !!. layout ( m Child View !!. left Ġ- Ġd amping Delta , Ġm Child View !!. top , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Child View !!. right Ġ- Ġd amping Delta , Ġm Child View !!. bottom ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Child View !!. layout ( m Child View !!. left , Ġm Child View !!. top Ġ- Ġd amping Delta , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Child View !!. right , Ġm Child View !!. bottom Ġ- Ġd amping Delta ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Over Scroll Listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Over Sc rolled Distance Ġ+= Ġd amping Delta ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Over Scroll Listener !!. on Over Scrolling ( m Over Sc rolled Distance Ġ<= Ġ 0 , ĠMath . abs ( m Over Sc rolled Distance )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperform Click () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! m Normal Rect . isEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Child View With Animation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Pre Delta Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Over Sc rolled Distance Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ CANCEL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! m Normal Rect . isEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Child View With Animation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Pre Delta Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Over Sc rolled Distance Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Touch Event ( ev ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate D amping (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġratio : ĠFloat ĊĠĠĠĠĠĠĠ Ġratio Ġ= Ġif Ġ( is Scroll H orizontally ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMath . abs ( m Child View !!. left ) Ġ* Ġ 1 . 0 f Ġ/ Ġm Child View !!. meas ured Width ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMath . abs ( m Child View !!. top ) Ġ* Ġ 1 . 0 f Ġ/ Ġm Child View !!. meas ured Height ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġratio Ġ+= Ġ 0 . 2 f ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Incremental D amping ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm D amping Ġ/ Ġ( 1 . 0 f Ġ- ĠMath . pow ( ratio . toDouble (), Ġ 2 . 0 ). toFloat ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm D amping ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset Child View With Animation () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġanim : ĠTranslate Animation ĊĠĠĠĠĠĠĠ Ġval Ġlayout Params Ġ= Ġm Child View !!. layout Params ĊĠĠĠĠĠĠĠ Ġval Ġfixed Padding : ĠInt ĊĠĠĠĠĠĠĠ Ġvar Ġfixed Margin Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( is Scroll H orizontally ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( View Compat . get Layout Direction ( this ) Ġ== ĠView Compat . LAYOUT _ DIRECTION _ RTL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfixed Padding Ġ= ĠView Compat . get Padding End ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( layout Params Ġis ĠMargin LayoutParams ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfixed Margin Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMargin LayoutParams Compat . get Margin End ( layout Params ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfixed Padding Ġ= ĠView Compat . get Padding Start ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( layout Params Ġis ĠMargin LayoutParams ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfixed Margin Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMargin LayoutParams Compat . get Margin Start ( layout Params ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim Ġ= ĠTranslate Animation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( m Child View !!. left Ġ- Ġfixed Padding Ġ- Ġfixed Margin ). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( m Normal Rect . left Ġ- Ġfixed Padding Ġ- Ġfixed Margin ). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 F , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 F ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfixed Padding Ġ= Ġpadding Top ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( layout Params Ġis ĠMargin LayoutParams ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfixed Margin Ġ= Ġlayout Params . top Margin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim Ġ= ĠTranslate Animation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 F , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 F , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( m Child View !!. top Ġ- Ġfixed Padding Ġ- Ġfixed Margin ). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( m Normal Rect . top Ġ- Ġfixed Padding Ġ- Ġfixed Margin ). toFloat ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġanim . interpol ator Ġ= Ġm Interpolator ĊĠĠĠĠĠĠĠ Ġanim . duration Ġ= Ġm Bo unce Delay ĊĠĠĠĠĠĠĠ Ġm Child View !!. start Animation ( anim ) ĊĠĠĠĠĠĠĠ Ġm Child View !!. layout ( m Normal Rect . left , Ġm Normal Rect . top , Ġm Normal Rect . right , Ġm Normal Rect . bottom ) ĊĠĠĠĠĠĠĠ Ġm Normal Rect . set Empty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcan Move ( delta : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( delta Ġ!= Ġ 0 Ġ&& Ġdelta Ġ< Ġ 0 ) Ġcan Move From Start () Ġelse Ġcan Move From End () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcan Move From Start (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Scroll H orizontally ) Ġscroll X Ġ== Ġ 0 Ġelse Ġscroll Y Ġ== Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcan Move From End (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Scroll H orizontally ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoffset Ġ= Ġm Child View !!. meas ured Width Ġ- Ġwidth ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġif Ġ( offset Ġ< Ġ 0 ) Ġ 0 Ġelse Ġoffset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscroll X Ġ== Ġoffset ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoffset Ġ= Ġm Child View !!. meas ured Height Ġ- Ġheight ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġif Ġ( offset Ġ< Ġ 0 ) Ġ 0 Ġelse Ġoffset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscroll Y Ġ== Ġoffset ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Scroll Changed ( scroll X : ĠInt , Ġscroll Y : ĠInt , Ġold l : ĠInt , Ġold t : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Scroll Changed ( scroll X , Ġscroll Y , Ġold l , Ġold t ) ĊĠĠĠĠĠĠĠ Ġif Ġ( m Scroll Listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Scroll Listener !!. on Scrolling ( scroll X , Ġscroll Y ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġd amping : ĠFloat ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġm D amping ĊĠĠĠĠĠĠĠ Ġset ( d amping ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m D amping Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm D amping Ġ= Ġd amping ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġbo unce Delay : ĠLong ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġm Bo unce Delay ĊĠĠĠĠĠĠĠ Ġset ( bounce Delay ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bounce Delay Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bo unce Delay Ġ= Ġbo unce Delay ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Bo unce Interpolator ( interpol ator : ĠInterpol ator ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Interpolator Ġ= Ġinterpol ator ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġtrigger Over Scroll Threshold : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġm Trigger Over Scroll Threshold ĊĠĠĠĠĠĠĠ Ġset ( threshold ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( threshold Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Trigger Over Scroll Threshold Ġ= Ġthreshold ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset On Scroll Listener ( scroll Listener : ĠOn Scroll Listener ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Scroll Listener Ġ= Ġscroll Listener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset On Over Scroll Listener ( over Scroll Listener : ĠOn Over Scroll Listener ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Over Scroll Listener Ġ= Ġover Scroll Listener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ////////////////////////////////////////////////////////////////// //////////////////////// ////// ĊĠĠĠ Ġprivate Ġclass ĠDefault Qu art Out Interpolator Ġ: ĠInterpol ator Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Interpolation ( input : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( 1 . 0 f Ġ- ĠMath . pow ( 1 Ġ- Ġinput . toDouble (), Ġ 4 . 0 )). toFloat () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ////////////////////////////////////////////////////////////////// //////////////////////// ////// ĊĠĠĠ Ġinterface ĠOn Scroll Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Scrolling ( scroll X : ĠInt , Ġscroll Y : ĠInt ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ////////////////////////////////////////////////////////////////// //////////////////////// ////// ĊĠĠĠ Ġinterface ĠOn Over Scroll Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġfrom Start ĠL TR , Ġthe Ġleft Ġis Ġstart ; ĠRTL , Ġthe Ġright Ġis Ġstart . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġon Over Scrolling ( from Start : ĠBoolean , Ġover Sc rolled Distance : ĠInt ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ DA MP ING _ CO EFF IC IENT Ġ= Ġ 4 . 0 f ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ SCROLL _ THRESHOLD Ġ= Ġ 2 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ BOUN CE _ DELAY : ĠLong Ġ= Ġ 4 0 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġover Scroll Mode Ġ= ĠView . OVER _ SCROLL _ NE VER ĊĠĠĠĠĠĠĠ Ġis Vertical ScrollBar Enabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġis Horizontal ScrollBar Enabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġis Fill Viewport Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . obtain Styled Attributes ( attrs , ĠR . style able . Bo unce ScrollView , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġm D amping Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa . get Float ( R . style able . Bo unce ScrollView _ d amping , ĠDEFAULT _ DA MP ING _ CO EFF IC IENT ) ĊĠĠĠĠĠĠĠ Ġval Ġorientation Ġ= Ġa . getInt ( R . style able . Bo unce ScrollView _ scroll Orientation , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġis Scroll H orizontally Ġ= Ġorientation Ġ== Ġ 1 ĊĠĠĠĠĠĠĠ Ġis Incremental D amping Ġ= Ġa . getBoolean ( R . style able . Bo unce ScrollView _ incremental D amping , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġm Bo unce Delay Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa . getInt ( R . style able . Bo unce ScrollView _ bounce Delay , ĠDEFAULT _ BOUN CE _ DELAY . toInt ()). to Long () ĊĠĠĠĠĠĠĠ Ġm Trigger Over Scroll Threshold Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa . getInt ( R . style able . Bo unce ScrollView _ trigger Over Scroll Threshold , ĠDEFAULT _ SCROLL _ THRESHOLD ) ĊĠĠĠĠĠĠĠ Ġa . recycle () ĊĠĠĠĠĠĠĠ Ġif Ġ( is Incremental D amping ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Interpolator Ġ= ĠDefault Qu art Out Interpolator () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }