使用RecyclerView滑动时设置标题栏渐变或隐藏效果

上次自己做了个简单的RecyclerView+SwipeRefrashLayou滑动demo,做完后又给加了个隐藏的效果。
需要学习RecyclerView的请查看我上篇博客http://www.jianshu.com/p/68777233c6db
demo源码在:https://github.com/wapchief/android-CollectionDemo

看一下效果图。
wapchief.gif
这样设计有利于发挥手机屏幕的利用空间,如果首页内容较多的时候,不影响体验。
所有的操作都是在RecyclerView监听方法的onScrolled方法里实现。
直接看该方法的官方介绍:

        /**
         * Callback method to be invoked when the RecyclerView has been scrolled. This will be
         * called after the scroll has completed.
         * <p>
         * This callback will also be called if visible item range changes after a layout
         * calculation. In that case, dx and dy will be 0.
         *
         * @param recyclerView The RecyclerView which scrolled.
         * @param dx The amount of horizontal scroll.
         * @param dy The amount of vertical scroll.
         */
        public void onScrolled(RecyclerView recyclerView, int dx, int dy){}
    }

意思是说放Recyclerview发生滚动的时候,该方法一直被调用。所有因滚动所产生的状态改变都在这里实现。
所以因滚动产生的视图状态改变也在这个方法内。
上篇文章,在该方法内实现滚动到底部自动加载的方法,思路是一个页面内item的个数,当加载完后,就执行再加载一条数据。


现在我们要获取滑动的距离
怎么做?
onScrolled提供了一个dx,dy的方法。
但是该方法只能判定一次性滑动的距离,dx是横向,dy是纵向。
而且默认停滞状态距离是0,如果要向上返回滑动,那么就会变成负数。也就是每一次滑动,只要停滞,距离都会重新计算。
所以我们只能重新定义一个方法,用来计算整体滑动的距离

   public int getScollYDistance() {
        int position = layoutManager.findFirstVisibleItemPosition();
        View firstVisiableChildView = layoutManager.findViewByPosition(position);
        int itemHeight = firstVisiableChildView.getHeight();
        return (position) * itemHeight - firstVisiableChildView.getTop();
    }

LinearLayoutManager提供了获取第一条item可见位置的方法。
然后通过findviewby实例化。
然后再用getHeight获取item的高度。
最后计算得出实际的child。

获取了child之后,我们就可以在onScolled方法根据距离进行操作

if (getScollYDistance() <= 0) {
            //静止并处于最顶端状态
            tvTitle.setBackgroundColor(black_transparent);
            tvTitle.setTextColor(white);
            tvTitle.setVisibility(View.VISIBLE);
        } else if (getScollYDistance() > 0 && getScollYDistance() <= 400) {//滑动在0-400距离的时候
            if (getScollYDistance() <= 200) {//处于滑动到中间的时候
                tvTitle.setTextColor(blue);
            } else {//滑出到200以外
//                tvTitle.setBackgroundColor(Color.argb((int) 255, 254, 184, 6));
                tvTitle.setTextColor(white);
            }
            float scale = (float) getScollYDistance() / 400;
            float alpha = (255 * scale);
            // 只是layout背景透明(仿知乎滑动效果)
            tvTitle.setBackgroundColor(Color.argb((int) alpha, 254, 184, 6));
        } else {
            tvTitle.setVisibility(View.GONE);
        }

这里的数值是以像素px为单位。在这里可以根据距离在指定的位置设置想要的效果。
其中

            float scale = (float) getScollYDistance() / 400;
            float alpha = (255 * scale);
            // 只是layout背景透明(仿知乎滑动效果)
            tvTitle.setBackgroundColor(Color.argb((int) alpha, 254, 184, 6));

就是设置从全部到透明的方法。或者是反过来。


具体需要什么效果自己diy吧。项目我发到了github,欢迎star
https://github.com/wapchief/android-CollectionDemo
新手上路欢迎指导!

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值