Android8.0对于CoordinatorLayout、RecyclerView 精准fling的优化

本文主要是介绍Android8.0对于CoordinatorLayout、RecyclerView 精准fling的优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

之前为了开发需求,学习了NestedScrolling机制,并使用CoordinatorLayout、AppBarLayout、RecyclerView配合实现了相关的效果,还写了一篇关于分析原理的文章关于CoordinatorLayout AppBarLayout原理的一些分析,当时做完需求以后,内心其实是一只有种遗憾的,因为在使用RecyclerView时,对于向上滑动的fling效果其实是有问题的,滑动起来的感觉并不是连贯的,可以看一下这个效果:
old.gif

这个效果的体验其实并不是太好,因为向下fling时我们希望的效果是父布局可以在RecyclerView到达顶部时,如果没有消耗完fling时可以由父布局消耗从而继续滑动的,可是由于之前的实现方式,并没有办法用常规的办法达到这一点,Google也意识到了这个问题,所以在Android 8.0 扩展了NestedScrolling的相关接口,使得滑动可以变得更加顺畅了,效果如下,简直如丝般顺滑:
new.gif
在分析相关的原理之前,如果你们急需解决项目中的这种滑动不顺畅,可以先把解决方法告诉大家,那就是把compileSdkVersion升到26然后使用26.1.0的相关控件

apply plugin: 'com.android.application'android {compileSdkVersion 26buildToolsVersion '26.0.2'.......
}dependencies {....compile 'com.android.support:recyclerview-v7:26.1.0'compile 'com.android.support:support-v4:26+'compile 'com.android.support:design:26.1.0'.....
}

这样改好之后,不需要改动一行代码,即可完美实现如丝般顺滑的fling。

问题发生的原因

RecyclerView中,fling的调用发生在滑动事件MotionEvent.ACTION_UP时,在25+版本之前RecycleView只是在fling的开始之前通知了Parent是否消耗fling以及将fling分发到parent,这只能做到Parent和RecyclerView同时fling或者Parent自己fling,在RecyclerView的fling过程中并没有通知Parent,在RecyclerView fling结束之后,Parent不能拿到剩余未消耗的距离,所以导致了这个不能连贯滑动的问题,25+版本的RecyclerView的fling方法如下:

public boolean fling(int velocityX, int velocityY) {if (mLayout == null) {Log.e(TAG, "Cannot fling without a LayoutManager set. " +"Call setLayoutManager with a non-null argument.");return false;}if (mLayoutFrozen) {return false;}final boolean canScrollHorizontal = mLayout.canScrollHorizontally();final boolean canScrollVertical = mLayout.canScrollVertically();if (!canScrollHorizontal || Math.abs(velocityX) < mMinFlingVelocity) {velocityX = 0;}if (!canScrollVertical || Math.abs(velocityY) < mMinFlingVelocity) {velocityY = 0;}if (velocityX == 0 && velocityY == 0) {// If we don't have any velocity, return falsereturn false;}if (!dispatchNestedPreFling(velocityX, velocityY)) {final boolean canScroll = canScrollHorizontal || canScrollVertical;dispatchNestedFling(velocityX, velocityY, canScroll);if (mOnFlingListener != 

这篇关于Android8.0对于CoordinatorLayout、RecyclerView 精准fling的优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/humorousz/article/details/79552635
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/381100

相关文章

SpringBoot中HTTP连接池的配置与优化

《SpringBoot中HTTP连接池的配置与优化》这篇文章主要为大家详细介绍了SpringBoot中HTTP连接池的配置与优化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、HTTP连接池的核心价值二、Spring Boot集成方案方案1:Apache HttpCl

PyTorch高级特性与性能优化方式

《PyTorch高级特性与性能优化方式》:本文主要介绍PyTorch高级特性与性能优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、自动化机制1.自动微分机制2.动态计算图二、性能优化1.内存管理2.GPU加速3.多GPU训练三、分布式训练1.分布式数据

MySQL精准控制Binlog日志数量的三种方案

《MySQL精准控制Binlog日志数量的三种方案》作为数据库管理员,你是否经常为服务器磁盘爆满而抓狂?Binlog就像数据库的“黑匣子”,默默记录着每一次数据变动,但若放任不管,几天内这些日志文件就... 目录 一招修改配置文件:永久生效的控制术1.定位my.cnf文件2.添加核心参数不重启热更新:高手应

MySQL中like模糊查询的优化方案

《MySQL中like模糊查询的优化方案》在MySQL中,like模糊查询是一种常用的查询方式,但在某些情况下可能会导致性能问题,本文将介绍八种优化MySQL中like模糊查询的方法,需要的朋友可以参... 目录1. 避免以通配符开头的查询2. 使用全文索引(Full-text Index)3. 使用前缀索

C#实现高性能Excel百万数据导出优化实战指南

《C#实现高性能Excel百万数据导出优化实战指南》在日常工作中,Excel数据导出是一个常见的需求,然而,当数据量较大时,性能和内存问题往往会成为限制导出效率的瓶颈,下面我们看看C#如何结合EPPl... 目录一、技术方案核心对比二、各方案选型建议三、性能对比数据四、核心代码实现1. MiniExcel

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.