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

首頁 > 學院 > 開發設計 > 正文

CoordinatorLayout補齊資料篇

2019-11-09 15:41:02
字體:
來源:轉載
供稿:網友

CoordinatorLayout補齊資料篇

前言

?CoordinatorLayout?是在 Google I/O 2015 提出來的 Material Design 組件,一并發布的有?AppbarLayout?, ?CollapsingToolbarLayout??NestedScrollView ?等一系列靈活處理動態交互的 Materail Design 控件。 很早就想對?Coordinator? 做一次全面的分析,因為懶,一直都沒動手,以至于這一篇拖了將近兩年才開始寫。

組件

工欲善其事,必先利其器。先從官網入手,熟悉一下這一控件的大致功能。

CoordinatorLayout

官網介紹:

這里寫圖片描述 大致意思就是:

CoordinatorLayout 是一個加強版的 FrameLayout。

主要有兩個用途:

作為頂層應用的裝飾或者 Chrome 布局作為容器來協調一個或多個子 view 的特定交互

為子View指定?Behaviors?可以實現子 view 與父 view 或者是子 view 相互間的交互。

CoordinatorLayout 的子 view 還可以通過 anchor 來制定位置基準對象。

系統給一些控件提供了默認的 Behavior,處理了相關的聯動動態效果,我們也可以自定義 Behavior,注解 DefaultBehavior。關于如何自定義 Behavior,在后面我會著重提到。

AppBarLayout

再來看看官網對AppBarLayout的介紹:

這里寫圖片描述

大致意思就是:

AppBarLayout是一個豎直的 LinearLayout,而且實現了很多 Material Design 特性并且能夠響應滑動事件。

AppBarLayout 最好是 CoordinatorLayout 的直接子 view,如果是在其他 ViewGroup 中,可能會喪失很多特效。

AppBarLayout 的子 view 需要設置 app:layout_scrollFlags,或者是在代碼中調用 setScrollFlags(int) 設置這個屬性。

AppBarLayout的兄弟節點最好是可以滾動的,需要指定 behavior 屬性為 AppBarLayout.ScrollingViewBehavior (可以使用一個內置的 string 表示這個默認的實例@string/appbar_scrolling_view_behavior)。

看來 AppBarLayout 內容比較多啊,來看看 Google 給出的講解性偽代碼。

這里寫圖片描述

好了,一下子都看清楚了。

CollapsingToolbarLayout

還是來看官方 Api:

這里寫圖片描述

意思是:

CollapsingToolbarLayout 是實現了折疊工具欄效果 Toolbar 的包裝器,被作為 AppBarLayout 的直接子 View。

折疊標題 CollapsingTitle:

當布局完全顯示是,標題會變大;當布局上滑滑出屏幕,標題會逐漸變小??梢酝ㄟ^ setTitle()來設置標題,通過 collapsedTextAppearance() 和 expandedTextAppearance() 方法來調整外觀屬性。

沉浸式內容 Content scrim

ToolBar被折疊到頂部固定時候的背景,你可以調用setContentScrim(Drawable)方法改變背景或者 在屬性中使用 app:contentScrim=”?attr/colorPRimary” 來改變背景。

沉浸式狀態欄 Status bar scrim

當滾動到一定值時顯示或隱藏狀態欄沉浸式效果,通過 setStatusBarScrim() 方法來設置,僅在 Android5.0 以上并且設置了適應窗口 (fitsSystemWindows=”true”) 時有用。

視差滾動 Parallax scrolling children

CollapsingToolbarLayout 可以選擇視差滾動的方式來滾動,滾動方式有 parallax 和 pin。設置屬性 layout_collapseParallaxMultiplier 改變,視差系數在 0-1 之間。

頂部懸浮 CollapseMode

子試圖的折疊模式,parallax 和 pin。

pin:固定模式,滑動時也固定大小,直到定位在最終位置

parallax:視差模式,在折疊的時候有視差折疊效果,滑動時伸縮

Behavior

CoordinatorLayout 協調子 View 的響應,響應的核心是 Behavior,來看一下介紹:

這里寫圖片描述

一個 Behavior 實現了用戶的一個或者多個交互行為,它們可能包括拖拽、滑動、快滑或者其他一些手勢。

Behavior 是一個頂層抽象類,其他的一些具體行為的Behavior 都是繼承自這個類。它提供了幾個重要的方法:

layoutDependsOnonDependentViewChangedonStartNestedScrollonNestedPreScrollonNestedScrollonStopNestedScrollonNestedScrollAcceptedonNestedPreFlingonStartNestedScrollonLayoutChild

解釋一下上面幾個方法和它們的調用時機:

/** * 表示是否給應用了 Behavior 的 View 指定一個依賴的布局,通常,當被依賴的 View (參照物)布局發生變化時 * CoordinatorLayout都會協調依賴的 View(跟隨物)立即變化,聯動效果不會被受 CoordinatorLayout 子 View 的順序影響。 * @param parent * @param child 綁定behavior 的View * @param dependency 依賴的view * @return 如果child 是依賴的指定的View 返回true,否則返回false */ @Override public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) { return super.layoutDependsOn(parent, child, dependency); } /** * 當被依賴的View 狀態(如:位置、大?。┌l生變化時,這個方法被調用 * @param parent * @param child * @param dependency * @return */ @Override public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) { return super.onDependentViewChanged(parent, child, dependency); } /** * 當coordinatorLayout 的子View試圖開始嵌套滑動的時候被調用。當返回值為true的時候表明 * coordinatorLayout 充當nested scroll parent 處理這次滑動,需要注意的是只有當返回值為true * 的時候,Behavior 才能收到后面的一些nested scroll 事件回調(如:onNestedPreScroll、onNestedScroll等) * 這個方法有個重要的參數nestedScrollAxes,表明處理的滑動的方向。 * * @param coordinatorLayout 和Behavior 綁定的View的父CoordinatorLayout * @param child 和Behavior 綁定的View * @param directTargetChild * @param target * @param nestedScrollAxes 嵌套滑動 應用的滑動方向,看 {@link ViewCompat#SCROLL_AXIS_HORIZONTAL}, * {@link ViewCompat#SCROLL_AXIS_VERTICAL} * @return */ @Override public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) { return super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes); } /** * 嵌套滾動發生之前被調用 * 在nested scroll child 消費掉自己的滾動距離之前,嵌套滾動每次被nested scroll child * 更新都會調用onNestedPreScroll。注意有個重要的參數consumed,可以修改這個數組表示你消費 * 了多少距離。假設用戶滑動了100px,child 做了90px 的位移,你需要把 consumed[1]的值改成90, * 這樣coordinatorLayout就能知道只處理剩下的10px的滾動。 * @param coordinatorLayout * @param child * @param target * @param dx 用戶水平方向的滾動距離 * @param dy 用戶豎直方向的滾動距離 * @param consumed */ @Override public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed) { super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed); } /** * 進行嵌套滾動時被調用 * @param coordinatorLayout * @param child * @param target * @param dxConsumed target 已經消費的x方向的距離 * @param dyConsumed target 已經消費的y方向的距離 * @param dxUnconsumed x 方向剩下的滾動距離 * @param dyUnconsumed y 方向剩下的滾動距離 */ @Override public void onNestedScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) { super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed); } /** * 嵌套滾動結束時被調用,這是一個清除滾動狀態等的好時機。 * @param coordinatorLayout * @param child * @param target */ @Override public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, View child, View target) { super.onStopNestedScroll(coordinatorLayout, child, target); } /** * onStartNestedScroll返回true才會觸發這個方法,接受滾動處理后回調,可以在這個 * 方法里做一些準備工作,如一些狀態的重置等。 * @param coordinatorLayout * @param child * @param directTargetChild * @param target * @param nestedScrollAxes */ @Override public void onNestedScrollAccepted(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) { super.onNestedScrollAccepted(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes); } /** * 用戶松開手指并且會發生慣性動作之前調用,參數提供了速度信息,可以根據這些速度信息 * 決定最終狀態,比如滾動Header,是讓Header處于展開狀態還是折疊狀態。返回true 表 * 示消費了fling. * * @param coordinatorLayout * @param child * @param target * @param velocityX x 方向的速度 * @param velocityY y 方向的速度 * @return */ @Override public boolean onNestedPreFling(CoordinatorLayout coordinatorLayout, View child, View target, float velocityX, float velocityY) { return super.onNestedPreFling(coordinatorLayout, child, target, velocityX, velocityY); } //可以重寫這個方法對子View 進行重新布局 @Override public boolean onLayoutChild(CoordinatorLayout parent, View child, int layoutDirection) { return super.onLayoutChild(parent, child, layoutDirection); }

基于上面講的一些 ?Behavior?的不同回調,Google封裝了一些組件使用的 Behavior,比如 AppbarLayout 內部的 Behavior 專門用來協調 AppbarLayout 與可滾動的 View(NestedScrollView,RecyclerView)的,FloatActionButton 內部的 Behavior 協調和 Snackbar 的關系,保證 Snackbar 彈出的時候不被 FAB 遮擋。知道了這些,我們還可以自定義 Behavior。

Behavior 作用于CoordinatorLayout 子 View 的順序無關性是指根據依賴關系, CoordinatorLayout 中維護了一個mDependencySortedChildren 列表,里面含有所有的子 View,按依賴關系排序,被依賴者排在前面,會在每次測量前重新排序,確保處理的順序是 被依賴的 View 會先被 measure 和 layout

自定義 Behavior 的方式主要有兩種:

第一種是通過監聽一個 View 的狀態,如位置、大小的變化,來改變其他 View 的行為,這種只需要重寫兩個方法就可以了,分別是 layoutDependsOn 和 onDependentViewChanged,layoutDependsOn 方法判斷是指定依賴的 View 時,返回 true。在 onDependentViewChanged 里,被依賴的 View需要作出行為動作來響應。

第二種就是重寫 onStartNestedScroll、onNestedPreScrol、onNestedscroll 等一系列方法。

通過依賴的監聽,回調了上述方法。如果 CoordinatorLayout 內的 A 依賴 B,在 B 的大小位置等狀態改變的時候,A 可以監聽到,并作出響應。

CoordinatorLayout 本身注冊了兩種監聽器,ViewTreeObserver.OnPreDrawListener 和OnHierarchyChangeListener,一種是在繪制的之前進行回調,一種是在子 View 的層級結構發生變化的時候回調,有這兩種監聽就可以在接受到被依賴的 View 的變化了。

CoordinatorLayout 雖然繼承自 ViewGroup,但其更像是 FrameLayout,不能用 RelativeLayout 的layout_below等屬性來控制相對位置,所以控件確定上下的位置需要使用其他方式。

一種是:在控件高度不變的情況下,利用margin來定位。比如頭部 Header 高度恒定為40dp,那么想要一個控件放在 Header 下方,就設置這個控件的 marginTop 為 40dp 就好了。這種處理方式比較局限。

另一種是:利用 Behavior 提供的 onLayoutChild 方法重寫控件的 layout 過程。

未完待續,會寫個例子補充

參考資料:

Md系列3、CoordinatorLayout 里 Toobar和TabLayout等發生的一系列故事 自定義Behavior的藝術探索-仿UC瀏覽器主頁


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
自拍偷拍亚洲欧美| 亚洲国产天堂久久综合网| 91精品视频一区| 中文字幕日韩欧美在线| 欧美三级免费观看| 欧美精品在线第一页| 国模吧一区二区三区| 欧美日韩午夜视频在线观看| 91久久中文字幕| 精品久久久久久久久久久久久| 国产精品高清网站| 亚洲伦理中文字幕| 亚洲最大福利视频| 91在线高清免费观看| 国产美女久久精品| 久久精品人人做人人爽| 久久精视频免费在线久久完整在线看| 国产精品国产三级国产aⅴ9色| 欧美激情国产日韩精品一区18| 成人在线国产精品| 欧美日本亚洲视频| 国产91色在线播放| 亚洲乱码av中文一区二区| 欧美日韩爱爱视频| 亚洲一区二区少妇| 日韩精品极品在线观看播放免费视频| 国产精品久久久久久久久久久久久久| 最近中文字幕mv在线一区二区三区四区| 国产69精品久久久久9| 欧美另类99xxxxx| 国产成人激情小视频| 亚洲三级黄色在线观看| 国产日韩欧美黄色| 欧美一区二区三区免费观看| 日韩精品福利网站| www.日韩系列| 国产精品久久久久久五月尺| 欧美日在线观看| 中文字幕日韩av电影| 亚洲国产中文字幕久久网| 中文字幕日韩精品有码视频| 97视频免费看| 精品久久久久久中文字幕| 国产精品一区二区久久| 国产香蕉97碰碰久久人人| 中文字幕不卡在线视频极品| 久久中文字幕在线视频| 国产日韩在线一区| 国产精品视频中文字幕91| 欧美高清无遮挡| 色婷婷av一区二区三区在线观看| 日韩av免费看| 亚洲黄色在线观看| 成人免费淫片aa视频免费| 亚洲国模精品私拍| 亚洲一区av在线播放| 国产欧美精品日韩精品| 亚洲激情电影中文字幕| 在线观看欧美www| 久久影院资源站| 国产精品美女免费视频| 亚洲电影在线观看| 亚洲影院色在线观看免费| 国产一区二区三区在线观看视频| 97涩涩爰在线观看亚洲| 亚洲一区二区三区乱码aⅴ蜜桃女| 麻豆国产va免费精品高清在线| 精品国产乱码久久久久久婷婷| 97视频在线观看免费| 中文字幕一区二区精品| 国产成人小视频在线观看| 日本欧美中文字幕| 欧美一区二区三区四区在线| 国产在线精品成人一区二区三区| 欧美色xxxx| 亚洲最新av在线网站| 黑人巨大精品欧美一区免费视频| 91国产精品91| 日韩女在线观看| 日韩精品久久久久| 亚洲电影第1页| 国产成人涩涩涩视频在线观看| 亚洲人永久免费| 国产美女搞久久| 中文字幕在线成人| 欧美中文在线视频| 久久久久久91香蕉国产| 在线播放国产一区二区三区| 成人在线精品视频| 欧美成人免费一级人片100| 国产精品一香蕉国产线看观看| 亚洲欧美国内爽妇网| 欧美亚洲日本网站| 欧美午夜丰满在线18影院| 欧美性理论片在线观看片免费| 久久久久久亚洲精品中文字幕| 亚洲www在线| 国产精品福利无圣光在线一区| 亚洲性69xxxbbb| 欧美一乱一性一交一视频| 欧美电影免费观看大全| 国产精品午夜一区二区欲梦| 国产精品一区二区久久| 国产精品99蜜臀久久不卡二区| 亚洲free嫩bbb| 亚洲美女喷白浆| 国内精品久久久久久影视8| 亚洲男人第一网站| 国产日本欧美视频| 欧美性猛交xxxx久久久| 国产欧美精品一区二区| 国产成人精品网站| 91精品视频免费看| 色中色综合影院手机版在线观看| 91亚洲精品在线| 亚洲第一av网| 中文字幕在线观看日韩| 91chinesevideo永久地址| 亚洲一区二区久久久久久久| 国产精品盗摄久久久| 人体精品一二三区| 1769国内精品视频在线播放| 8050国产精品久久久久久| 久久久久成人网| 午夜精品久久久久久久99黑人| 日本免费一区二区三区视频观看| 91精品视频免费看| 欧美日韩在线影院| 亚洲视频axxx| 欧美猛少妇色xxxxx| 亚洲国产另类 国产精品国产免费| 国产suv精品一区二区三区88区| 中文字幕免费精品一区| 成人久久久久久| 久久精品国产精品| 在线视频欧美日韩精品| www.99久久热国产日韩欧美.com| 亚洲va男人天堂| 国产精品第8页| 精品亚洲aⅴ在线观看| 欧美高清在线视频观看不卡| 精品亚洲一区二区三区在线观看| 日韩欧美一区二区三区| 亚洲精品国产拍免费91在线| 亚洲精品福利免费在线观看| 欧美电影第一页| 亚洲社区在线观看| 久久99视频免费| 国产亚洲一区二区在线| 曰本色欧美视频在线| 中文字幕亚洲欧美日韩高清| 亚洲wwwav| 另类视频在线观看| 久久久久久久久国产精品| 97色伦亚洲国产| 成人免费高清完整版在线观看| 国产精品扒开腿爽爽爽视频| 青青草国产精品一区二区| 成人综合国产精品| 91伊人影院在线播放| 色综合久久中文字幕综合网小说| 久久久久久久999| 久久色在线播放| 欧美人成在线视频|