实现滚动隐藏header的layout

最近薄荷新版加入了圈子的功能,圈子主页效果图如下:

image

往上滑可以隐藏header,将4个tab停留在顶部,往下滑又可以展开header,其中tab里的内容还可以实现下拉刷新,上拉加载更多

第一个想到的是外面包一层StickyScrollViewItems,可以很快的实现tab的悬浮,但是刷新的操作就必须放在外面了,于是又外面套了层swiperefreshlayout实现刷新,由于下面的tab有两个需要刷新,所以处理起来非常麻烦的,再加上scrollview+viewpager+listview的嵌套会出现各种冲突,所以这种思路从一开始就是个错误。于是想想有没有能实现滚动隐藏header的layout的呢?于是上github一搜,果然有类似效果的开源项目,那就是接下来要介绍的ViewPagerHeaderScrollDemo

实现原理

通过自定义TouchCallbackLayout,这个类继承自FrameLayout,在里边放置一个ViewPager和一个header+tab的layout,给ViewPager设定一个marginTop的高度,这个高度也就是tab栏的高度,通过计算ViewPager中fragment的滑动来控制header的现实与隐藏

fragment是怎么控制header的显示与隐藏的呢?总不能只要上滑就就隐藏,下滑就显示吧,这样如果fragment是一个很长的列表,当我滑到中间,再往下滑,这个时候我并不想看到header,我想看完列表中间以上的部分后再看到header怎么办?

这里定义一个接口

public interface ScrollableListener {
    //判断其是否可以显示header
    public boolean isViewBeingDragged(MotionEvent event);
}

所有的fragment都要实现这个接口,作者已经实现fragment是如下两个类型的判断,ListView(AbsListViewDelegate)和ScrollView(ScrollViewDelegate),基本已经满足大部分需求了,如果是WebView,可以在外面套一层ScrollView实现判断

Scrollable

就在不久前,github又有一个可以实现类似效果的开源库:Scrollable,大概看了下它的源码,实现思路跟上面介绍的很相似,只是在代码层面,Scrollable封装的更好些,作者也提供了gradle依赖,使用起来更方便!