本文参考了孤调的文章,链接如下:
https://www.jianshu.com/p/67e1df2b1920
基本实现了拖动的需求,但是还有一个问题就是滚动条的宽度跟需求不符,需要进行修改.但是官方并未提供相应的参数.自己动手丰衣足食,开始撸源码.
打开RecyclerView类,搜索fastScrollEnabled,定位到构造方法中的
mEnableFastScroller = a.getBoolean(R.styleable.RecyclerView_fastScrollEnabled, false);
if (mEnableFastScroller) {StateListDrawable verticalThumbDrawable = (StateListDrawable) a.getDrawable(R.styleable.RecyclerView_fastScrollVerticalThumbDrawable);Drawable verticalTrackDrawable = a.getDrawable(R.styleable.RecyclerView_fastScrollVerticalTrackDrawable);StateListDrawable horizontalThumbDrawable = (StateListDrawable) a.getDrawable(R.styleable.RecyclerView_fastScrollHorizontalThumbDrawable);Drawable horizontalTrackDrawable = a.getDrawable(R.styleable.RecyclerView_fastScrollHorizontalTrackDrawable);initFastScroller(verticalThumbDrawable, verticalTrackDrawable,horizontalThumbDrawable, horizontalTrackDrawable);}
可以看到如果mEnableFastScroller 为true会进入initFastScroller方法,我们在xml文件中设置的thumbDrawable和TrackDrawable被作为参数传入了此方法.点击进入此方法:
void initFastScroller(StateListDrawable verticalThumbDrawable,Drawable verticalTrackDrawable, StateListDrawable horizontalThumbDrawable,Drawable horizontalTrackDrawable) {if (verticalThumbDrawable == null || verticalTrackDrawable == null|| horizontalThumbDrawable == null || horizontalTrackDrawable == null) {throw new IllegalArgumentException("Trying to set fast scroller without both required drawables." + exceptionLabel());}Resources resources = getContext().getResources();new FastScroller(this, verticalThumbDrawable, verticalTrackDrawable,horizontalThumbDrawable, horizontalTrackDrawable,resources.getDimensionPixelSize(R.dimen.fastscroll_default_thickness),resources.getDimensionPixelSize(R.dimen.fastscroll_minimum_range),resources.getDimensionPixelOffset(R.dimen.fastscroll_margin));}
最后一段(最后5行)代码创建了一个FastScroller,并将ThumbDrawable,TrackDrawable作为参数传入,此外还传入了一些dimens资源,最后点击这个FastScroller类:
FastScroller(RecyclerView recyclerView, StateListDrawable verticalThumbDrawable,Drawable verticalTrackDrawable, StateListDrawable horizontalThumbDrawable,Drawable horizontalTrackDrawable, int defaultWidth, int scrollbarMinimumRange,int margin) {mVerticalThumbDrawable = verticalThumbDrawable;mVerticalTrackDrawable = verticalTrackDrawable;mHorizontalThumbDrawable = horizontalThumbDrawable;mHorizontalTrackDrawable = horizontalTrackDrawable;mVerticalThumbWidth = Math.max(defaultWidth, verticalThumbDrawable.getIntrinsicWidth());mVerticalTrackWidth = Math.max(defaultWidth, verticalTrackDrawable.getIntrinsicWidth());mHorizontalThumbHeight = Math.max(defaultWidth, horizontalThumbDrawable.getIntrinsicWidth());mHorizontalTrackHeight = Math.max(defaultWidth, horizontalTrackDrawable.getIntrinsicWidth());
mScrollbarMinimumRange = scrollbarMinimumRange;mMargin = margin;mVerticalThumbDrawable.setAlpha(SCROLLBAR_FULL_OPAQUE);mVerticalTrackDrawable.setAlpha(SCROLLBAR_FULL_OPAQUE);mShowHideAnimator.addListener(new AnimatorListener());mShowHideAnimator.addUpdateListener(new AnimatorUpdater());attachToRecyclerView(recyclerView);}
bingo!这正是我们要找的类,如下代码设置了滑块和滑轨的宽度:
mVerticalThumbWidth = Math.max(defaultWidth, verticalThumbDrawable.getIntrinsicWidth());mVerticalTrackWidth = Math.max(defaultWidth, verticalTrackDrawable.getIntrinsicWidth());
从上面的代码可以看出,滑动条的宽度采用了defaultWidth和Drawable.getIntrinsicWidth()的最大值,即fastscroll_default_thickness和Drawable宽度的最大值,但因为我的项目中用的是shape, 没有设置宽度,所以只要设置fastscroll_default_thickness即可.
在自己的dimens文件中设置R.dimen.fastscroll_default_thickness这个值,运行,效果如丝般润滑.
最后发个福利~~