1. 程式人生 > >詳解:Android巢狀滑動機制 (NestedScrolling)

詳解:Android巢狀滑動機制 (NestedScrolling)

       從 Android 5.0 Lollipop 開始提供一套 API 來支援嵌入的滑動效果。同樣在最新的 Support V4 包中也提供了前向的相容。有了嵌入滑動機制,就能實現很多很複雜的滑動效果。在 Android Design Support 庫中非常總要的 CoordinatorLayout 元件就是使用了這套機制,實現了 Toolbar 的收起和展開功能,如下圖所示:

Android NestedScrolling 例項

       NestedScrolling提供了一套父 View 和子 View 滑動互動機制。要完成這樣的互動,父 View 需要實現 NestedScrollingParent 介面,而子 View 需要實現 NestedScrollingChild 介面。

       實現 NestedScrollingChild

       首先來說NestedScrollingChild。如果你有一個可以滑動的 View,需要被用來作為嵌入滑動的子 View,就必須實現本介面。在此 View 中,包含一個 NestedScrollingChildHelper 輔助類。NestedScrollingChild介面的實現,基本上就是呼叫本 Helper 類的對應的函式即可,因為 Helper 類中已經實現好了 Child 和 Parent 互動的邏輯。原來的 View 的處理 Touch 事件,並實現滑動的邏輯大體上不需要改變。

       需要做的就是,如果要準備開始滑動了,需要告訴 Parent,你要準備進入滑動狀態了,呼叫startNestedScroll()。你在滑動之前,先問一下你的 Parent 是否需要滑動,也就是呼叫dispatchNestedPreScroll()。如果父類滑動了一定距離,你需要重新計算一下父類滑動後剩下給你的滑動距 離餘量。然後,你自己進行餘下的滑動。最後,如果滑動距離還有剩餘,你就再問一下,Parent 是否需要在繼續滑動你剩下的距離,也就是呼叫dispatchNestedScroll()。

       以上是一些基本原理,有了上面的基本思路,可以參考這篇 文章 ,這裡面有原理的詳細解析。如果還是不清楚, 這裡 有對應的程式碼可以參考。

       實現 NestedScrollingParent

       作為一個可以嵌入 NestedScrollingChild 的父 View,需要實現NestedScrollingParent,這個介面方法和NestedScrollingChild大致有一一對應的關係。同樣, 也有一個 NestedScrollingParentHelper 輔助類來默默的幫助你實現和 Child 互動的邏輯。滑動動作是 Child 主動發起,Parent 就收滑動回撥並作出響應。

       從上面的 Child 分析可知,滑動開始的呼叫startNestedScroll(),Parent 收到onStartNestedScroll()回撥,決定是否需要配合 Child 一起進行處理滑動,如果需要配合,還會回撥onNestedScrollAccepted()。

       每次滑動前,Child 先詢問 Parent 是否需要滑動,即dispatchNestedPreScroll(),這就回調到 Parent 的onNestedPreScroll(),Parent 可以在這個回撥中“劫持”掉 Child 的滑動,也就是先於 Child 滑動。

       Child 滑動以後,會呼叫onNestedScroll(),回撥到 Parent 的onNestedScroll(),這裡就是 Child 滑動後,剩下的給 Parent 處理,也就是 後於 Child 滑動。

       最後,滑動結束,呼叫onStopNestedScroll()表示本次處理結束。

       其實,除了上面的 Scroll 相關的呼叫和回撥,還有 Fling 相關的呼叫和回撥,處理邏輯基本一致。

友情推薦:

相關推薦

Android滑動機制 NestedScrolling

       從 Android 5.0 Lollipop 開始提供一套 API 來支援嵌入的滑動效果。同樣在最新的 Support V4 包中也提供了前向的相容。有了嵌入滑動機制,就能實現很多很複雜的滑動效果。在 Android Design Support 庫中非常總要

利用 Android 滑動機制輕鬆實現頂部佈局置頂

code小生,一個專注 Android 領域的技術平臺作者:蟬翅的空響連結:https://ww

Redis高可用持久化技術及方案選擇 推薦--轉載自程式設計迷思部落格www.cnblogs.com/kismetv/p/8654978.html

一、Redis高可用概述 在介紹Redis高可用之前,先說明一下在Redis的語境中高可用的含義。 我們知道,在web伺服器中,高可用是指伺服器可以正常訪問的時間,衡量的標準是在多長時間內可以提供正常服務(99.9%、99.99%、99.999% 等等)。但是在Redis語境中,高可用的含義似乎要寬泛一些,除

Qt中的狀態機機制

狀態機,簡寫為FSM(Finite State Machine),狀態機由狀態暫存器和組合邏輯電路構成,能夠根據控制訊號按照預先設定的狀態進行狀態轉移,是協調相關訊號動作、完成特定操作的控制中心。     在GUI開發的時候,介面複雜的邏輯往往令人抓狂,邏輯都不清晰,程

Sass中的---結合線上編譯選擇器、屬性、偽類

推薦部落格:https://blog.hypers.io/2017/08/06/sass%20&%20compass%20%E6%95%99%E7%A8%8B%20--%20%E8%AF%AD%E6%B3%95%E7%AF%87(%E4%B8%80)/?utm_source=tuicool&

RecycleView滑動機制

Android 5.0推出了巢狀滑動機制,在之前,一旦子View處理了觸控事件,父View就沒有機會再處理這次的觸控事件,而巢狀滑動機制解決了這個問題,能夠實現如下效果: 為了支援巢狀滑動,子View必須實現NestedScrollingChild介面,父View必須實

Android滑動-Behavior方案實戰及細節注意

筆者在2013年就收到Android巢狀滑動的UI效果需求,當時都是直接從監聽滑動事件分發做起,至今再次收到這種類似的需求,一直以來想更新下之前的實現方式,相對於Behavior封裝過的方案而言畢竟不夠優雅,現就介紹前後兩種方案。 老方案的思路 這種方式是

深度學習之經典網路架構九大框架彙總

目錄 0、概覽 2、總結 本文是對本人前面講的的一些經典框架的彙總。 純手打,如果有不足之處,可以在評論區裡留言。 0、概覽 1、個人心得 (1)LeNet:元老級框架,結構簡單,卻開創了卷積神經網路的新紀元,具有重要的學

【H.264/AVC視訊編解碼技術】十三、熵編碼演算法4H.264使用CAVLC解析巨集塊的殘差資料

《H.264/AVC視訊編解碼技術詳解》視訊教程已經在“CSDN學院”上線,視訊中詳述了H.264的背景、標準協議和實現,並通過一個實戰工程的形式對H.264的標準進行解析和實現,歡迎觀看! “紙上得來終覺淺,絕知此事要躬行”,只有自己按照標準文件以程式碼

【H.264/AVC視訊編解碼技術】十三、熵編碼演算法3CAVLC原理

《H.264/AVC視訊編解碼技術詳解》視訊教程已經在“CSDN學院”上線,視訊中詳述了H.264的背景、標準協議和實現,並通過一個實戰工程的形式對H.264的標準進行解析和實現,歡迎觀看! “紙上得來終覺淺,絕知此事要躬行”,只有自己按照標準文件以程式碼

深度學習之經典網路架構DPNDual Path Network

目錄 0、簡介 1、優勢 3、總結 0、簡介 論文:Dual Path Networks 演算法詳解: 介紹的duall path networks(DPN)是顏水成老師新作,2017年4月在arxiv上放出,對於影象分類的效果有一定提升。我們知

【H.264/AVC視訊編解碼技術】七、 熵編碼演算法1基礎知識

《H.264/AVC視訊編解碼技術詳解》視訊教程已經在“CSDN學院”上線,視訊中詳述了H.264的背景、標準協議和實現,並通過一個實戰工程的形式對H.264的標準進行解析和實現,歡迎觀看! “紙上得來終覺淺,絕知此事要躬行”,只有自己按照標準文件以程式碼

CSS display:inline-block的應用

點擊 header 使用 -a title blank 擁有 美妝 底部 閱讀目錄 基礎知識 inline-block的問題 inline-block的應用 總結 本文詳細描述了display:inline-block的基礎知識,產生的問題和解決方法以及其常見的應

名稱空間C#

帶有using的部分說明吧。   正文 名稱空間可以被巢狀,即可以在一個名稱空間內定義另一個名稱空間。 語法: namespace namespace_name1 {    // 程式碼宣告    namespace namesp

vue外掛開發流程-從開發到釋出至npm

  前記:上一篇 https://www.cnblogs.com/adouwt/p/9211003.html,(這裡感謝部落格園的網友,給我點贊推薦了) 說到了一個完整的vue外掛開發、釋出的流程,總結下來就講了這麼一個事,如何注入vue, 如果封裝vue外掛,如何測試vue外掛,以及如何釋出vue外掛到np

vue外掛開發流程-從開發到釋出至npm

 vue的外掛開發 1.本地開發   1.1 初始化本地開發專案        1.2 test.js 的內容 ,這是外掛的入口檔案      test.js的程式碼如下: import testPanel from './panel.vue

第六章 註解式控制器——SpringMVC強大的資料繫結2

6.6.2、@RequestParam繫結單個請求引數值 @RequestParam用於將請求引數區資料對映到功能處理方法的引數上。 public String requestparam1(@RequestParam String username) 請求中包含username引數(如/

第六章 註解式控制器—SpringMVC強大的資料繫結1

     到目前為止,請求已經能交給我們的處理器進行處理了,接下來的事情是要進行收集資料啦,接下來我們看看我們能從請求中收集到哪些資料,如圖6-11:  圖6-11 1、@RequestParam繫結單個請求引數值; 2、@PathVariabl

Android之訊息處理機制Handler的本質-Message和Looper到底是什麼?

目錄 Android之訊息處理機制(二) 以下皆為乾貨,比較幹,需要讀者細細理解。  前面(一)已經解釋了Handler的基本機制了,下面來概括一下本質。 一、MessageQueue        MessageQueue其實就

從ElasticsearchAmbari與第三方軟體的整合

上文已經簡單介紹了前因,這裡我們就最核心的內容:如何做,進行講解。 二. 整合實現過程詳解 Ambari下服務資源的定義結構如下圖所示: |_ stacks |_ <stack_name> |_ <stack_version>