Android关于滚动View标题栏渐变的解决方案
16lz
2021-01-26
这个工具类是在做某电商项目的时候通宵搞出来的,所以分享给各位开发者,避免无效的加班
/** * @文档说明: 处理滚动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);
总结
工具类可以根据自己的业务需求扩展和改动,我只是分享一种思想,要举一反三。
更多相关文章
- 判断Edittext是否为几种空方法
- 布局demo二:shape的使用
- Android(安卓)Material Design系列之CollapsingToolbarLayout
- android动画详解
- android之animation(一)
- [转]Android自定义控件之TextView
- Android(安卓)ListView item 焦点被抢无法点击
- Android(安卓)LayoutInflater的使用
- Android给控件添加触摸回调