摘要:前言最近去小米之家體驗了下小米,發(fā)現(xiàn)有一個挺特別的列表動畫效果,在系統(tǒng)上的各種應(yīng)用上都能見到它的身影。網(wǎng)上查了下,小米早在幾個系統(tǒng)版本前就有這個,網(wǎng)上也有了實現(xiàn)這個效果的控件庫。
前言
最近去小米之家體驗了下小米9,發(fā)現(xiàn)MIUI有一個挺特別的列表動畫效果,在系統(tǒng)上的各種應(yīng)用上都能見到它的身影。
網(wǎng)上查了下,小米早在幾個系統(tǒng)版本前就有這個,網(wǎng)上也有了實現(xiàn)這個效果的控件庫。實現(xiàn)方法大同小異,大多都是通過繼承ScrollView,然后重寫onInterceptTouchEvent方法和OnTouchEvent方法,計算手指滑動距離來縮放內(nèi)部控件。
這種方式適合對View觸摸分發(fā)機(jī)制比較熟悉的同學(xué),代碼比較復(fù)雜,看了下現(xiàn)有的庫也都沒能實現(xiàn)MIUI中Fling狀態(tài)的彈性效果。正好最近看了下NestedScrolling的相關(guān)知識,發(fā)現(xiàn)能很好地實現(xiàn)這些效果,所以就讓我們來看看吧。
預(yù)備知識
需要先了解下NestedScrollChild和NestedScrollParent,所謂的NestedScrolling機(jī)制是這樣的:內(nèi)部NestedScrollingChild在滾動的時候,預(yù)先將dx,dy通過NestedScrollingChildHelper傳遞給NestedScrollingParent,NestedScrollingParent可先對其進(jìn)行部分消耗,Parent處理完后,再將剩余的部分還給內(nèi)部NestedScrollingChild處理,最后再把剩下的dx,dy再給Parent做最后處理,這樣一次觸摸滑動事件將可以由多個控件共同消耗處理,這樣就可以很方便解決之前一次觸摸滑動事件只能被一個控件響應(yīng)而產(chǎn)生的嵌套滑動問題。
先看下NestedScrollParent:
public interface NestedScrollingParent { public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes); public void onNestedScrollAccepted(View child, View target, int nestedScrollAxes); public void onStopNestedScroll(View target); public void onNestedScroll(View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed); public void onNestedPreScroll(View target, int dx, int dy, int[] consumed); public boolean onNestedFling(View target, float velocityX, float velocityY, boolean consumed); public boolean onNestedPreFling(View target, float velocityX, float velocityY); public int getNestedScrollAxes(); }
先看下NestedScrollingChild
public interface NestedScrollingChild { ? ? ?void setNestedScrollingEnabled(boolean enabled); ? ? ?boolean isNestedScrollingEnabled(); ? ? ?boolean startNestedScroll(int axes); ? ? ?void stopNestedScroll(); ? ? ?boolean hasNestedScrollingParent(); ? ? ?boolean dispatchNestedScroll(int dxConsumed, int dyConsumed, ? ? ? ? ? ?int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow); ? ? ?boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow); ? ? ? ?boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed); ? ? ?boolean dispatchNestedPreFling(float velocityX, float velocityY); }
可以看到parent和child的api命名很類似,是成對出現(xiàn)的,確實,它們之前存在發(fā)起方和接收方的事件調(diào)用關(guān)系,都是由child先響應(yīng)滑動觸摸實現(xiàn),通過NestedScrollingChildHelper分發(fā)給parent。
彈性列表實現(xiàn)
為方便解析,我們先只實現(xiàn)下滑的彈性動畫:
//子view,需事先NestedScrollingChild private var childView: View"); Fling彈性效果
參考文章
Android 8.0 NestedScrollingChild2與NestedScrollingParent2實現(xiàn)RecyclerView阻尼回彈效果
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/6667.html
摘要:為了提高自己,最近在學(xué)習(xí)微信小程序,選題是仿網(wǎng)易云音樂。查文檔發(fā)現(xiàn),小程序中圖片加載完成后,有一個加載完成事件。前者在微信客戶端版本就不開始維護(hù)了,后者低版本需做兼容處理。目前還有一些功能暫未實現(xiàn),會在以后繼續(xù)完善項目,繼續(xù)學(xué)習(xí)。 為了提高自己,最近在學(xué)習(xí)微信小程序,選題是仿網(wǎng)易云音樂。期間踩過了大把的坑,bug出現(xiàn)的難受和解決bug歡喜,一直是伴隨我階段性學(xué)習(xí)這個項目的心情。初步完成...
摘要:在系統(tǒng)基礎(chǔ)上,針對中國用戶進(jìn)行了深度定制,在此之上孕育出了一系列的應(yīng)用,比如主題商店小米音樂應(yīng)用商店小米閱讀等。將的監(jiān)控融合到小米公司開源的監(jiān)控系統(tǒng)中。 作者:張良,小米 DBA 負(fù)責(zé)人;潘友飛,小米 DBA;王必文,小米開發(fā)工程師。 一、應(yīng)用場景介紹 MIUI 是小米公司旗下基于 Android 系統(tǒng)深度優(yōu)化、定制、開發(fā)的第三方手機(jī)操作系統(tǒng),也是小米的第一個產(chǎn)品。MIUI 在 And...
閱讀 3475·2021-11-25 09:43
閱讀 1081·2021-11-15 11:36
閱讀 3325·2021-11-11 16:54
閱讀 3992·2021-09-27 13:35
閱讀 4381·2021-09-10 11:23
閱讀 5791·2021-09-07 10:22
閱讀 3050·2021-09-04 16:40
閱讀 779·2021-08-03 14:03