RecyclerView滑动时添加缩放效果

2023-09-19 08:55:05

 最近看到一个动画效果,感觉不错,所以动手试一试

我实现的效果

基本上是已经实现了头像无限滚动中itemview也伴随缩放效果

初步实现基本思路:

1、没选择用ViewPager,考虑到特定几张图片的循环显示和扩展我使用recyclerview

2、头像重叠效果通过添加 ItemDecoration可以实现

3、无限循环效果可以重写recyclerview实现

4、缩放的实现是随着距离的变化率而实现,没使用Animation

难点:一开始想通过ItemDecoration实现头像的重叠,但是滚动后随着缩放动画的变化,距离一直变大,child的位置发生了变化,需要对以下方法进行重写,所以我舍弃了ItemDecoration,在对child进行布局位置时进行重叠显示

了解一下layoutManager的源码,发现主要以下这几个方法要重写 :

onMeasure:用来测量RecyclerView的大小的。通常不用重写此方法,但是在一种情况下必须重写,LayouytManager不支持自动测量再重写它(i不需要重写) 

onLayoutChildren:布局ItemView位置(需要重写)

用参数对原始位置进行累加,避免因为缩放功能致命 child位置偏离距离过大,在布局之前,将所有的子View先Detach掉,放入到Scrap缓存中

 对layout重新进行布局

  layoutDecorated(
            child,
            frame.left - mOffsetAll,
            frame.top,
            frame.right - mOffsetAll,
            frame.bottom
        )

canScrolloriontally:设置该LayoutManager的RecyclerView是否可以水平滑动(需要重写)

scrollHorizontallyBy:水平可以滑动的距离。此方法带一个dx参数,表示RecyclerView已经产生了dx的滑动距离,此时我们需要做的是调用相关方法,进行重新布局

 val displayFrame = Rect(
            mOffsetAll, 0, mOffsetAll + horizontalSpace,
            verticalSpace
        )
        var position = 0
        for (i in 0 until childCount) {
            var child = getChildAt(i)
                     。。。。。。。

            }
            val rect = getFrame(position)
            if (!Rect.intersects(displayFrame, rect)) { 
                child?.let { removeAndRecycleView(it, recycler!!) } //回收滑出屏幕的View
                mHasAttachedItems.delete(position)
            } else { //Item还在显示区域内,更新滑动后Item的位置
                child?.let { layoutItem(it, rect) } //更新Item位置
                mHasAttachedItems.put(position, true)
            }
        }

                //开始滚动后对child重新测量,并layout


                 measureChildWithMargins(scrap, 0, 0)
                
                  addView(scrap)
                

//修正偏移量后对child重新布置
 layoutDecorated(
            child,
            frame.left - mOffsetAll,
            frame.top,
            frame.right - mOffsetAll,
            frame.bottom
        )

//addAnimation  实现缩放效果

默认向左滚动,如下图

 本篇内容是参考:https://blog.csdn.net/harvic880925/article/details/84979161

此Demo下载地址 Demo地址

更多推荐

springboot 去掉netflix 禁用Eureka

目录报错解决方法方法一:去掉maven依赖方法二:直接在application配置文件里禁用eureka(偷懒方法)方法三:检查eureka配置的地址是否正确(确实需要使用eureka)报错如果你接手别人的项目,启动的时候会一直报这个错:发现有netflix,eureka相关字眼,2023-09-1316:25:47.

PID控制原理

一.概述开环控制:没有反馈闭环控制:有反馈调节的控制PID控制环节由比例,积分,微分调节三个环节构成,三个环节在控制过程中相互配合,共同对输入输出间的误差进行调控,最终满足控制要求,如下图所示Pid控制完整图示二、各部分说明1.Proportion(比例控制)比例控制就是好每次调节的高度是误差的Kp倍.说明::err是

数据分享|SAS数据挖掘EM贷款违约预测分析:逐步Logistic逻辑回归、决策树、随机森林...

全文链接:http://tecdat.cn/?p=31745近几年来,各家商业银行陆续推出多种贷款业务,如何识别贷款违约因素已经成为各家商业银行健康有序发展贷款业务的关键(点击文末“阅读原文”获取完整数据)。相关视频在贷款违约预测的数据(查看文末了解数据免费获取方式)的基础上,探索是否能通过借贷者的数据判断其违约风险,

使用kubasz快速搭建Kubernetes集群

Kubernetes安装Kubernetes也称为K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统。ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。使用ansible

Kubernetes (K8s) 解读:微服务与容器编排的未来

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🐅🐾猫头虎建议程序员必备技术栈一览表📖:🛠️全栈技术FullStack:📚MERN/MEAN/MEVNStack|🌐Jamstack|🌍GraphQL|🔁RESTfulAPI|⚡WebSockets|🔄CI/CD|🌐Git&Versio

Kubernetes-01-基础概念篇 基础组件&搭建一个K8S集群

K8S重要技术内容主要涵盖:集群架构、容器化应用部署、ScaleUp/Down、滚动更新、监控检查、集群网络、数据管理、监控与日志一、基础名词1.ClusterCluster是计算、存储、网络资源的集合,利用资源运行各种基于容器的应用2.MasterMaster是Cluster的核心,负责调度、控制。高可用版本,一般至

Kubernetes(K8s)上使用分布式存储(Distributed Storage)

摘要在Kubernetes(K8s)上使用分布式存储(DistributedStorage)是一种常见的方案,它可以为集群中的应用程序提供持久性和可扩展性。以下是在Kubernetes上使用分布式存储的说明:存储类(StorageClass):首先,你需要创建一个Kubernetes的存储类,用于定义分布式存储的属性和

KubeSphere Namespace 数据删除事故分析与解决全记录

作者:宇轩辞白,运维研发工程师,目前专注于云原生、Kubernetes、容器、Linux、运维自动化等领域。前言2023年7月23日在项目上线前夕,K8s生产环境出现故障,经过紧急修复之后,K8s环境恢复正常;另外我们环境引入了KubeSphere云原生平台技术,为了方便研发人员对于K8s权限的细粒度管理,我方手动将K

K8S的CKA考试环境和题目

CKA考试这几年来虽然版本在升级,但题目一直没有大的变化,通过K8S考试的方法就是在模拟环境上反复练习,通过练习熟悉考试环境和考试过程中可能遇到的坑。这里姚远老师详细向大家介绍一下考试的环境和题目,需要详细资料的同学请在文章后面留言。祝大家考试成功。K8S的考试环境CKA考试环境由三台虚拟机组成,这三台虚拟机姚远老师已

3.k8s dashboard设置域名登录案例(ingress版本为1.3.1)

文章目录前言一、安装ingress1.1下载ingress部署文件1.2查看是否安装成功二、配置dashboard域名映射2.1.在windows和linux添加上域名映射2.2生成tls证书2.3新增ingress配置2.3验证总结前言前面搭建了集群,配置了账号密码登录,现在配置k8sdashboard的域名登录,这

Augmented Large Language Models with Parametric Knowledge Guiding

本文是LLM系列文章,针对《AugmentedLargeLanguageModelswithParametricKnowledgeGuiding》的翻译。参数知识引导下的增强大型语言模型摘要1引言2相关工作3LLM的参数化知识引导4实验5结论摘要大型语言模型(LLM)凭借其令人印象深刻的语言理解和生成能力,显著提高了自

热文推荐