欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android给RecyclerView加上折叠的效果示例

程序员文章站 2023-12-17 13:12:04
recyclerview有很高的*度,可以说只有想不到没有做不到,真是越用越喜欢。这次用超简单的方法,让recyclerview带上折叠的效果。 效果是这样的。...

recyclerview有很高的*度,可以说只有想不到没有做不到,真是越用越喜欢。这次用超简单的方法,让recyclerview带上折叠的效果。

效果是这样的。

android给RecyclerView加上折叠的效果示例

总结一下这个列表的特点,就是以下三点:

1. 重叠效果;

2. 层次感;

3. 首项的差动效果。

下面我们来一个个解决。

我们新建一个parallaxrecyclerview,让它继承recyclerview,并使用linearlayoutmanager作为布局管理器。

重叠效果

其实就是每一项都搭一部分在它前面那项而已。我们知道,recyclerview可以通过设置itemdecoration来实现列表的间隔效果,有没有想过要是把间隔设为负数会怎么样?比如:

additemdecoration(new itemdecoration() {
      @override
      public void getitemoffsets(rect outrect, view view, recyclerview parent, state state) {
        super.getitemoffsets(outrect, view, parent, state);
        outrect.bottom = -dp2px(context, 10);
      }
    });

没错,这就实现了我们的重叠效果。

层次感

在material design里是有z轴这个概念的,我们可以给控件设置垂直于屏幕的高度,让不在同一高度的控件看起来有层次感。当然,我们要用material design的控件才有这个属性,这里我用的是cardview。

我们给parallaxrecyclerview增加一个滑动监听,在onscrolled方法里面做如下设置:

linearlayoutmanager layoutmanager = (linearlayoutmanager) recyclerview.getlayoutmanager();
int firstposition = layoutmanager.findfirstvisibleitemposition();
int lastposition = layoutmanager.findlastvisibleitemposition();
int visiblecount = lastposition - firstposition;
//重置控件的高度
int elevation = 1;
for (int i = firstposition - 1; i <= (firstposition + visiblecount) + 1; i++) {
  view view = layoutmanager.findviewbyposition(i);
  if (view != null) {
    if (view instanceof cardview) {
      ((cardview) view).setcardelevation(dp2px(context, elevation));
      elevation += 5;
    }

  }
}

其中,setcardelevation方法就是用来给cardview设置高度的,这里让每一项的高度比它的上一项高5dp。

首项的差动

最后,我们想给第一项增加一个差动效果,这个同样在onscrolled方法里面做处理就好了:

view firstview = layoutmanager.findviewbyposition(firstposition);
float firstviewtop = firstview.gettop();
firstview.settranslationy(-firstviewtop / 2.0f);

这样相当于第一项的滑动速度变成原来的一半。但这也会导致一个问题, 由于改变了控件的位置,当这个控件被复用时,会出现位置不正确的情况。所以我们在设置高度的时候,可以顺便把控件的位置复原了:

 float translationy = view.gettranslationy();
if (i > firstposition && translationy != 0) {
  view.settranslationy(0);
}

这样就完成了一个带有简单折叠效果的recyclerview了,妥妥的。

源码地址:parallaxrecyclerview_jb51.rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

上一篇:

下一篇: