• RecyclerView滑动时添加缩放效果


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

    我实现的效果

    基本上是已经实现了头像无限滚动中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重新进行布局

    1. layoutDecorated(
    2. child,
    3. frame.left - mOffsetAll,
    4. frame.top,
    5. frame.right - mOffsetAll,
    6. frame.bottom
    7. )

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

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

    1. val displayFrame = Rect(
    2. mOffsetAll, 0, mOffsetAll + horizontalSpace,
    3. verticalSpace
    4. )
    5. var position = 0
    6. for (i in 0 until childCount) {
    7. var child = getChildAt(i)
    8. 。。。。。。。
    9. }
    10. val rect = getFrame(position)
    11. if (!Rect.intersects(displayFrame, rect)) {
    12. child?.let { removeAndRecycleView(it, recycler!!) } //回收滑出屏幕的View
    13. mHasAttachedItems.delete(position)
    14. } else { //Item还在显示区域内,更新滑动后Item的位置
    15. child?.let { layoutItem(it, rect) } //更新Item位置
    16. mHasAttachedItems.put(position, true)
    17. }
    18. }
    19. //开始滚动后对child重新测量,并layout
    20. measureChildWithMargins(scrap, 0, 0)
    21. addView(scrap)
    22. //修正偏移量后对child重新布置
    23. layoutDecorated(
    24. child,
    25. frame.left - mOffsetAll,
    26. frame.top,
    27. frame.right - mOffsetAll,
    28. frame.bottom
    29. )
    30. //addAnimation 实现缩放效果

    默认向左滚动,如下图

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

    此Demo下载地址 Demo地址

  • 相关阅读:
    Python基础学习
    Android学习笔记 29. Activity组件
    【LeetCode力扣】LCR170 使用归并排序的思想解决逆序对问题(详细图解)
    C学生管理系统 头添加学生节点
    求最长的只包含两种类型的连续子数组的最大长度
    简单说说量化交易接口有哪些用途?
    DDD/ABP/EF Core :新特性Owned Entity Types ,尝试另外一种值对象的配置方式
    浅谈霍尔电流传感器在汽车电池管理系统中的应用
    Spring事务和事务的传播机制(JavaEE进阶系列7)
    汽车租赁管理系统的设计与实现(JSP+SqlServer在线租车网站)
  • 原文地址:https://blog.csdn.net/oqzuser1q2w3e4r5t/article/details/133011975