package Ġg orden . refresh Ċ Ċ import Ġandroid . animation . Value Animator Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . support . v 4 . view . Gesture Detector Compat Ċ import Ġandroid . support . v 4 . view . Nested Scrolling Parent Ċ import Ġandroid . support . v 4 . view . View Compat Ċ import Ġandroid . support . v 4 . widget . Nested ScrollView Ċ import Ġandroid . support . v 7 . widget . RecyclerView Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Log Ċ import Ġandroid . view .* Ċ import Ġandroid . view . ViewGroup . LayoutParams . MATCH _ PARENT Ċ import Ġandroid . view . ViewGroup . LayoutParams . WRAP _ CONTENT Ċ import Ġandroid . widget . Abs ListView Ċ import Ġandroid . widget . Over Scroller Ċ import Ġandroid . widget . ScrollView Ċ Ċ @ Suppress (" unused ", Ġ" Private PropertyName ", Ġ" Member Visibility Can Private ") Ċ /** Ċ Ġ* ĠUniversal Ġpull Ġdown Ġthe Ġrefresh Ġframe Ċ Ġ* Ġversion Ġ 1 . 3 1 Ċ Ġ*/ Ċ class ĠK Refresh Layout ( context : ĠContext , Ġattrs : ĠAttributeSet ?, Ġdef Style Attr : ĠInt ) Ġ: ĠViewGroup ( context , Ġattrs , Ġdef Style Attr ), ĠNested Scrolling Parent Ġ{ ĊĠĠĠ Ġprivate Ġval ĠLOG _ TAG Ġ= Ġ" LOG _ K Refresh Layout " ĊĊĠĠĠ Ġprivate Ġval ĠMAX _ OFFSET Ġ= Ġ 3 0 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// åįķ æ¬¡ æľĢå¤§ åģı ç§» éĩı ĊĊĠĠĠ Ġprivate Ġvar Ġm Header : ĠK Refresh Header ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm ContentView : ĠView ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Header View : ĠView ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġm Scroller Ġby Ġlazy Ġ{ ĠOver Scroller ( context ) Ġ} ĊĠĠĠ Ġprivate Ġval Ġm Offset Animator Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠValue Animator (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Update Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġanimated Value Ġas ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove View ( value Ġ- ĠmCurrent Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġm Gesture : ĠGest ure Detector Compat Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠGest ure Detector Compat ( context , ĠRefresh Gesture Listener ()). apply Ġ{ ĠsetIs Long press Enabled ( false ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġm Last Fl ing Y : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar ĠmCurrent Offset : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm Initial Down Y : ĠFloat Ġ= Ġ 0 f ĊĊĠĠĠ Ġ/* çĬ¶æĢģ åıĤæķ° âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ */ ĊĠĠĠ Ġprivate Ġvar Ġm Is Reset Ġ= Ġtrue ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// åĪ·æĸ° å®ĮæĪĲ åĲİ æĺ¯åĲ¦ éĩį ç½® ĊĠĠĠ Ġprivate Ġvar Ġm Is Fl ing Ġ= Ġfalse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// æĺ¯åĲ¦ å¤Ħ äºİ Fl ing çĬ¶æĢģ ĊĠĠĠ Ġprivate Ġvar Ġm Refresh ing Ġ= Ġfalse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// æĺ¯åĲ¦ æŃ£åľ¨ åĪ·æĸ° ä¸Ń ĊĠĠĠ Ġprivate Ġvar Ġm Is Being Drag ged Ġ= Ġfalse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// æĺ¯åĲ¦ å¼Ģå§ĭ æĭ ĸ åĬ¨ ĊĠĠĠ Ġprivate Ġvar Ġm Gesture Execute Ġ= Ġfalse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Gesture äºĭä»¶ æĺ¯åĲ¦ åĵįåºĶ ĊĠĠĠ Ġprivate Ġvar Ġm Nested Scroll Execute Ġ= Ġfalse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Nested Scroll äºĭä»¶ æĺ¯åĲ¦ åĵįåºĶ ĊĠĠĠ Ġprivate Ġvar Ġm Nested Scroll InProgress Ġ= Ġfalse ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Nested Scroll æĺ¯åĲ¦ åı¯ä»¥ æī§è¡Į ï¼Į éģĩ åĪ° éĥ¨åĪĨ æīĭæľº ä¸įä¼ļ èµ° Nested Scroll æµģç¨ĭ ĊĠĠĠ Ġ/* çĬ¶æĢģ åıĤæķ° âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ */ ĊĊĠĠĠ Ġ/* åı¯ éħįç½® åıĤæķ° âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ âĨ ĵ */ ĊĠĠĠ Ġvar Ġdefault Refresh Height : ĠInt Ġ= Ġ 0 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// é»ĺè®¤ åĪ·æĸ° ä¸ª é«ĺåº¦ , header ä¸ºç©º æĹ¶ ä½¿çĶ¨ ĊĠĠĠ Ġvar Ġdefault Max Offset : ĠInt Ġ= Ġ 0 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// é»ĺè®¤ æľĢå¤§ ä¸ĭ æĭī é«ĺåº¦ ï¼Į header ä¸ºç©º æĹ¶ ä½¿çĶ¨ ĊĠĠĠ Ġvar Ġduration Offset : ĠLong Ġ= Ġ 2 0 0 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ä½į ç§»åĬ¨ çĶ» æĮģ ç»Ń æĹ¶éĹ´ ĊĠĠĠ Ġvar Ġkeep Header When Refresh : ĠBoolean Ġ= Ġtrue ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// åĪ·æĸ° æĹ¶ Header èĩªåĬ¨ ç§»åĬ¨ åĪ° åĪ·æĸ° é«ĺåº¦ , false åĽŀ åĪ° åĪĿå§ĭ ä½įç½® ĊĠĠĠ Ġvar Ġpin Content : ĠBoolean Ġ= Ġfalse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ä¸ĭ æĭī åĪ·æĸ° è¿ĩç¨ĭ æĺ¯åĲ¦ è®© ContentView ä¸į åıĳçĶŁ ä½įç½® ç§»åĬ¨ ĊĠĠĠ Ġvar Ġrefresh Enable : ĠBoolean Ġ= Ġtrue ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// æĺ¯åĲ¦ åħģè®¸ ä¸ĭ æĭī åĪ·æĸ° ĊĠĠĠ Ġvar Ġtouch S lop : ĠInt Ġ= Ġ 0 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// è§¦åıĳ ç§»åĬ¨ äºĭä»¶ çļĦ æľĢ çŁŃ è·Ŀç¦» ĊĠĠĠ Ġvar Ġfl ing S lop : ĠInt Ġ= Ġ 1 0 0 0 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// è§¦åıĳ Fl ing äºĭä»¶ çļĦ æľĢ ä½İ éĢŁåº¦ ĊĠĠĠ Ġvar Ġheader Offset : ĠInt Ġ= Ġ 0 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Header Ġ èĩª èº« æ¶Ī èĢĹ Offset , åı¯ å¤ĦçĲĨ ä¸ĢäºĽ çī¹æ®Ĭ æķĪæŀľ ĊĠĠĠ Ġ/* åı¯ éħįç½® åıĤæķ° âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ âĨ ĳ */ ĊĊĠĠĠ Ġprivate Ġvar Ġm Refresh Listener : Ġ(( K Refresh Layout ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Scroll Listener : Ġ(( offset : ĠInt , Ġdistance : ĠInt , Ġpercent : ĠFloat , Ġrefresh ing : ĠBoolean ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġthis ( context , Ġnull ) ĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ?) Ġ: Ġthis ( context , Ġattrs , Ġ 0 ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġtouch S lop Ġ= ĠView Configuration . get ( context ). scaled Touch S lop Ġ* Ġ 2 ĊĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġcontext . obtain Styled Attributes ( attrs , ĠR . style able . K Refresh Layout ) ĊĠĠĠĠĠĠĠ Ġpin Content Ġ= Ġa . getBoolean ( R . style able . K Refresh Layout _ k _ pin _ content , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġkeep Header When Refresh Ġ= Ġa . getBoolean ( R . style able . K Refresh Layout _ k _ keep _ header , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġrefresh Enable Ġ= Ġa . getBoolean ( R . style able . K Refresh Layout _ k _ refresh _ enable , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġduration Offset Ġ= Ġa . getInt ( R . style able . K Refresh Layout _ k _ duration _ offset , Ġ 2 0 0 ). to Long () ĊĠĠĠĠĠĠĠ Ġdefault Refresh Height Ġ= Ġa . get Layout Dimension ( R . style able . K Refresh Layout _ k _ def _ refresh _ height , ĠInt . MAX _ VALUE ) ĊĠĠĠĠĠĠĠ Ġdefault Max Offset Ġ= Ġa . get Layout Dimension ( R . style able . K Refresh Layout _ k _ def _ max _ offset , Ġdefault Max Offset ) ĊĠĠĠĠĠĠĠ Ġa . recycle () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Finish Inf late () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Finish Inf late () ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild Count Ġ> Ġ 2 Ġ-> Ġthrow ĠIllegalStateException (" K Refresh Layout 1 1 1 Ġcan Ġonly Ġac commod ate Ġtwo Ġelements ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild Count Ġ== Ġ 1 Ġ-> Ġm ContentView Ġ= Ġget Child At ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild Count Ġ== Ġ 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm ContentView Ġ= Ġget Child At ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Header Ġ= Ġget Child At ( 0 ) Ġas ? ĠK Refresh Header Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Header View Ġ= Ġget Child At ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Header View ?. br ing To Front () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate Default LayoutParams (): ĠLayout Params Ġ= ĠLayout Params ( MATCH _ PARENT , ĠMATCH _ PARENT ) ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate LayoutParams ( attrs : ĠAttributeSet ): ĠLayout Params Ġ= ĠLayout Params ( context , Ġattrs ) ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate LayoutParams ( p : ĠViewGroup . LayoutParams ): ĠLayout Params Ġ= ĠLayout Params ( p ) ĊĊĠĠĠ Ġ@ Suppress (" unused ") ĊĠĠĠ Ġclass ĠLayout Params Ġ: ĠViewGroup . Margin LayoutParams Ġ{ ĊĠĠĠĠĠĠĠ Ġconstructor ( c : ĠContext , Ġattrs : ĠAttributeSet ) Ġ: Ġsuper ( c , Ġattrs ) ĊĊĠĠĠĠĠĠĠ Ġconstructor ( width : ĠInt , Ġheight : ĠInt ) Ġ: Ġsuper ( width , Ġheight ) ĊĊĠĠĠĠĠĠĠ Ġconstructor ( source : ĠViewGroup . Margin LayoutParams ) Ġ: Ġsuper ( source ) ĊĊĠĠĠĠĠĠĠ Ġconstructor ( source : ĠViewGroup . LayoutParams ) Ġ: Ġsuper ( source ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Layout ( changed : ĠBoolean , Ġl : ĠInt , Ġt : ĠInt , Ġr : ĠInt , Ġb : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġm Header View ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlp Ġ= Ġit . layout Params Ġas ĠLayout Params ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Left Ġ= Ġpadding Left Ġ+ Ġlp . left Margin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Top Ġ= Ġpadding Top Ġ+ Ġlp . top Margin Ġ- Ġit . meas ured Height Ġ+ ĠmCurrent Offset Ġ+ Ġheader Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Right Ġ= Ġchild Left Ġ+ Ġit . meas ured Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Bottom Ġ= Ġchild Top Ġ+ Ġit . meas ured Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . layout ( child Left , Ġchild Top , Ġchild Right , Ġchild Bottom ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm ContentView ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlp Ġ= Ġit . layout Params Ġas ĠLayout Params ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Left Ġ= Ġpadding Left Ġ+ Ġlp . left Margin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Top Ġ= Ġpadding Top Ġ+ Ġlp . top Margin Ġ+ Ġif Ġ( pin Content ) Ġ 0 Ġelse ĠmCurrent Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Right Ġ= Ġchild Left Ġ+ Ġit . meas ured Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Bottom Ġ= Ġchild Top Ġ+ Ġit . meas ured Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . layout ( child Left , Ġchild Top , Ġchild Right , Ġchild Bottom ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Measure ( width Measure Spec , Ġheight Measure Spec ) ĊĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġchild Count ). map Ġ{ Ġget Child At ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġmeasure Child With Margins ( it , Ġwidth Measure Spec , Ġ 0 , Ġheight Measure Spec , Ġ 0 ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispatch Touch Event ( ev : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( ev . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Animator () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Fl ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Last Fl ing Y Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ CANCEL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! m Nested Scroll Execute Ġ&& Ġ! m Gesture Execute ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Spinner () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . dispatch Touch Event ( ev ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Intercept Touch Event ( ev : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! isEnabled Ġ|| Ġ! refresh Enable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( m Nested Scroll InProgress Ġ|| Ġcan Child Scroll Up ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( m Refresh ing Ġ&& Ġpin Content Ġ&& Ġkeep Header When Refresh ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( ev . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Being Drag ged Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Initial Down Y Ġ= Ġev . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Gesture . on Touch Event ( ev ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! m Is Being Drag ged Ġ&& Ġev . y Ġ- Ġm Initial Down Y Ġ> Ġtouch S lop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Being Drag ged Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Current Offset Ġ> Ġ 0 Ġ&& Ġ! m Is Being Drag ged ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Being Drag ged Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ CANCEL Ġ-> Ġm Is Being Drag ged Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġm Is Being Drag ged ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġrequest Dis allow Intercept Touch Event ( dis allow Intercept : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(( android . os . Build . VERSION . SDK _ INT Ġ< Ġ 2 1 Ġ&& Ġm ContentView Ġis ĠAbs ListView ) Ġ|| Ġ( m ContentView != null && ! View Compat . is Nested Scrolling Enabled ( m ContentView !! ))) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . request Dis allow Intercept Touch Event ( dis allow Intercept ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Suppress Lint (" Click ableView Accessibility ") ĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! isEnabled Ġ|| Ġm Nested Scroll Execute Ġ|| Ġcan Child Scroll Up ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġm Gesture . on Touch Event ( event ) ĊĠĠĠĠĠĠĠ Ġif Ġ( event . action Ġ== ĠMotion Event . ACTION _ UP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! m Is Fl ing Ġ&& Ġm Gesture Execute ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Spinner () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Gesture Execute Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æīĭ åĬ¿ å¤ĦçĲĨ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġinner Ġclass ĠRefresh Gesture Listener Ġ: ĠGest ure Detector . Simple On Gesture Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scroll ( e 1 : ĠMotion Event , Ġe 2 : ĠMotion Event , Ġdistance X : ĠFloat , Ġdistance Y : ĠFloat ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Gesture Execute Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Offset Ġ= Ġm Header ?. max Offset Height () Ġ?: Ġif Ġ( default Max Offset Ġ== Ġ- 1 ) Ġheight Ġelse Ġdefault Max Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( m Current Offset Ġ== Ġ 0 Ġ&& Ġdistance Y Ġ> Ġ 0 ) Ġ|| Ġ( m Current Offset Ġ== Ġmax Offset Ġ&& Ġdistance Y Ġ< Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Scroll ( e 1 , Ġe 2 , Ġdistance X , Ġdistance Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoffset Ġ= Ġ- calculate Offset ( distance Y . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Current Offset Ġ+ Ġoffset Ġ> Ġmax Offset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġmax Offset Ġ- ĠmCurrent Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( m Current Offset Ġ+ Ġoffset Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġ- m Current Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove View ( offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Scroll ( e 1 , Ġe 2 , Ġdistance X , Ġdistance Y ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Fl ing ( e 1 : ĠMotion Event ?, Ġe 2 : ĠMotion Event ?, Ġvelocity X : ĠFloat , Ġvelocity Y : ĠFloat ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Gesture Execute Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrefresh Height Ġ= Ġm Header ?. refresh Height () Ġ?: Ġdefault Refresh Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( velocity Y Ġ> Ġ 0 Ġ&& Ġ(! m Refresh ing Ġ|| Ġ! keep Header When Refresh Ġ|| ĠmCurrent Offset Ġ>= Ġrefresh Height )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Fl ing ( e 1 , Ġe 2 , Ġvelocity X , Ġvelocity Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Math . abs ( velocity Y ) Ġ> Ġfl ing S lop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Fl ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Scroller . fl ing ( 0 , Ġ 0 , Ġvelocity X . toInt (), Ġ- velocity Y . toInt (), ĠInteger . MIN _ VALUE , ĠInteger . MAX _ VALUE , ĠInteger . MIN _ VALUE , ĠInteger . MAX _ VALUE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Fl ing ( e 1 , Ġe 2 , Ġvelocity X , Ġvelocity Y ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcan Child Scroll Up (): ĠBoolean Ġ= Ġm ContentView ?. can Scroll Vert ically ( Ġ- 1 ) ?: false ĊĊĠĠĠ Ġoverride Ġfun ĠonStart Nested Scroll ( child : ĠView , Ġtarget : ĠView , Ġnested Scroll Axes : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġis Enabled Ġ&& Ġrefresh Enable Ġ&& Ġ!( m Refresh ing Ġ&& Ġpin Content Ġ&& Ġkeep Header When Refresh ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġnested Scroll Axes Ġand ĠView Compat . SCROLL _ AXIS _ VERTICAL Ġ!= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Nested Scroll Accepted ( child : ĠView , Ġtarget : ĠView , Ġaxes : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Nested Scroll Execute Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġm Nested Scroll InProgress Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Nested Pre Scroll ( target : ĠView , Ġdx : ĠInt , Ġdy : ĠInt , Ġconsumed : ĠInt Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Nested Scroll Execute Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( m Current Offset Ġ> Ġ 0 Ġ&& Ġdy Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġif Ġ( dy Ġ> ĠmCurrent Offset ) ĠmCurrent Offset Ġelse Ġdy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconsumed [ 1 ] Ġ= Ġif Ġ( dy Ġ> ĠmCurrent Offset ) Ġdy Ġ- ĠmCurrent Offset Ġelse Ġdy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove View (- offset ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Nested Scroll ( target : ĠView , Ġdx Cons umed : ĠInt , Ġdy Cons umed : ĠInt , Ġdx Un consumed : ĠInt , Ġdy Un consumed : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġm Un consumed : ĠInt Ġ= Ġdy Un consumed ĊĠĠĠĠĠĠĠ Ġval Ġmax Offset Ġ= Ġm Header ?. max Offset Height () Ġ?: Ġif Ġ( default Max Offset Ġ== Ġ- 1 ) Ġheight Ġelse Ġdefault Max Offset ĊĠĠĠĠĠĠĠ Ġif Ġ( dy Un consumed Ġ< Ġ 0 Ġ&& Ġ! can Child Scroll Up () Ġ&& ĠmCurrent Offset Ġ< Ġmax Offset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Current Offset Ġ- Ġdy Un consumed Ġ> Ġmax Offset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Un consumed Ġ= ĠmCurrent Offset Ġ- Ġmax Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġ- calculate Offset ( m Un consumed ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove View ( offset ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Nested Pre Fl ing ( target : ĠView , Ġvelocity X : ĠFloat , Ġvelocity Y : ĠFloat ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġm Nested Scroll Execute Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ// å¦Ĥæŀľ å½ĵåīį åģı ç§» éĩı å¤§äºİ 0 ï¼Į åĪĻ äº¤ ç»Ļ K refresh Layout å¤ĦçĲĨ Fl ing äºĭä»¶ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Current Offset Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrefresh Height Ġ= Ġm Header ?. refresh Height () Ġ?: Ġdefault Refresh Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( velocity Y Ġ< Ġ 0 Ġ&& Ġ(! m Refresh ing Ġ|| Ġ! keep Header When Refresh Ġ|| ĠmCurrent Offset Ġ>= Ġrefresh Height )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Math . abs ( velocity Y ) Ġ> Ġfl ing S lop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Fl ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Scroller . fl ing ( 0 , Ġ 0 , Ġvelocity X . toInt (), Ġvelocity Y . toInt (), ĠInteger . MIN _ VALUE , ĠInteger . MAX _ VALUE , ĠInteger . MIN _ VALUE , ĠInteger . MAX _ VALUE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Nested Fl ing ( target : ĠView , Ġvelocity X : ĠFloat , Ġvelocity Y : ĠFloat , Ġconsumed : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// å¦Ĥæŀľ åĲĳ ä¸Ĭ æ»ļ åĬ¨ ï¼Į ä¸Ķ å¤Ħ äºİ åĪ·æĸ° è¿ĩç¨ĭä¸Ń ï¼Į çĽĳåĲ¬ Fl ing è¿ĩç¨ĭ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Refresh ing Ġ&& Ġvelocity Y Ġ< Ġ- fl ing S lop Ġ&& Ġkeep Header When Refresh ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Fl ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Scroller . fl ing ( 0 , Ġ 0 , Ġvelocity X . toInt (), Ġvelocity Y . toInt (), ĠInteger . MIN _ VALUE , ĠInteger . MAX _ VALUE , ĠInteger . MIN _ VALUE , ĠInteger . MAX _ VALUE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop Nested Scroll ( child : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! m Is Fl ing Ġ&& Ġm Nested Scroll Execute ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Spinner () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Nested Scroll Execute Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġm Nested Scroll InProgress Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcompute Scroll () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Scroller . compute Scroll Offset () Ġ&& Ġm Is Fl ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// æľ¬ æ¬¡ Fl ing ç§»åĬ¨ è·Ŀç¦» (< 0 åĲĳ ä¸ĭ æ»ļ åĬ¨ ãĢģ > 0 åĲĳ ä¸Ĭ æ»ļ åĬ¨ ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoffset Ġ= Ġm Last Fl ing Y Ġ- Ġm Scroller . curr Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrefresh Height Ġ= Ġm Header ?. refresh Height () Ġ?: Ġdefault Refresh Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Offset Ġ= Ġm Header ?. max Offset Height () Ġ?: Ġif Ġ( default Max Offset Ġ== Ġ- 1 ) Ġheight Ġelse Ġdefault Max Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Fl ing Max Height Ġ= Ġif Ġ( offset Ġ> Ġ 0 ) Ġrefresh Height Ġelse Ġmax Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// è®°å½ķ ä¸Ĭ æ¬¡ Fl ing çļĦ Y åĢ¼ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Last Fl ing Y Ġ= Ġm Scroller . curr Y ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Current Offset Ġ> Ġ 0 Ġ|| Ġoffset Ġ> Ġ 0 Ġ&& Ġ! can Child Scroll Up ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġif Ġ( m Current Offset Ġ+ Ġoffset Ġ> Ġm Fl ing Max Height ) Ġm Fl ing Max Height Ġ- ĠmCurrent Offset Ġelse Ġif Ġ( m Current Offset Ġ+ Ġoffset Ġ< Ġ 0 ) Ġ- m Current Offset Ġelse Ġoffset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove View ( offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Current Offset Ġ>= Ġm Fl ing Max Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Scroller . force Finished ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( offset Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( m ContentView Ġas ? ĠRecyclerView )?. fl ing ( 0 , Ġm Scroller . curr Velocity . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( m ContentView Ġas ? ĠNested ScrollView )?. fl ing ( m Scroller . curr Velocity . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( m ContentView Ġas ? ĠScroll View )?. fl ing ( m Scroller . curr Velocity . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Scroller . force Finished ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( m Is Fl ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" m Scroll Ġfl ing Ġcomplete ĠmCurrent Offset Ġis Ġ" Ġ+ ĠmCurrent Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Fl ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Spinner () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è®¡ç®Ĺ å®ŀéĻħ åģı ç§» éĩı ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcalculate Offset ( offset : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmax Offset Ġ= Ġm Header ?. max Offset Height () Ġ?: Ġif Ġ( default Max Offset Ġ== Ġ- 1 ) Ġheight Ġelse Ġdefault Max Offset ĊĠĠĠĠĠĠĠ Ġval Ġm Offset : ĠInt ĊĠĠĠĠĠĠĠ Ġval Ġdown Res istance : ĠFloat ĊĠĠĠĠĠĠĠ Ġdown Res istance Ġ= Ġif Ġ( offset Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 8 f ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ä¸ĭ æĭī éĺ» åĬĽ ( 0 f - 1 f ) Ġ è¶Ĭ å°ı éĺ» åĬĽ è¶Ĭ å¤§ ï¼Į å½ĵåīį è®¡ç®Ĺ åħ¬ å¼ı : 1 - m Current Offset / max height ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 f Ġ- ĠmCurrent Offset . toFloat () Ġ/ Ġmax Offset ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Offset Ġ= Ġif Ġ( offset Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMath . min ( MAX _ OFFSET , ĠMath . ceil (( down Res istance Ġ* Ġoffset ). toDouble ()). toInt ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMath . max (- MAX _ OFFSET , ĠMath . floor (( down Res istance Ġ* Ġoffset ). toDouble ()). toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġm Offset ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ç§»åĬ¨ è§ĨåĽ¾ ĊĠĠĠĠ Ġ* Ġ@ param Ġoffset Ġ åģı ç§» éĩı ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġmove View ( offset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġinvalidate Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġrefresh Height Ġ= Ġm Header ?. refresh Height () Ġ?: Ġdefault Refresh Height ĊĠĠĠĠĠĠĠ Ġif Ġ(! m Refresh ing Ġ&& ĠmCurrent Offset Ġ== Ġ 0 Ġ&& Ġoffset Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Header ?. on Prepare ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( m Current Offset Ġ> Ġheight Ġ|| ĠmCurrent Offset Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠmCurrent Offset Ġ+= Ġoffset ĊĠĠĠĠĠĠĠ Ġm Header View ?. offset Top And Bottom ( offset ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! pin Content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm ContentView ?. offset Top And Bottom ( offset ) ĊĠĠĠĠĠĠĠ Ġif Ġ( invalidate ) Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġm Header ?. on Scroll ( this , ĠmCurrent Offset , ĠmCurrent Offset . toFloat () Ġ/ Ġrefresh Height , Ġm Refresh ing ) ĊĠĠĠĠĠĠĠ Ġm Scroll Listener ?. invoke ( offset , ĠmCurrent Offset , ĠmCurrent Offset . toFloat () Ġ/ Ġrefresh Height , Ġm Refresh ing ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! m Refresh ing Ġ&& Ġoffset Ġ< Ġ 0 Ġ&& ĠmCurrent Offset Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Header ?. on Reset ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Reset Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åıĸæ¶Ī offset åĬ¨çĶ» ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcancel Animator () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Offset Animator . isRunning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Offset Animator . cancel () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ç»ĵæĿŁ ä¸ĭ æĭī ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfinish Spinner () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Current Offset Ġ<= Ġ 0 ) Ġreturn ĊĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" finish Spinner ĠmCurrent Offset Ġis Ġ$ m Current Offset Ġ, Ġm Refresh ing Ġis Ġ$ m Refresh ing ") ĊĠĠĠĠĠĠĠ Ġval Ġtarget : ĠInt ĊĠĠĠĠĠĠĠ Ġval Ġrefresh Height Ġ= Ġm Header ?. refresh Height () Ġ?: Ġdefault Refresh Height ĊĠĠĠĠĠĠĠ Ġif Ġ( m Refresh ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Ġ= Ġif Ġ( m Current Offset Ġ>= Ġrefresh Height Ġ/ Ġ 2 ) Ġrefresh Height Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Ġ= Ġif Ġ( m Current Offset Ġ>= Ġrefresh Height Ġ&& Ġm Is Reset ) Ġrefresh Height Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Current Offset Ġ>= Ġrefresh Height Ġ&& Ġm Is Reset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Refresh ing Ġ= Ġtrue // å¼Ģå§ĭ åĪ·æĸ° ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Reset Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Header ?. on Refresh ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Refresh Listener ?. invoke ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġanim To ( target ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åĬ¨çĶ» æĸ¹å¼ı ç§»åĬ¨ ĊĊĠĠĠĠ Ġ* Ġ@ param Ġtarget Ġ çĽ®æłĩ ä½įç½® ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġanim To ( target : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcancel Animator () ĊĊĠĠĠĠĠĠĠ Ġval Ġm Target : ĠInt Ġ= Ġif Ġ( keep Header When Refresh ) Ġtarget Ġelse Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( m Current Offset Ġ== Ġm Target ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" anim To Ġ$ m Current Offset Ġto Ġ$ m Target ") ĊĠĠĠĠĠĠĠ Ġm Offset Animator . duration Ġ= Ġduration Offset ĊĠĠĠĠĠĠĠ Ġm Offset Animator . setInt Values ( m Current Offset , Ġm Target ) ĊĠĠĠĠĠĠĠ Ġm Offset Animator . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset K Refresh Listener ( refresh Listener : Ġ( refresh Layout : ĠK Refresh Layout ) Ġ-> ĠUnit ){ ĊĠĠĠĠĠĠĠ Ġm Refresh Listener Ġ= Ġrefresh Listener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġoffset ( æľ¬ æ¬¡ çļĦ åģı ç§» éĩı ) ĊĠĠĠĠ Ġ* Ġdistance ( æĢ» çļĦ åģı ç§» éĩı ) ĊĠĠĠĠ Ġ* Ġpercent ( åģı ç§» æ¯Ķ çİĩ ) ĊĠĠĠĠ Ġ* Ġrefresh ing ( æĺ¯åĲ¦ åľ¨ åĪ·æĸ° ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset K Scroll Listener ( scroll Listener : Ġ( offset : ĠInt , Ġdistance : ĠInt , Ġpercent : ĠFloat , Ġrefresh ing : ĠBoolean ) Ġ-> ĠUnit ){ ĊĠĠĠĠĠĠĠ Ġm Scroll Listener Ġ= Ġscroll Listener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Header ( header View : ĠK Refresh Header ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Header ( header View , ĠMATCH _ PARENT , ĠWR AP _ CONTENT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Header ( header View : ĠK Refresh Header , Ġwidth : ĠInt , Ġheight : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġgenerate Default LayoutParams () ĊĠĠĠĠĠĠĠ Ġparams . width Ġ= Ġwidth ĊĠĠĠĠĠĠĠ Ġparams . height Ġ= Ġheight ĊĠĠĠĠĠĠĠ Ġset Header ( header View , Ġparams ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Header ( header View : ĠK Refresh Header , Ġparams : ĠLayout Params ) Ġ{ ĊĠĠĠĠĠĠĠ Ġremove Header () ĊĠĠĠĠĠĠĠ Ġm Header Ġ= Ġheader View ĊĠĠĠĠĠĠĠ Ġm Header View Ġ= Ġm Header Ġas ? ĠView ĊĠĠĠĠĠĠĠ Ġadd View ( m Header View , Ġ 0 , Ġparams ) ĊĠĠĠĠĠĠĠ Ġm Header View ?. br ing To Front () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Header (): ĠK Refresh Header ? Ġ= Ġm Header ĊĊĠĠĠ Ġfun Ġremove Header () Ġ{ ĊĠĠĠĠĠĠĠ Ġremove View ( m Header View ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ èĩªåĬ¨ åĪ·æĸ° ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstart Refresh () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! m Refresh ing Ġ&& Ġrefresh Enable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Refresh ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Reset Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Header ?. on Refresh ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Refresh Listener ?. invoke ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm ContentView ?. scrollTo ( 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim To ( m Header ?. refresh Height () Ġ?: Ġdefault Refresh Height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åĪ·æĸ° å®ĮæĪĲ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrefresh Complete ( is Success : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Refresh ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Header ?. onComplete ( this , Ġis Success ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Refresh ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Current Offset Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Reset Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Animator () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Header ?. on Reset ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// åģľ æ» ŀ æĹ¶éĹ´ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġretention Ġ= Ġif Ġ( is Success ) Ġm Header ?. suc ceed Retention () Ġ?: Ġ 0 Ġelse Ġm Header ?. fail ing Retention () Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim To ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġretention ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }