美文网首页
代码修改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