美文网首页
代码修改RecyclerView的scrollbar颜色

代码修改RecyclerView的scrollbar颜色

作者: zxq_kyle | 来源:发表于2018-07-25 11:29 被阅读0次

    问题:

    因为使用了哔哩哔哩的主题框架,所以需要动态修改RecyclerView的scrollbar颜色,但是scrollbar是view的私有内部类,只能在xml中配置。如下图

    image

    解决方法:

    查看源码,通过反射获取scrollbar的drawable,然后用框架着色

    public static void tintScrollbarColor(Context context, RecyclerView recyclerView) {
            try {
                //通过反射一层层的获取对象,直到获取到进度条
                Class<View> clazz = View.class;
                Method method = clazz.getDeclaredMethod("getScrollCache");
                method.setAccessible(true);
                Object scrollabilityCacheObj = method.invoke(recyclerView);
                Class<?> scrollabilityCacheClazz = scrollabilityCacheObj.getClass();
                Field scrollBarField = scrollabilityCacheClazz.getField("scrollBar");
    
                Object scrollbarObj = scrollBarField.get(scrollabilityCacheObj);
                Class<?> scrollbarClass = scrollbarObj.getClass();
    
                Field mVerticalThumbField = scrollbarClass.getDeclaredField("mVerticalThumb");
                Field mHorizontalThumbField = scrollbarClass.getDeclaredField("mHorizontalThumb");
                mVerticalThumbField.setAccessible(true);
                mHorizontalThumbField.setAccessible(true);
                Drawable mVerticalThumb = (Drawable) mVerticalThumbField.get(scrollbarObj);
                Drawable mHorizontalThumb = (Drawable) mHorizontalThumbField.get(scrollbarObj);
                //对显示的drawable着色
                Drawable mVerticalThumbTint = ThemeUtils.tintDrawable(mVerticalThumb, 
                                  ThemeUtils.getColorById(context, R.color.theme_color_primary));
                Drawable mHorizontalThumbTint = ThemeUtils.tintDrawable(mHorizontalThumb, 
                                  ThemeUtils.getColorById(context, R.color.theme_color_primary));
                //设置新的drawable
                mVerticalThumbField.set(scrollbarObj, mVerticalThumbTint);
                mHorizontalThumbField.set(scrollbarObj, mHorizontalThumbTint);
            } catch (Exception e) {
                e.printStackTrace();
            }
    }
    

    相关文章

      网友评论

          本文标题:代码修改RecyclerView的scrollbar颜色

          本文链接:https://www.haomeiwen.com/subject/gqhpmftx.html