效果
这里拿淘宝举例说明,效果相同
滑动RecycleView改变标题透明度
实现思路
这里思路很简单,通过监听item距离顶部的位置,进行相应的透明度改变。但是,坑很深。
监听滑动我们会首先想到通过RecyclerView.addOnScrollListener()实现,并且在onScrolled()方法中可以拿到滑动的距离dy。
然而却没有那么简单,很多情况下dy的值是不准确的,而且当我们通过RecyclerView.ScrollTo()进行自动滑动时,也是捕获不到的。
解决方案是什么么?通过观察者模式可以准确捕获到滑动
mRecyclerView.getViewTreeObserver().addOnScrollChangedListener()
然后通过这种方式捕获我们需要的item位置,通过该位置距离的判断改变Tab的透明度,具体代码实现如下:
addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
@Override
public void onScrollChanged () {
//控制tab透明度
if (layoutManager.findFirstVisibleItemPosition() == 0) {
mDistanceY = -mRecyclerView.getChildAt(0).getTop();
//完全变色的高度
int changeHeight = UIUtils.dip2px(35);
//当滑动的距离 <= toolbar高度的时候,改变Toolbar背景色的透明度,达到渐变的效果
if (mDistanceY <= changeHeight) {
float alpha = (float) mDistanceY / changeHeight;
indicator.setAlpha(alpha);
if (alpha < 0.01) {
indicator.setEnabled(false);
} else {
indicator.setEnabled(true);
}
} else {
//将标题栏的颜色设置为完全不透明状态
indicator.setAlpha(1);
indicator.setEnabled(true);
}
} else {
if (indicator.getAlpha() != 1f) {
//将标题栏的颜色设置为完全不透明状态
indicator.setAlpha(1);
indicator.setEnabled(true);
}
}
}
});
这里实现方式很简单,只是通过addListener的方式滑动距离不准确以及捕获不到ScrollTo()和ScrollBy()的坑比较大,耽误了很久时间。
网友评论