Created
August 30, 2017 05:40
-
-
Save beilly/c97a198c91b0b569a3055a225205a447 to your computer and use it in GitHub Desktop.
RecycleView万能分割线
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.vcredit.cp.view; | |
import android.content.Context; | |
import android.content.res.TypedArray; | |
import android.graphics.Canvas; | |
import android.graphics.Paint; | |
import android.graphics.Rect; | |
import android.graphics.drawable.Drawable; | |
import android.support.v4.content.ContextCompat; | |
import android.support.v7.widget.LinearLayoutManager; | |
import android.support.v7.widget.RecyclerView; | |
import android.view.View; | |
public class RecycleViewDivider extends RecyclerView.ItemDecoration { | |
private Paint mPaint; | |
private Drawable mDivider; | |
private int mDividerHeight = 2;//分割线高度,默认为1px | |
private int mOrientation;//列表的方向:LinearLayoutManager.VERTICAL或LinearLayoutManager.HORIZONTAL | |
private static final int[] ATTRS = new int[]{android.R.attr.listDivider}; | |
/** | |
* 默认分割线:高度为2px,颜色为灰色 | |
* | |
* @param context | |
* @param orientation 列表方向 | |
*/ | |
public RecycleViewDivider(Context context, int orientation) { | |
if (orientation != LinearLayoutManager.VERTICAL && orientation != LinearLayoutManager.HORIZONTAL) { | |
throw new IllegalArgumentException("请输入正确的参数!"); | |
} | |
mOrientation = orientation; | |
final TypedArray a = context.obtainStyledAttributes(ATTRS); | |
mDivider = a.getDrawable(0); | |
a.recycle(); | |
} | |
/** | |
* 自定义分割线 | |
* | |
* @param context | |
* @param orientation 列表方向 | |
* @param drawableId 分割线图片 | |
*/ | |
public RecycleViewDivider(Context context, int orientation, int drawableId) { | |
this(context, orientation); | |
mDivider = ContextCompat.getDrawable(context, drawableId); | |
mDividerHeight = mDivider.getIntrinsicHeight(); | |
} | |
/** | |
* 自定义分割线 | |
* | |
* @param context | |
* @param orientation 列表方向 | |
* @param dividerHeight 分割线高度 | |
* @param dividerColor 分割线颜色 | |
*/ | |
public RecycleViewDivider(Context context, int orientation, int dividerHeight, int dividerColor) { | |
this(context, orientation); | |
mDividerHeight = dividerHeight; | |
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); | |
mPaint.setColor(dividerColor); | |
mPaint.setStyle(Paint.Style.FILL); | |
} | |
//获取分割线尺寸 | |
@Override | |
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { | |
super.getItemOffsets(outRect, view, parent, state); | |
outRect.set(0, 0, 0, mDividerHeight); | |
} | |
//绘制分割线 | |
@Override | |
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { | |
super.onDraw(c, parent, state); | |
if (mOrientation == LinearLayoutManager.VERTICAL) { | |
drawVertical(c, parent); | |
} else { | |
drawHorizontal(c, parent); | |
} | |
} | |
//绘制横向 item 分割线 | |
private void drawHorizontal(Canvas canvas, RecyclerView parent) { | |
final int left = parent.getPaddingLeft(); | |
final int right = parent.getMeasuredWidth() - parent.getPaddingRight(); | |
final int childSize = parent.getChildCount() - 1; | |
for (int i = 0; i < childSize; i++) { | |
final View child = parent.getChildAt(i); | |
RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams(); | |
final int top = child.getBottom() + layoutParams.bottomMargin; | |
final int bottom = top + mDividerHeight; | |
if (mDivider != null) { | |
mDivider.setBounds(left, top, right, bottom); | |
mDivider.draw(canvas); | |
}else if (mPaint != null) { | |
canvas.drawRect(left, top, right, bottom, mPaint); | |
} | |
} | |
} | |
//绘制纵向 item 分割线 | |
private void drawVertical(Canvas canvas, RecyclerView parent) { | |
final int top = parent.getPaddingTop(); | |
final int bottom = parent.getMeasuredHeight() - parent.getPaddingBottom(); | |
final int childSize = parent.getChildCount() - 1; | |
for (int i = 0; i < childSize; i++) { | |
final View child = parent.getChildAt(i); | |
RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams(); | |
final int left = child.getRight() + layoutParams.rightMargin; | |
final int right = left + mDividerHeight; | |
if (mDivider != null) { | |
mDivider.setBounds(left, top, right, bottom); | |
mDivider.draw(canvas); | |
}else if (mPaint != null) { | |
canvas.drawRect(left, top, right, bottom, mPaint); | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment