RecyclerView 边框线设置

   本人新手,写这个博客主要给自己看,有什么错误的地方 ,还望指正,不喜勿喷。

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;
    }


}

猜你喜欢

转载自blog.csdn.net/god_sunht/article/details/52807403