package Ġtop . xj un z . autom ator . main Ċ Ċ import Ġandroid . animation . Argb Evaluator Ċ import Ġandroid . animation . Value Animator Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . res . Color State List Ċ import Ġandroid . graphics . drawable . Inset Drawable Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . core . content . Context Compat . getColor State List Ċ import Ġandroidx . core . view . One Shot Pre Draw Listener Ċ import Ġandroidx . core . view . Window Insets Compat Ċ import Ġandroidx . core . view . update LayoutParams Ċ import Ġandroidx . core . widget . Nested ScrollView Ċ import Ġandroidx . interpol ator . view . animation . Fast Out Slow In Interpolator Ċ import Ġcom . google . android . material . shape . Material Shape Drawable Ċ import Ġtop . xj un z . autom ator . R Ċ import Ġtop . xj un z . autom ator . util . dp 2 px Ċ import Ġtop . xj un z . autom ator . util . getAttribute Color Ċ import Ġtop . xj un z . autom ator . util . getAttribute Color State List Ċ Ċ /** Ċ Ġ* ĠControl Ġthe Ġtop Ġbar 's Ġinteraction Ġwith Ġthe Ġscroll Ġview Ċ Ġ* Ċ Ġ* Ġ@ author Ġx jun z Ġ 2 0 2 1 / 6 / 2 6 Ċ Ġ*/ Ċ class ĠTop Bar Controller ( private Ġval Ġtop Bar : ĠView , Ġprivate Ġval Ġscroll View : ĠNested ScrollView ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠContext Ġ= Ġtop Bar . context ĊĠĠĠ Ġprivate Ġval Ġcorner Size Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . resources . get Dimension ( R . dim en . corner _ item ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval ĠstrokeWidth Pixel Ġ= Ġdp 2 px ( 1 ) ĊĠĠĠ Ġprivate Ġval Ġz Pixel Ġ= Ġdp 2 px ( 3 ) ĊĠĠĠ Ġprivate Ġval Ġmargin Ġ= Ġdp 2 px ( 8 ) ĊĠĠĠ Ġprivate Ġval Ġtop Bar BackColor Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġget Attribute Color State List ( context , Ġandroid . R . attr . color Background ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġmaterial Back Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMaterial Shape Drawable (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Corner Size ( corner Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstroke Color Ġ= Ġget Color State List ( context , ĠR . color . material _ on _ surface _ stroke ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstrokeWidth Ġ= ĠstrokeWidth Pixel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfill Color Ġ= Ġtop Bar BackColor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequires Compat Shadow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Shadow Color ( 0 xA 0 A 0 A 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshadow Compatibility Mode Ġ= ĠMaterial Shape Drawable . SH ADOW _ COMPAT _ MODE _ ALWAYS ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġinset Back Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠIn set Drawable ( material Back , Ġ 0 , Ġ 0 , Ġ 0 , Ġz Pixel . toInt ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġtoolbar Tint Color Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġget Attribute Color ( context , ĠR . attr . color Top Bar Tint ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġanim ator Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠValue Animator (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Update Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf Ġ= Ġit . animated Value Ġas ĠFloat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaterial Back . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Corner Size ( corner Size Ġ* Ġf ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstrokeWidth Ġ= ĠstrokeWidth Pixel Ġ* Ġf ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelevation Ġ= Ġz Pixel Ġ* Ġ( 1 Ġ- Ġf ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfill Color Ġ= ĠColor State List . valueOf ( evaluator . evaluate (( 1 Ġ- Ġf ), Ġtop Bar BackColor . default Color , Ġtoolbar Tint Color ) Ġas ĠInt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Bar . update LayoutParams < ViewGroup . Margin LayoutParams > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmargin Start Ġ= Ġ( f Ġ* Ġmargin ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmargin End Ġ= Ġ( f Ġ* Ġmargin ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 1 6 8 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterpol ator Ġ= ĠFast Out Slow In Interpolator () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġlast Scroll Y Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġevaluator Ġ= ĠArg b Evaluator () ĊĊĠĠĠ Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġtop Bar . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbring To Front () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Ġ= Ġinset Back ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Apply Window Insets Listener Ġ{ Ġ_, Ġin sets Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsys Insets Ġ= ĠWindow Insets Compat . to Window Insets Compat ( in sets ). get Insets ( Window Insets Compat . Type . system Bars ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOne Shot Pre Draw Listener . add ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscroll View . set Padding ( 0 , Ġheight , Ġ 0 , Ġ( sys Insets . bottom Ġ+ Ġmargin ). toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Padding ( 0 , Ġsys Insets . top , Ġ 0 , Ġz Pixel . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOn Apply Window Insets Listener Ġin sets ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġscroll View . setOn Scroll ChangeListener ( Nested ScrollView . On Scroll ChangeListener Ġ{ Ġ_, Ġ_, Ġscroll Y , Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Scroll Y Ġ< Ġmargin Ġ&& Ġscroll Y Ġ>= Ġmargin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelev ate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( last Scroll Y Ġ> Ġmargin Ġ&& Ġscroll Y Ġ<= Ġmargin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflatten () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Scroll Y Ġ= Ġscroll Y ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġensure Animator Continu ity (): ĠFloat ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( anim ator . isRunning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġanim ator . animated Value Ġas ĠFloat ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġelev ate () Ġ= Ġanim ator . apply Ġ{ ĊĠĠĠĠĠĠĠ Ġset Float Values ( ensure Animator Continu ity () Ġ?: Ġ 1 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġflatten () Ġ= Ġanim ator . apply Ġ{ ĊĠĠĠĠĠĠĠ Ġset Float Values ( ensure Animator Continu ity () Ġ?: Ġ 0 f , Ġ 1 f ) ĊĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠ Ġ} Ċ }