AppBarLayout.Behavior探究
生活随笔
收集整理的這篇文章主要介紹了
AppBarLayout.Behavior探究
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Appbarlayout.Behavior 1.作用 處理嵌套滾動偏移處理 2.分析思路 從程序的執行起始點開始分析 3.層級結構 Appbarlayout --> HeaderBehavior --> ViewOffsetBehavior --> Coordinatorlayout.Behavior 4.嵌套處理 onStartNestedScroll 決定是否嵌套滾動 條件:垂直滾動 Appbarlayout擁有可以滾動的子View CoordinatorLayout的高度-其他的直接子View的高度 小于等于 Appbarlayout的高度 5.Appbarlayout擁有可以滾動的子View(getTotalScrollRange() != 0) 也就是說所有的滾動范圍不能等于0的時候才滿足條件,這里會對Appbarlayout的所有的子View進行一次遍歷,SCROLL_FLAG_SCROLL = 0x1&x != 0,如果子View的scrollFlag擁有標示.并且標示是奇數才會滿足也就是Scroll的標示,計算子View 的全部高度,包含了邊距 其次如果標示等于CROLL_FLAG_EXIT_UNTIL_COLLAPSED rang范圍高度好需要通過ViewCompat.getMinimumHeight(child)(這個方法在Api16會返回0,參考反射)減去其最小高度,最后如果rang-getTopInset()小于0就取0, getTopInset()這里是窗口插入view的時候在api21以上才會出發,如果布局開啟了fitWindow那么getTopInset = 布局有效區域(這里受到輸入法 狀態欄 導航欄等影響)的頂部距離,最終得到的才是有效的滾動范圍 getTotalScrollRange() 這里在布局進行初始化的時候已經對其孩子的高度進行了計算,這里會有一個優化 if (mTotalScrollRange != INVALID_SCROLL_RANGE) {return mTotalScrollRange; } 避免了多次計算的問題,邏輯優化,也就是說后期是直接拿到初始化布局的高度的,如果想重新計算一下高度可以試著通過改變mTotalScrollRange = INVALID_SCROLL_RANGE;進行修改 6.directTargetChild代表的什么 例子中是NestScrollView target View代表觸發的View CoordinatorLayout的子View或者是包含嵌套滾動的View 7.CoordinatorLayout的高度-其他的直接子View的高度 小于等于 Appbarlayout的高度 也就是說CoordinatorLayout的高度-其他的View的總高度如果小于等于AppbarLayout的話就會之星滾動動作 1686-0=1686 1686-168(168的正好是Appbarlayout的底部高度)= <= 168 8.getDownNestedPreScrollRange 分析Appbarlayout的最小可滑動范圍 在第一次觸發了以后就不會在此觸發了,也是為了避免重復計算減少繪制時間,FLAG_QUICK_RETURN = SCROLL_FLAG_SCROLL | SCROLL_FLAG_ENTER_ALWAYS;這里需要兩個標示才能滿足 SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED這個標示表示下拉的范圍事Appbarlayout的子View的最小高度的總和 SCROLL_FLAG_EXIT_UNTIL_COLLAPSED 表示下滑范圍是子View的高度-最小高度的總和 其他的標示 其子View的高度作為滑動的范圍如果開啟了fitWindow那么還需要減去這個高度, 9.onNestedPreScroll 嵌套滾動發生之前調用 內部執行條件:dy 向上為正 向下為負 如果滑動距離不等于0并且mSkipNestedPreScroll=false,如果dy小于0 說明是向下的 否則是向上的 getUpNestedPreScrollRange = getTotalScrollRange 10.interpolateOffset 差值器處理以后的偏移值 這里只會在差值器不為空的時候才會有效果,首先對偏移值取絕對值,然后遍歷Appbarlayout中的所有的子View,拿到子View的差值器,如果說當前偏移的位置在某個view top等于 和 bottom等于 之間的位置,這里分為四種情況 SCROLL_FLAG_SCROLL SCROLL_FLAG_EXIT_UNTIL_COLLAPSED getFitsSystemWindows 每個View的可滾動范圍必須大于0 ,最紅會通過計算已滾動距離相對于view的比例得出差值器以后對應的值 11.scroll 執行滾動效果可以說是用來設置用來更新的參數 setHeaderTopBottomOffset 設置頭部位置偏移,返回當前已經偏移的距離 getTopBottomOffsetForScrollingSibling = getTopAndBottomOffset 獲取當前滾動的距離向上為負, 如果最小偏移不等于0 并且 當前的便宜位置在可滾動區間之間(MathUtils.constrain newOffest如果在區間之內那么就返回當前的offest如果小于那么就返回最小值,如果大于最大值那么就返回最大值) 這里如果設置了差值器newoffest就會發生變化,然后偏移的距離通過setTopAndBottomOffset,如果和上次的偏移相同那么就返回false否則就是true。 mOffsetDelta記錄了原值和差值器值的差值,如果偏移并沒有改變,dispatchDependentViewsChanged遍歷依賴view的集合,調用behavior.onDependentViewChanged用來更新視圖,然后通過dispatchOffsetUpdates分發所有的偏移事件,getAppBarChildOnOffset獲取當前偏移所處的View,updateAppBarLayoutDrawableState更新drawable的狀態。
總結
以上是生活随笔為你收集整理的AppBarLayout.Behavior探究的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 获取用户浏览器类型
- 下一篇: Tensorflow-制作与使用tfre