栗子——ListView+Head滑动显示标题

项目里的效果拎出来做了个栗子,拿来和大家一起分享,一个很简单的栗子,不喜勿喷~
栗子——ListView+Head滑动显示标题
文章图片
栗子配图.png
栗子惯例,先上GIF
栗子——ListView+Head滑动显示标题
文章图片
栗子.gif
代码分析
其实核心的地方也是获取ListView的垂直滚动距离,在获取到滚动距离以后,根据垂直滚动距离来设置标题栏的背景透明度。
参考代码:感谢作者~ListView 获取精确的垂直滚动距离,但是有个BUG,待会说,代码中也会标明,不用担心错过BUG~
activity_main.xml

说明:主布局很简单,布局选用FrameLayout,让标题栏在ListView的上方~
MainActivity.java核心代码
private SparseArray recordSp = new SparseArray(0); private int mCurrentfirstVisibleItem = 0; //设置标题背景透明 rlTitle.getBackground().setAlpha(0); //滑动监听,注意implements OnScrollListener lvTitleFade.setOnScrollListener(this); @Override public void onScrollStateChanged(AbsListView view, int scrollState) {} //滑动事件处理 @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //firstVisibleItem--处于顶部的Item标记 //visibleItemCount--当前可见item数 //totalItemCount----总item数 mCurrentfirstVisibleItem = firstVisibleItem; View firstView = view.getChildAt(0); if (null != firstView) { ItemRecod itemRecord = (ItemRecod) recordSp.get(firstVisibleItem); if (null == itemRecord) { itemRecord = new ItemRecod(); } itemRecord.height = firstView.getHeight(); //获取最顶部Item的高度 itemRecord.top = firstView.getTop(); //获取距离顶部的距离 recordSp.append(firstVisibleItem, itemRecord); //设置值 } Log.d("dmdrs", "滑动距离:" + getScrollY()); int ScrollY = getScrollY(); if (ScrollY >= 0 && ScrollY <= 255) { //设置标题栏透明度0~255 rlTitle.getBackground().setAlpha(ScrollY); } else if (ScrollY > 255) { //滑动距离大于255就设置为不透明 rlTitle.getBackground().setAlpha(255); } }private int getScrollY() { int height = 0; for (int i = 0; i < mCurrentfirstVisibleItem; i++) { ItemRecod itemRecod = (ItemRecod) recordSp.get(i); Log.d("dmdrs", "xxx1:" + itemRecod); //06-07 21:00:21.601: D/dmdrs(23096): xxx1: //com.dmdrs.titlefade.MainActivity$ItemRecod@529122fc //06-07 21:00:21.601: D/dmdrs(23096): xxx2:300 //06-07 21:00:21.601: D/dmdrs(23096): xxx1:null //快速滑动会为空,判断一下,发现的bug if(itemRecod != null){ height += itemRecod.height; } Log.d("dmdrs", "xxx2:" + height); } ItemRecod itemRecod = (ItemRecod) recordSp.get(mCurrentfirstVisibleItem); if (null == itemRecod) { itemRecod = new ItemRecod(); } return height - itemRecod.top; }class ItemRecod { int height = 0; int top = 0; }

【栗子——ListView+Head滑动显示标题】说明:
①设置标题背景透明为完全透明
②设置监听ListView的滑动事件
③在onScroll里来获取当前Item的参数,设置到SparseArray中,然后调用getScrollY方法来计算滑动距离并返回参数,然后根据距离来设置rlTitle的透明度。
总结:就上面这点了,代码不很多,但实现了想要的效果。在撸代码的过程中也发现了个小BUG,在快速滑动ListView的时候itemRecod会出现为null的情况。这个BUG出现是因为滑动过快,导致值还没有设置进去,就在取值,所以出现了null的情况,导致空指针错误。目前解决办法是加了个if判断null解决了这个小BUG,如果有好的解决方式请留言交流,谢谢~~
未经本人允许禁止转载,违者必究
:www.jianshu.com/u/3d2770e6e489
欢迎加入QQ交流群657206000点我加入
栗子——ListView+Head滑动显示标题
文章图片
QQ交流群:657206000

    推荐阅读