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