Android关于滚动View标题栏渐变的解决方案

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Jiang_Rong_Tao/article/details/81560026

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

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

总结

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

猜你喜欢

转载自blog.csdn.net/Jiang_Rong_Tao/article/details/81560026