安卓RecyclerView万能分割线
来源:互联网 发布:淘宝一键代购 编辑:程序博客网 时间:2024/05/16 13:06
参考后修改的,参考源暂时找不到了,非常感谢大神当年的帮助。
RecyclerView 的分割线可以通过item 布局去画,但是这样效率太低了,想在百度上找一篇用着舒爽的文章又太难了。
下面请看懒人分享第二章:万能分割线。
//使用方法://参数分别是 上下文、宽度、颜色 rvMy.addItemDecoration( new DividerItemDecoration( getMyActivity(), 3, 0xffdddddd) );*****************************************************************//自定义分割public class DividerItemDecoration extends BaseDividerItemDecoration {public DividerItemDecoration(Context context, int lineWidthDp, @ColorInt int colorRGB) { super(context, lineWidthDp, colorRGB); } @Override public boolean[] getItemSidesIsHaveOffsets(int itemPosition) { //顺时针顺序:left, top, right, bottom boolean[] isOffset = {false, false, true, true}; //默认只有bottom显示分割线 return isOffset; }}//工具代码*******************************************************************package com.xdx.hostay.customer;import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.Rect;import android.support.annotation.ColorInt;import android.support.v7.widget.RecyclerView;import android.view.View;/** * Created by biyunlong on 2017/5/17. * Make progress every day */public abstract class BaseDividerItemDecoration extends RecyclerView.ItemDecoration { private Paint mPaint; private int lineWidth;//px 分割线宽 /** * A single color value in the form 0xAARRGGBB. **/ private int colorRGB; public BaseDividerItemDecoration(Context context, float lineWidthDp, @ColorInt int colorRGB) { this.colorRGB = colorRGB;// this.lineWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, lineWidthDp, context.getResources().getDisplayMetrics()); this.lineWidth= (int) lineWidthDp; mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setColor(colorRGB); mPaint.setStyle(Paint.Style.FILL); } public BaseDividerItemDecoration(Context context, int lineWidthDp, @ColorInt int colorRGB) { this.colorRGB = colorRGB; this.lineWidth= lineWidthDp; mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setColor(colorRGB); mPaint.setStyle(Paint.Style.FILL); } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { int childCount1 = parent.getChildCount(); for (int i = 0; i < childCount1; i++) { View child = parent.getChildAt(i); int itemPosition = ((RecyclerView.LayoutParams) child.getLayoutParams()).getViewLayoutPosition(); boolean[] sideOffsetBooleans = getItemSidesIsHaveOffsets(itemPosition); if (sideOffsetBooleans[0]) { drawChildLeftVertical(child, c, parent); } if (sideOffsetBooleans[1]) { drawChildTopHorizontal(child, c, parent); } if (sideOffsetBooleans[2]) { drawChildRightVertical(child, c, parent); } if (sideOffsetBooleans[3]) { drawChildBottomHorizontal(child, c, parent); } } } private void drawChildBottomHorizontal(View child, Canvas c, RecyclerView parent) { RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); int left = child.getLeft() - params.leftMargin - lineWidth; int right = child.getRight() + params.rightMargin + lineWidth; int top = child.getBottom() + params.bottomMargin; int bottom = top + lineWidth; c.drawRect(left, top, right, bottom, mPaint); } private void drawChildTopHorizontal(View child, Canvas c, RecyclerView parent) { RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); int left = child.getLeft() - params.leftMargin - lineWidth; int right = child.getRight() + params.rightMargin + lineWidth; int bottom = child.getTop() - params.topMargin; int top = bottom - lineWidth; c.drawRect(left, top, right, bottom, mPaint); } private void drawChildLeftVertical(View child, Canvas c, RecyclerView parent) { RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); int top = child.getTop() - params.topMargin - lineWidth; int bottom = child.getBottom() + params.bottomMargin + lineWidth; int right = child.getLeft() - params.leftMargin; int left = right - lineWidth; c.drawRect(left, top, right, bottom, mPaint); } private void drawChildRightVertical(View child, Canvas c, RecyclerView parent) { RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); int top = child.getTop() - params.topMargin - lineWidth; int bottom = child.getBottom() + params.bottomMargin + lineWidth; int left = child.getRight() + params.rightMargin; int right = left + lineWidth; c.drawRect(left, top, right, bottom, mPaint); } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { //outRect 看源码可知这里只是把Rect类型的outRect作为一个封装了left,right,top,bottom的数据结构, //作为传递left,right,top,bottom的偏移值来用的 int itemPosition = ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition(); // boolean[] sideOffsetBooleans = getItemSidesIsHaveOffsets(itemPosition); int left = sideOffsetBooleans[0] ? lineWidth : 0; int top = sideOffsetBooleans[1] ? lineWidth : 0; int right = sideOffsetBooleans[2] ? lineWidth : 0; int bottom = sideOffsetBooleans[3] ? lineWidth : 0; outRect.set(left, top, right, bottom); } /** * 顺序:left, top, right, bottom * * @return boolean[4] */ public abstract boolean[] getItemSidesIsHaveOffsets(int itemPosition);}
阅读全文
1 0
- 安卓RecyclerView万能分割线
- RecyclerView万能分割线
- RecyclerView万能分割线
- RecyclerView的万能分割线
- RecyclerView的万能分割线
- RecyclerView的万能分割线
- Android RecyclerView万能分割线
- RecyclerView的万能分割线
- RecyclerView的万能分割线
- Android Recyclerview 万能分割线
- RecyclerView的万能分割线
- RecyclerView万能的分割线
- RecyclerView的万能分割线
- RecyclerView分割线——万能分割线
- RecyclerView GridLayoutManager 设置分割线 万能分割
- RecyclerView的自定义万能分割线
- 一个Android RecyclerView万能分割线
- RecyclerView万能适配器,点击事件,分割线,间距等写法
- Educational Codeforces Round 34 (Rated for Div. 2) D
- fhs文件系统层级结构
- 第四周实践项目4 建立算法库——双链表
- 基于ASP.NET框架MVC模式添加控制器Controller时的异常:“无法检索"xxx.xxx.xxx " 的元数据。请求找不到.Net Framework Data Pr”
- 假如时光倒流,我会这么学习Java
- 安卓RecyclerView万能分割线
- STM32核心板&底板&程序项目
- Java String中"+"号的理解
- (7)Zookeeper 3.4.9 伪分布安装
- 《Java虚拟机原理图解》 1.2 Class文件中的常量池详解
- Unity Shaders and Effects Cookbook中的Photoshop levels effect
- android从本地相册选择图片uri三星手机适配问题
- postgresql全文检索部署实施
- 产品质量、关键件追溯解决方案