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