这个工具类是在做某电商项目的时候通宵搞出来的,所以分享给各位开发者,避免无效的加班
/**
* @文档说明: 处理滚动view的渐变效果
* @开发者: 江荣涛
* @创建时间: 2018/6/13 0:34
**/
public class ScrollObservableUtils {
private static int mDistance = 0;
private static int maxDistance = 255;//当距离在[0,255]变化时,透明度在[0,255之间变化]
/**
* RecyclerView 滚动时标题栏的渐变
* @param recyclerView 滚动的控件 RecyclerView
* @param mTargetView 需要设置渐变处理的控件(ToolBar,或者是自定义标题栏的根部局(LinearLayout...))
*/
public static void setRecyclerViewOnScrollListener(RecyclerView recyclerView, final View mTargetView){
mDistance = 0;
maxDistance=255;
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
//dy:每一次竖直滑动增量 向下为正 向上为负
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
mDistance += dy;
if(mDistance>255){
mTargetView.setVisibility(View.GONE);
}else if (mDistance<=255&&mDistance>=0){
mTargetView.setVisibility(View.VISIBLE);
float alpha = mDistance * 1f / maxDistance;//百分比
mTargetView.setAlpha(1-alpha);
}
}
});
}
/**
* ScrollView或者NestedScrollView滚动时标题栏的渐变
* @param context
* @param scrollView
* @param mTargetView 需要设置渐变处理的控件(ToolBar,或者是自定义标题栏的根部局(LinearLayout...))
*/
public static void setNestedScrollViewOnScrollListener(final Activity context, MyNsScrollView scrollView, final View mTargetView){
mDistance = 0;
maxDistance = 375;//可修改
myNsScrollView.setScrollViewListener(new ScrollViewListener() {
@Override
public void onScrollChanged(MyNsScrollView nsScrollView, int x, int y, int oldx, int oldy) {
mDistance += (y-oldy);
mTargetView.setBackgroundResource(R.color.hint_color);
float alpha=0.7f;
if(mDistance>263){
mTargetView.setAlpha(alpha);
StatusBarUtils.setStatusBarColor(context,R.color.hint_color,alpha);
}else if (mDistance<=263&&mDistance>=0){
alpha= mDistance * 1f / maxDistance;//百分比
mTargetView.setAlpha(alpha);
StatusBarUtils.setStatusBarColor(context,R.color.hint_color,alpha);
}
}
});
}
}
由于ScrollView的onScrollChanged是protected 的,所以我新建它的子类去通过回调接口的方式实现该方法,具体代码如下:
/**
* Created by jiangrongtao on 2018/6/12.
*/
public class MyNsScrollView extends NestedScrollView {
private ScrollViewListener scrollViewListener;
public MyNsScrollView(Context context) {
super(context);
}
public MyNsScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyNsScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setScrollViewListener(ScrollViewListener scrollViewListener) {
this.scrollViewListener = scrollViewListener;
}
@Override
protected void onScrollChanged(int x, int y, int oldx, int oldy) {
super.onScrollChanged(x, y, oldx, oldy);
if (scrollViewListener != null) {
scrollViewListener.onScrollChanged(this, x, y, oldx, oldy);
}
}
}
/**
* Created by jiangrongtao on 2018/6/12.
*/
public interface ScrollViewListener {
void onScrollChanged(MyNsScrollView nsScrollView,int x, int y, int oldx, int oldy);
}
准备工作做好以后使用就很方便了,具体如下:
- RecyclerView和ToolBar配合使用(也可以换成自定义标题栏的根视图)
ScrollObservableUtils.setRecyclerViewOnScrollListener(mRecyclerView, toolbar);
2.ScrollView和自定义标题的配合使用(注意:这里的titleName是标题栏布局的根视图)
ScrollObservableUtils.setNestedScrollViewOnScrollListener(this, mScrollView, titleName);
总结
工具类可以根据自己的业务需求扩展和改动,我只是分享一种思想,要举一反三。