亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統(tǒng) > Android > 正文

Android 三級NestedScroll嵌套滾動實踐

2019-10-21 21:25:32
字體:
來源:轉載
供稿:網友

嵌套滾動介紹

我們知道 NestedScrolling(Parent/Child) 這對接口是用來實現嵌套滾動的,一般實現這對接口的 Parent 和 Child 沒有直接嵌套,否則直接用 onInterceptTouchEvent() 和 onTouchEvent() 這對方法實現就可以了。能夠越級嵌套滾動正是它的厲害之處。

嵌套滾動的接口有兩對:NestedScrolling(Parent/Child) 和 NestedScrolling(Parent2/Child2) 后者相比前者對 fling 的處理更加細致。相比第一代 Child 簡單地將 fling 拋給 Parent,第二代 Child 將 fling 轉化為 scroll 后再分發(fā)給 Parent,為了和普通的 scroll 區(qū)分增加了一個參數 type, 當 type 是 ViewCompat.TYPE_TOUCH 時表示普通的 scroll,當是 ViewCompat.TYPE_NON_TOUCH 時表示由 fling 轉化而來的 scroll。這樣做的好處是當 Child 檢測到一個 fling 時,它可以選擇將這個 fling 引起的 scroll 一部分作用在 Parent 上一部分作用在自己身上,而不是只作用在 Parent 或者 Child 上。或許你會問 fling 為什么不能選擇 Parent 和 Child 都作用,事實上你可以,但 fling 的話 Parent 沒法告訴 Child 消費了多少,剩下多少,因為 fling 傳遞的值是速度,不像 scroll 是距離。所以通過 NestedScrolling(Parent2/Child2) 實現嵌套滾動時,當你觸發(fā)了一個 fling 時,也可以做很順滑連貫的交替滾動,而 1 就很難達到相同的效果?,F在官方 View 的實現也是通過 NestedScrolling(Parent2/Child2),所以我們在實現自定義的嵌套滾動時盡量用 2。

上面簡單介紹了 NestedScrolling 2 和 1 的區(qū)別以及為什么要使用2?,F在我們來看看 NestedScrolling(Parent2/Child2) 的方法,1 就不看了,和 2 差不多。

public interface NestedScrollingChild2 { void setNestedScrollingEnabled(boolean enabled); boolean isNestedScrollingEnabled(); boolean startNestedScroll(@ScrollAxis int axes, @NestedScrollType int type);  void stopNestedScroll(@NestedScrollType int type); boolean hasNestedScrollingParent(@NestedScrollType int type); boolean dispatchNestedScroll(int dxConsumed, int dyConsumed,   int dxUnconsumed, int dyUnconsumed, @Nullable int[] offsetInWindow,   @NestedScrollType int type);   	boolean dispatchNestedPreScroll(int dx, int dy, @Nullable int[] consumed,   @Nullable int[] offsetInWindow, @NestedScrollType int type);}
public interface NestedScrollingParent2 {	boolean onStartNestedScroll(@NonNull View child, @NonNull View target, @ScrollAxis int axes,   @NestedScrollType int type);   	void onNestedScrollAccepted(@NonNull View child, @NonNull View target, @ScrollAxis int axes,   @NestedScrollType int type);   	void onStopNestedScroll(@NonNull View target, @NestedScrollType int type);	void onNestedScroll(@NonNull View target, int dxConsumed, int dyConsumed,   int dxUnconsumed, int dyUnconsumed, @NestedScrollType int type);	void onNestedPreScroll(@NonNull View target, int dx, int dy, @NonNull int[] consumed,   @NestedScrollType int type);}

從這兩個接口的方法可以看出這些方法都是一一對應的,比如 startNestedScroll 和 onStartNestedScroll,stopNestedScroll 和 onStopNestedScroll 等。從這些方法的命名上也能看出來嵌套滾動的交互順序是 Child 主動觸發(fā),Parent 被動接受,所以決定是否打開嵌套滾動的方法 setNestedScrollingEnabled 由 Child 實現,決定開始和結束的方法 startNestedScroll 和 stopNestedScroll 也由 Child 實現。

這里用一個圖來表示嵌套滾動流程

Android,NestedScroll,嵌套滾動

整個過程大概分為兩部分:綁定和滾動分發(fā)。綁定部分可以理解為 Child 向上遍歷找 NestedScrollingParent2 的過程,找到后調用它的 onStartNestedScroll 方法,如果返回 true 則說明這個 Parent 想接收 nested scroll,Child 會緊接著調 onNestedScrollAccepted 方法表示同意 Parent 處理自己分發(fā)的 nested scroll,對應上圖中的 1 2 3。滾動分發(fā)部分 Child 將自己的 scroll 分為三個階段 before scroll after,before 和 after 分發(fā)給 parent 消費,scroll 階段讓自己消費,這三個階段是按順序進行的,換句話說如果前一步消耗完了 scroll,那后面的階段就沒有 scroll 可以消費。這樣做的好處是讓 Parent 可以在自己消費之前或者之后消費 scroll,如果 Parent 想在 Child 之前消費就在 onNestedPreScroll 方法里處理,否則就在 onNestedScroll 方法里,對應上圖中的 4 5 步。上面介紹到的一些通用邏輯被封裝在 NestedScrollingChildHelper 和 NestedScrollingParentHelper 中,在 NestedScrolling(Parent2/Child2) 的方法中可以調用 Helper 類中的同名方法,比如 NestedScrollingChild2.startNestedScroll 方法中實現了向上遍歷尋找 NestedScrollingParent 的邏輯。

三級嵌套滾動

一個常見的嵌套滾動例子是 CoordinatorLayout/AppbarLayout - RecyclerView, 實現的效果是向上滑動列表時,會先將 AppbarLayout 向上滑動直到完全折疊,向下滑動至列表最頂部后會展開 AppbarLayout, 如下圖:

Android,NestedScroll,嵌套滾動

這里實現 NestedScrollingParent2 的是 CoordinatorLayout/AppbarLayout, 實現 NestedScrollingChild2 的是 RecyclerView。對于這種兩級嵌套滾動的需求使用 CoordinatorLayout 幾乎都能實現,如果遇到特殊的業(yè)務需求基于 CoordinatorLayout 和 RecyclerView 的實現改改也能實現。

Android,NestedScroll,嵌套滾動

我這里遇到的需求是即刻首頁的樣式(可參考即刻5.4.2版本),除了要有 AppbarLayout 折疊效果之外還要在 AppbarLayout 頂部展示搜索框和刷新動畫。這里的滑動邏輯是:

  • 向上滑動時,最先折疊刷新動畫,向下滑動時最后展開刷新動畫。
  • 向上滑動列表時先折疊 AppbarLayout,AppbarLayout 完全折疊后再折疊搜索框。
  • 向下滑動列表時在展開 AppbarLayout 之前先展開搜索框。
  • 列表沒滑動到頂部時可以通過觸發(fā)一定速度的向下 fling 來展開搜索框。

可以發(fā)現這里除了 CoordinatorLayout/AppbarLayout - RecyclerView 這對嵌套滾動的 Parent 和 Child 之外還多了搜索框和刷新動畫,而這三者之間的滑動邏輯需要通過嵌套滾動實現,只是傳統(tǒng)的兩級嵌套滾動不能滿足,所以需要實現三級嵌套滾動。

所謂三級嵌套滾動是在兩級嵌套滾動之上再添加一個 Parent,這里為了表述方便將三級嵌套滾動的三級由上到下分別稱為 Grand Parent Child。具體是由兩對 NestedScrolling(Parent2/Child2) 接口實現,Grand 實現第一對接口的 Parent,Parent 實現第一對接口的 Child 和第二對接口的 Parent,Child 實現第二對接口的 Child。與兩級嵌套滾動相比三級嵌套的 Grand 和 Child 和兩級的 Parent 和 Child 區(qū)別不大,變化比較大的是三級的 Parent 既要實現兩級的 Parent 接口又要實現 Child 接口,示意圖如下:

Android,NestedScroll,嵌套滾動

在即刻首頁這個例子里,CoordinatorLayout/AppbarLayout 屬于三級嵌套的 Parent 實現了第二對接口的 NestedScrollingParent2,RecyclerView 屬于 Child 實現了第二對接口的 NestedScrollingChild2。這里我們需要做的是實現第一對嵌套接口,新建一個自定義 Layout 實現 NestedScrollingParent2 接口作為三級嵌套的 Grand,負責搜索框和刷新動畫的折疊和展開。再新建一個自定義 Layout 繼承 CoordinatorLayout 實現 NestedScrollingChild2 接口,負責攔截列表分發(fā)上來的滾動事件或者處理 AppbarLayout 消費后剩下的滾動事件。

二級嵌套滾動可以理解為給 Parent 提供了攔截 Child 滾動事件和處理 Child 剩余滾動事件的能力,具體邏輯可參考本文最開始介紹嵌套滾動的部分。相應的三級嵌套滾動給 Grand 提供了攔截 Parent 和處理剩余滾動事件的能力,只是攔截和處理的時機多了一些,如下圖:

Android,NestedScroll,嵌套滾動

二級嵌套滾動對滾動處理時機只有三個階段:preScroll、scroll 和 afterScroll。而三級嵌套滾動的處理時機就多一些,有七個階段:prePreScroll、preScroll、afterPreScroll、scroll、preAfterScroll、afterScroll 和 afterAfterScroll,可以看出相比二級嵌套多了 prePreScroll、afterPreScroll、preAfterScroll 和 afterAfterScroll 這四個階段,多出的這幾個階段都是給 Grand 用的。到這里可以發(fā)現 NestedScrollingParent2 其實不能完全描述 Grand 的能力,確實最理想的方案應該是新建一對接口 NestedScrollingGrand2 和 NestedScrollingGrandChild2 來描述新增的四個對滾動事件的處理階段,但考慮到我這里的例子 Grand 對 Parent 的處理沒有那么精細化,所以還是通過復用 NestedScrolling(Parent2/Child2) 和一些附加方法來實現。以后如果實現了 NestedScrolling(Grand2/GrandChild2) 接口,也會及時更新。根據上圖即刻首頁滑動的實現思路就很簡單了:

  • onPrePreScroll 中執(zhí)行折疊刷新動畫的邏輯,onAfterAfterScroll 中執(zhí)行展開刷新動畫的邏輯。
  • onPreScroll 中執(zhí)行折疊 AppbarLayout 的邏輯,onAfterPreScroll 中執(zhí)行搜索框折疊的邏輯。
  • onAfterScroll 中執(zhí)行展開 AppbarLayout 的邏輯,onPreAfterScroll 中執(zhí)行搜索框展開的邏輯。
  • 列表沒滑到頂部根據 fling 展開搜索框的邏輯單獨在 Parent 的 onNestedPreFling 里做,這條算是一個特殊處理。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
国产成人精品一区二区三区福利| 免费久久久一本精品久久区| 一本色道久久综合熟妇| 97人人模人人爽人人喊38tv| 久久久久久久久久久亚洲| 无码专区aaaaaa免费视频| 《视频一区视频二区| 欧美福利视频网站| 国语对白在线视频| 亚洲福利影片在线| 天天操天天色综合| 亚洲欧美日韩国产中文在线| 成人精品影院| 欧美 丝袜 自拍 制服 另类| 国产精品入口免费麻豆| 在线观看中文字幕不卡| 黄色av免费在线播放| www.国产毛片| 91精品国产自产在线丝袜啪| 韩国美女主播一区| 成人午夜激情| 亚洲在线免费观看| 视频一区二区三区不卡| 91精品91| 国产成人精品一区二区三区在线观看| 久久久久免费视频| 91综合在线| 国外成人在线直播| 深夜福利一区二区| 国产亚洲欧洲| 97av在线视频免费播放| 午夜老司机精品| 欧美日韩一区三区| 欧美激情一区二区三区成人| 亚洲国产日韩欧美在线动漫| 先锋影音资源999| 97av在线视频免费播放| 欧美二区乱c黑人| 一区二区激情| 少妇av在线播放| 欧美日韩在线观看一区二区| 日韩少妇裸体做爰视频| 卡一卡2卡三精品| 亚洲免费一级电影| 在线播放视频一区| 欧美一性一交| 国产福利影院在线观看| 欧美一区二区三区免费大片| 亚洲成av人片在线观看| 亚洲伊人一本大道中文字幕| 欧美午夜激情影院| 国产黄片一区二区三区| 美女被艹视频网站| 国产一区二区在线影院| 欧美在线视频网站| 加勒比中文字幕精品| 黄p免费网站| 国产永久免费网站| 5月婷婷6月丁香| www.亚洲成人网| 8x福利精品第一导航| 在线成人高清不卡| tube8在线hd| 中文在线资源天堂| 午夜视频在线| 蜜桃视频一区二区在线观看| 台湾色综合娱乐中文网| 国产大片精品免费永久看nba| 亚洲欧美一区二区三区在线观看| 久久久久久久久99精品大| 免费观看在线一区二区三区| 爱爱精品视频| 美国成人毛片| 亚洲国产一区二区在线播放| 日韩电影中文字幕一区| 精品免费视频123区| 97av中文字幕| 亚洲日本一区二区三区在线不卡| 朝桐光av在线一区二区三区| 亚洲人成电影在在线观看网色| 色吊一区二区三区| 成人动态视频| 尤物yw午夜国产精品视频明星| 青青草国产成人a∨下载安卓| 人与人69性欧美三人交| 国产欧美高清在线| 综合国产在线| 亚洲xxx拳头交| 精品乱码一区二区三四区视频| 亚洲一二三四在线| 精品人妻一区二区三区香蕉| 欧美男男大粗吊1069| 欧美作爱福利免费观看视频| 天天影视天天精品| 天天干,夜夜爽| 欧美精品videossex变态| 日韩精品在线免费播放| 亚洲免费影视| 日本成人黄色网址| 精品乱色一区二区中文字幕| 影音先锋在线中文| 久久激情中文| 亚洲风情在线资源| 91一区二区三区在线观看| 播放灌醉水嫩大学生国内精品| 国产一区二区三区精彩视频| 国产91欧美| 国产成人精品一区二区三区视频| 深夜福利一区二区三区| 三级视频网站在线观看| 欧美日韩中文在线视频| 色播久久人人爽人人爽人人片视av| 日本激情视频网| 亚洲免费在线看| 成人综合在线视频| 在线观看美女av| 亚洲性猛交xxxx乱大交| 国产精品一区二区免费不卡| 5278欧美一区二区三区| 亚洲免费在线电影| av在线电影院| 狂野欧美性猛交xxxx| 国产午夜精品久久久| 欧美一二三区在线观看| 欧美日韩亚洲在线观看| 手机免费av片| 在线观看国产麻豆| 国内精品久久久久久久果冻传媒| 国精产品99永久一区一区| 久久久精品区| 欧美日本国产在线| 四虎成年永久免费网站| 95精品视频| 久久久噜噜噜www成人网| 久久久9999久久精品小说| 欧美一二三视频| 欧美极品免费| 国产96在线亚洲| 亚洲视频一起| 欧美理伦片在线播放| 伊人久久大香线蕉午夜av| 亚洲精品一区二区三区网址| 欧美精品少妇videofree| 波多野结衣激情| 婷婷成人综合网| 久久精品国产亚洲av香蕉| 久久免费福利| 视频一区日韩| 亚洲天堂视频一区| 91麻豆国产精品久久| 亚洲图片欧美色图| 欧美激情网址| 国产浪潮av性色av小说| 中国大陆高清aⅴ毛片| 国产欧美高清视频在线| 精品久久福利| 日韩最新中文字幕| 欧美成年人网站| 欧美性猛交xxxxx免费看| 久久成人久久鬼色| 丁香激情综合五月| 亚洲欧洲动漫| 色国产在线视频| 色欧美乱欧美15图片| 一本色道无码道dvd在线观看| av电影在线地址| 一个人看的www视频免费观看| 久久99精品网久久| 成人日韩精品| 久久天天躁夜夜躁狠狠躁2022| 国产91露脸合集magnet| 2021国产在线| 日本在线视频不卡| 中文字幕精品久久久久| 六月丁香婷婷色狠狠久久| 午夜影视一区二区三区| 亚洲一区二区三区激情| 3d黄动漫网站| 国产香蕉精品视频一区二区三区| 欧美性video| 91电影在线播放| 亚洲电影成人成人影院| 欧美日韩亚洲国内综合网俺| av官网在线观看| 国产综合久久久久影院| 91小视频免费看| 精品动漫一区二区三区在线观看| 在线国产电影不卡| 成人日韩视频| 十八禁视频网站在线观看| 国产精品入口免费麻豆| 日韩欧美黄色网址| 成人av资源网| 欧美一区,二区| 天天添天天操| 精品国产影院| 成人区精品一区二区| 岛国91视频| 国产综合亚洲精品一区二| 亚洲视频一区在线| 久久国产成人精品国产成人亚洲| 女人高潮特级毛片| 91精品国产福利在线观看| 国产日韩欧美日韩| 国产午夜在线播放| 美女精品久久| 精品一区二区三区在线观看| 亚洲综合日韩中文字幕v在线| 国产一区二区免费视频| 日本成人精品在线| 大美女一区二区三区| 欧美成人久久| 精品久久亚洲一级α| 欧美另类69精品久久久久9999| 欧美激情按摩在线| 香港欧美日韩三级黄色一级电影网站| 自拍偷拍视频在线| 欧美极品欧美精品欧美视频| 成人福利资源| 国产三级伦理片| 3d动漫精品啪啪| 美女脱光衣服与内衣内裤一区二区三区四区| 久艹在线播放| 久久久久久久久一区| 日韩欧美国产黄色| 奇米一区二区| 中文欧美字幕免费| 亚洲少妇第一页| 亚洲欧美色视频| 久久精品高清| 精品国产乱码久久久久久图片| 欧美洲成人男女午夜视频| 一本一道久久综合狠狠老精东影业| 亚洲女人的天堂| 无码国模国产在线观看| 99热这里只有精品1| 国产三级精品在线不卡| 色菇凉天天综合网| 伊人亚洲视频| 色豆豆成人网| 精品一区二区三区久久久| 色婷婷国产精品综合在线观看| 日韩高清免费观看| 成人图片小说| 最新亚洲精品国自产在线观看| 久久日韩视频| 精品欧美国产一区二区三区| www在线看| 欧美成人午夜精品免费| 亚洲欧美国产精品va在线观看| 欧美精品一区二区三区在线四季| 999成人精品视频线3| 精品视频久久久久久| 亚洲精品久久7777777| 成视频在线观看免费观看| 国产精品卡一卡二| 国内老熟妇对白xxxxhd| 加勒比色老久久爱综合网| 欧美 日韩 国产 成人 在线观看| 飘雪影院手机免费高清版在线观看| 欧美一区免费观看| 中文先锋资源| 一本久道高清无码视频| 91国偷自产一区二区三区观看| 日韩一本二本av| 巨人精品**| 国产福利第一视频在线播放| 看欧美ab黄色大片视频免费| 国产成人午夜99999| 国产理论在线观看| 久久久久久国产三级电影| 朝桐光av在线一区二区三区| 免费黄色福利视频| 一区二区三区免费高清视频| 性一交一乱一色一视频麻豆| 国产视频一区二区三区四区五区| 国产1区2区3区中文字幕| 国产免费成人在线视频| 久久国产亚洲精品无码| 国产在线一二| 美女黄a一级视频| 亚洲国产精品一| 久久久久久久一区二区三区| 天天操天天射天天爽| 国产一区二区三区无遮挡| 国产精品18久久久久| 亚洲欧美国产另类首页| 久久影视免费观看| 91麻豆免费看片| 日本黄色入口| 欧美黄色片视频| 91精品国产综合久久久久久漫画| 福利一区二区三区视频在线观看| 国产精品2018| 日本综合字幕| 成人一区二区三区四区| 中文字幕精品一区二区精| av片哪里在线观看| 涩涩屋成人免费视频软件| 伊人在线视频| 在线视频亚洲一区| 欧美精品一区二区高清在线观看| 毛片基地网站| 亚洲欧美在线网| 青青视频在线免费观看| 色婷婷综合成人av| 99久久99久久久精品棕色圆| 日韩网站免费观看高清| 免费在线播放第一区高清av| 成人无遮挡免费网站视频在线观看| 中文无码av一区二区三区| 欧美日本黄视频| 国产成人综合在线| 麻豆精品永久免费视频| 国产精品18久久久久久vr| 亚洲欧洲自拍偷拍| 波多野结衣综合网| 久久久综合香蕉尹人综合网| aaa国产一区| 久久久久久久久久久久久国产精品| 一区二区三区四区视频精品免费| 欧美视频在线观看一区| 国产成人免费视频网站高清观看视频| 亚洲日韩欧美视频一区| 91一区二区三区在线观看| 免费日韩电影| 日本精品一区二区三区视频| 久久国产生活片100|