本人新手,写这个博客主要给自己看,有什么错误的地方 ,还望指正,不喜勿喷。
import android.graphics.Canvas; import android.graphics.Paint; import android.support.v7.widget.RecyclerView; import android.view.View; public class MyItemDecoration extends RecyclerView.ItemDecoration { @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { //先初始化一个Paint来简单指定一下Canvas的颜色,就黑的吧! 这个地方我们可以设置 paint 的 颜色大小 Paint paint = new Paint(); paint.setStrokeWidth(20); paint.setColor(parent.getContext().getResources().getColor(R.color.hongse)); // 获得RecyclerView中总条目数量 int childCount = parent.getChildCount(); //遍历一下 for (int i = 0; i < childCount; i++) { if (i == 0) { //如果是第一个条目,那么我们就不画边框了 continue; } // 获得子View,也就是一个条目的View,准备给他画上边框 View childView = parent.getChildAt(i); //先获得子View的长宽,以及在屏幕上的位置,方便我们得到边框的具体坐标 float x = childView.getX(); float y = childView.getY(); int width = childView.getWidth(); int height = childView.getHeight(); //根据这些点画条目的四周的线 c.drawLine(x, y, x + width, y, paint); c.drawLine(x, y, x, y + height, paint); c.drawLine(x + width, y, x + width, y + height, paint); c.drawLine(x, y + height, x + width, y + height, paint); //当然了,这里大家肯定是要根据自己不同的设计稿进行画线,或者画一些其他的东西,都可以在这里搞,非常方便 } super.onDraw(c, parent, state); } }
第二种也是找 别人的
import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.DashPathEffect; import android.graphics.NinePatch; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PathEffect; import android.graphics.Rect; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import java.util.regex.Pattern; public class RecyclerViewItemDecoration extends RecyclerView.ItemDecoration { /**mode for direction*/ public static final int MODE_HORIZONTAL = 0; public static final int MODE_VERTICAL = 1; public static final int MODE_GRID = 2; /**default decoration thick size */ private final int DEFAULT_SIZE = 1; /**default decoration color*/ private final String DEFAULT_COLOR = "#bdbdbd"; /**image resource id for R.java*/ private int drawableRid = 0; /**decoration color*/ private int color = Color.parseColor(DEFAULT_COLOR); /**decoration thick size*/ private int thick; /**decoration dash with*/ private int dashWidth = 0; /**decoration dash gap*/ private int dashGap = 0; /**direction mode for decoration*/ private int recyclerviewMode; private Paint paint; private Bitmap bmp; private NinePatch ninePatch; /**sign for if the resource image is a ninepatch image*/ private Boolean hasNinePatch = false; public RecyclerViewItemDecoration(int recyclerviewMode, Context context, int drawableRid){ this.recyclerviewMode = recyclerviewMode; this.drawableRid = drawableRid; this.bmp = BitmapFactory.decodeResource(context.getResources(), drawableRid); if(bmp.getNinePatchChunk()!=null){ hasNinePatch = true; ninePatch = new NinePatch(bmp, bmp.getNinePatchChunk(), null); } initPaint(); } public RecyclerViewItemDecoration(int recyclerviewMode, int color, int thick, int dashWidth, int dashGap){ this.recyclerviewMode = recyclerviewMode; this.color = color; this.thick = thick; this.dashWidth = dashWidth; this.dashGap = dashGap; initPaint(); } public RecyclerViewItemDecoration(int recyclerviewMode, String color, int thick, int dashWidth, int dashGap){ this.recyclerviewMode = recyclerviewMode; if(isColorString(color)){ this.color = Color.parseColor(color); }else{ this.color = Color.parseColor(DEFAULT_COLOR); } this.thick = thick; this.dashWidth = dashWidth; this.dashGap = dashGap; initPaint(); } private void initPaint(){ paint = new Paint(); paint.setColor(color); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(thick); } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { paint.setColor(color); if(recyclerviewMode == MODE_HORIZONTAL){ drawHorinzonal(c,parent); }else if(recyclerviewMode == MODE_VERTICAL){ drawVertical(c,parent); }else if(recyclerviewMode == MODE_GRID){ drawGrid(c,parent); } } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { if(recyclerviewMode == MODE_HORIZONTAL && parent.getChildLayoutPosition(view)!=parent.getAdapter().getItemCount()-1){ if(drawableRid!=0){ outRect.set(0,0,0,bmp.getHeight()); }else{ outRect.set(0,0,0,thick); } }else if(recyclerviewMode == MODE_VERTICAL && parent.getChildLayoutPosition(view)!=parent.getAdapter().getItemCount()-1){ if(drawableRid!=0){ outRect.set(0,0,bmp.getWidth(),0); }else{ outRect.set(0,0,thick,0); } }else if(recyclerviewMode == MODE_GRID){ int columnSize = ((GridLayoutManager)parent.getLayoutManager()).getSpanCount(); int itemSzie = parent.getAdapter().getItemCount(); if(drawableRid!=0){ if(isLastRowGrid(parent.getChildLayoutPosition(view),itemSzie,columnSize) && isLastGridColumn(parent.getChildLayoutPosition(view),columnSize)){ outRect.set(0,0,0,0); }else if(isLastRowGrid(parent.getChildLayoutPosition(view),itemSzie,columnSize)){ outRect.set(0,0,bmp.getWidth(),0); }else if((parent.getChildLayoutPosition(view)+1)%columnSize!=0){ outRect.set(0,0,bmp.getWidth(),bmp.getHeight()); }else { outRect.set(0, 0, 0, bmp.getHeight()); } }else{ if(isLastRowGrid(parent.getChildLayoutPosition(view),itemSzie,columnSize) && isLastGridColumn(parent.getChildLayoutPosition(view),columnSize)){ outRect.set(0,0,0,0); }else if(isLastRowGrid(parent.getChildLayoutPosition(view),itemSzie,columnSize)){ outRect.set(0,0,thick,0); }else if((parent.getChildLayoutPosition(view)+1)%columnSize!=0){ outRect.set(0,0,thick,thick); }else{ outRect.set(0,0,0,thick); } } } } /** * judge is a color string like #xxxxxx or #xxxxxxxx * @param colorStr * @return */ private boolean isColorString(String colorStr){ return Pattern.matches("^#([0-9a-fA-F]{6}||[0-9a-fA-F]{8})$",colorStr); } /** * draw horizonal decoration * @param c * @param parent */ private void drawHorinzonal(Canvas c,RecyclerView parent){ int childrentCount = parent.getChildCount(); if(drawableRid!=0){ if(hasNinePatch) { for(int i=0;i<childrentCount;i++) { if (i != childrentCount - 1) { View childView = parent.getChildAt(i); int myY = childView.getBottom(); Rect rect = new Rect(0, myY, parent.getWidth(), myY+bmp.getHeight()); ninePatch.draw(c, rect); } } }else { for(int i=0;i<childrentCount;i++) { if (i != childrentCount - 1) { View childView = parent.getChildAt(i); int myY = childView.getBottom(); c.drawBitmap(bmp,0,myY,paint); } } } }else if(dashWidth ==0 && dashGap==0){ for(int i=0;i<childrentCount;i++) { if (i != childrentCount - 1) { View childView = parent.getChildAt(i); int myY = childView.getBottom() + thick / 2; c.drawLine(0,myY,parent.getWidth(),myY,paint); } } }else{ PathEffect effects = new DashPathEffect(new float[]{0,0,dashWidth,thick},dashGap); paint.setPathEffect(effects); for(int i=0;i<childrentCount;i++) { if (i != childrentCount - 1) { View childView = parent.getChildAt(i); int myY = childView.getBottom() + thick / 2; Path path = new Path(); path.moveTo(0, myY); path.lineTo(parent.getWidth(),myY); c.drawPath(path, paint); } } } } /** * draw vertival decoration * @param c * @param parent */ private void drawVertical(Canvas c,RecyclerView parent){ int childrentCount = parent.getChildCount(); if(drawableRid!=0){ if(hasNinePatch){ for(int i=0;i<childrentCount;i++) { if (i != childrentCount-1) { View childView = parent.getChildAt(i); int myX = childView.getRight(); Rect rect = new Rect(myX, 0, myX+bmp.getWidth(), parent.getHeight()); ninePatch.draw(c, rect); } } }else{ for(int i=0;i<childrentCount;i++) { if (i != childrentCount-1) { View childView = parent.getChildAt(i); int myX = childView.getRight(); c.drawBitmap(bmp,myX,0,paint); } } } } else if(dashWidth ==0 && dashGap==0){ for(int i=0;i<childrentCount;i++) { if (i != childrentCount-1) { View childView = parent.getChildAt(i); int myX = childView.getRight()+thick/2; c.drawLine(myX,0,myX,parent.getHeight(),paint); } } }else{ PathEffect effects = new DashPathEffect(new float[]{0,0,dashWidth,thick},dashGap); paint.setPathEffect(effects); for(int i=0;i<childrentCount;i++) { if (i != childrentCount-1) { View childView = parent.getChildAt(i); int myX = childView.getRight()+thick/2; Path path = new Path(); path.moveTo(myX, 0); path.lineTo(myX,parent.getHeight()); c.drawPath(path, paint); } } } } /** * 鐢荤綉鏍煎垎鍓茬嚎 * @param c * @param parent */ private void drawGrid(Canvas c,RecyclerView parent){ int childrentCount = parent.getChildCount(); int columnSize = ((GridLayoutManager)parent.getLayoutManager()).getSpanCount(); int adapterChildrenCount = parent.getAdapter().getItemCount(); if(drawableRid!=0){ if(hasNinePatch){ for(int i=0;i<childrentCount;i++) { View childView = parent.getChildAt(i); int myX = childView.getRight(); int myY = childView.getBottom(); //horizonal if(!isLastRowGrid(i,adapterChildrenCount,columnSize)){ Rect rect = new Rect(0, myY, myX, myY+bmp.getHeight()); ninePatch.draw(c, rect); } //vertical if(isLastRowGrid(i,adapterChildrenCount,columnSize) && !isLastGridColumn(i,columnSize)){ Rect rect = new Rect(myX, childView.getTop(), myX+bmp.getWidth(), myY); ninePatch.draw(c, rect); }else if(!isLastGridColumn(i,columnSize)){ Rect rect = new Rect(myX, childView.getTop(), myX+bmp.getWidth(), myY+bmp.getHeight()); ninePatch.draw(c, rect); } } }else{ for(int i=0;i<childrentCount;i++) { View childView = parent.getChildAt(i); int myX = childView.getRight(); int myY = childView.getBottom(); //horizonal if(!isLastRowGrid(i,adapterChildrenCount,columnSize)){ c.drawBitmap(bmp,childView.getLeft(),myY,paint); } //vertical if(!isLastGridColumn(i,columnSize)){ c.drawBitmap(bmp,myX,childView.getTop(),paint); } } } } else if(dashWidth ==0 && dashGap==0){ for(int i=0;i<childrentCount;i++) { View childView = parent.getChildAt(i); int myX = childView.getRight()+thick/2; int myY = childView.getBottom() + thick / 2; //horizonal if(!isLastRowGrid(i,adapterChildrenCount,columnSize)){ c.drawLine(childView.getLeft(),myY,childView.getRight()+thick,myY,paint); } //vertical if(isLastRowGrid(i,adapterChildrenCount,columnSize) && !isLastGridColumn(i,columnSize)) { c.drawLine(myX, childView.getTop(), myX, childView.getBottom(), paint); }else if(!isLastGridColumn(i,columnSize)){ c.drawLine(myX,childView.getTop(),myX,myY,paint); } } }else{ PathEffect effects = new DashPathEffect(new float[]{0,0,dashWidth,thick},dashGap); paint.setPathEffect(effects); for(int i=0;i<childrentCount;i++) { View childView = parent.getChildAt(i); int myX = childView.getRight()+thick/2; int myY = childView.getBottom() + thick / 2; //horizonal if(!isLastRowGrid(i,adapterChildrenCount,columnSize)){ Path path = new Path(); path.moveTo(0, myY); path.lineTo(myX,myY); c.drawPath(path, paint); } //vertical if(isLastRowGrid(i,adapterChildrenCount,columnSize) && !isLastGridColumn(i,columnSize)) { Path path = new Path(); path.moveTo(myX, childView.getTop()); path.lineTo(myX,childView.getBottom()); c.drawPath(path, paint); } else if(!isLastGridColumn(i,columnSize)){ Path path = new Path(); path.moveTo(myX, childView.getTop()); path.lineTo(myX,childView.getBottom()); c.drawPath(path, paint); } } } } /** * check if is one of the last columns * @param position * @param columnSize * @return */ private boolean isLastGridColumn(int position,int columnSize){ boolean isLast = false; if((position+1)%columnSize==0){ isLast = true; } return isLast; } /** * check if is the last row of the grid * @param position * @param itemSize * @param columnSize * @return */ private boolean isLastRowGrid(int position,int itemSize,int columnSize){ return position/columnSize == (itemSize-1)/columnSize; } }