这个工具类是在做某电商项目的时候通宵搞出来的,所以分享给各位开发者,避免无效的加班

/** * @文档说明:  处理滚动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);}

准备工作做好以后使用就很方便了,具体如下:

  1. RecyclerView和ToolBar配合使用(也可以换成自定义标题栏的根视图)
 ScrollObservableUtils.setRecyclerViewOnScrollListener(mRecyclerView, toolbar);

2.ScrollView和自定义标题的配合使用(注意:这里的titleName是标题栏布局的根视图

 ScrollObservableUtils.setNestedScrollViewOnScrollListener(this, mScrollView, titleName);

总结

      工具类可以根据自己的业务需求扩展和改动,我只是分享一种思想,要举一反三。

更多相关文章

  1. 判断Edittext是否为几种空方法
  2. 布局demo二:shape的使用
  3. Android(安卓)Material Design系列之CollapsingToolbarLayout
  4. android动画详解
  5. android之animation(一)
  6. [转]Android自定义控件之TextView
  7. Android(安卓)ListView item 焦点被抢无法点击
  8. Android(安卓)LayoutInflater的使用
  9. Android给控件添加触摸回调

随机推荐

  1. android 获取本地存储文件是否在某一段时
  2. android InputStream中read()与read(byte
  3. Android(安卓)开发事件响应之基于监听的
  4. android 自定义view之侧滑效果
  5. Android全局异常捕获并弹窗提示
  6. 各位大佬都是怎么开发调试系统应用的
  7. android如何通过代码来获取每个应用访问
  8. Android实现一键清除输入内容和震动效果
  9. Freeline快速集成
  10. Android实现关机与重启的几种方式(推荐)