资讯专栏INFORMATION COLUMN

仿MIUI弹性列表

Jiavan / 2296人阅读

摘要:前言最近去小米之家体验了下小米,发现有一个挺特别的列表动画效果,在系统上的各种应用上都能见到它的身影。网上查了下,小米早在几个系统版本前就有这个,网上也有了实现这个效果的控件库。

前言

最近去小米之家体验了下小米9,发现MIUI有一个挺特别的列表动画效果,在系统上的各种应用上都能见到它的身影。

网上查了下,小米早在几个系统版本前就有这个,网上也有了实现这个效果的控件库。实现方法大同小异,大多都是通过继承ScrollView,然后重写onInterceptTouchEvent方法和OnTouchEvent方法,计算手指滑动距离来缩放内部控件。

这种方式适合对View触摸分发机制比较熟悉的同学,代码比较复杂,看了下现有的库也都没能实现MIUI中Fling状态的弹性效果。正好最近看了下NestedScrolling的相关知识,发现能很好地实现这些效果,所以就让我们来看看吧。

预备知识

需要先了解下NestedScrollChildNestedScrollParent,所谓的NestedScrolling机制是这样的:内部NestedScrollingChild在滚动的时候,预先将dx,dy通过NestedScrollingChildHelper传递给NestedScrollingParentNestedScrollingParent可先对其进行部分消耗,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阻尼回弹效果

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/6667.html

相关文章

  • 指尖一点歌声来--微信小程序之仿网易云音乐心得

    摘要:为了提高自己,最近在学习微信小程序,选题是仿网易云音乐。查文档发现,小程序中图片加载完成后,有一个加载完成事件。前者在微信客户端版本就不开始维护了,后者低版本需做兼容处理。目前还有一些功能暂未实现,会在以后继续完善项目,继续学习。 为了提高自己,最近在学习微信小程序,选题是仿网易云音乐。期间踩过了大把的坑,bug出现的难受和解决bug欢喜,一直是伴随我阶段性学习这个项目的心情。初步完成...

    KitorinZero 评论0 收藏0
  • TiDB 在小米的应用实践

    摘要:在系统基础上,针对中国用户进行了深度定制,在此之上孕育出了一系列的应用,比如主题商店小米音乐应用商店小米阅读等。将的监控融合到小米公司开源的监控系统中。 作者:张良,小米 DBA 负责人;潘友飞,小米 DBA;王必文,小米开发工程师。 一、应用场景介绍 MIUI 是小米公司旗下基于 Android 系统深度优化、定制、开发的第三方手机操作系统,也是小米的第一个产品。MIUI 在 And...

    mingzhong 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<