package com.example.admin.recyclerviewhorizontaltest
import android.content.Context
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
/**
* Create by --- on 2018/12/6 0006.
*@description:
*/
/**
* 默认分割线:高度为2px,颜色为灰色
*
* @param context
* @param orientation 列表方向 LinearLayoutManager.VERTICAL或LinearLayoutManager.HORIZONTAL
*/
class RecycleViewDivider(context: Context, private val mOrientation: Int) : RecyclerView.ItemDecoration() {
private var mPaint: Paint? = null
private var mDivider: Drawable? = null
private var mDividerHeight = 2//分割线高度,默认为1px
init {
if (mOrientation != LinearLayoutManager.VERTICAL && mOrientation != LinearLayoutManager.HORIZONTAL) {
throw IllegalArgumentException("请输入正确的参数!")
}
val a = context.obtainStyledAttributes(ATTRS)
mDivider = a.getDrawable(0)
a.recycle()
}
/**
* 自定义分割线
*
* @param context
* @param orientation 列表方向
* @param drawableId 分割线图片
*/
constructor(context: Context, orientation: Int, drawableId: Int) : this(context, orientation) {
mDivider = ContextCompat.getDrawable(context, drawableId)
mDividerHeight = mDivider!!.intrinsicHeight
}
/**
* 自定义分割线
*
* @param context
* @param orientation 列表方向
* @param dividerHeight 分割线高度
* @param dividerColor 分割线颜色
*/
constructor(context: Context, orientation: Int, dividerHeight: Int, dividerColor: Int) : this(
context,
orientation
) {
mDividerHeight = dividerHeight
mPaint = Paint(Paint.ANTI_ALIAS_FLAG)
mPaint!!.color = dividerColor
mPaint!!.style = Paint.Style.FILL
}
//获取分割线尺寸
override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
super.getItemOffsets(outRect, view, parent, state)
if (mOrientation == LinearLayoutManager.VERTICAL) {
outRect.set(0, 0, 0, mDividerHeight)
} else {
outRect.set(0, 0, mDividerHeight, 0)
}
}
//绘制分割线
override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
super.onDraw(c, parent, state)
if (mOrientation == LinearLayoutManager.VERTICAL) {
drawVertical(c, parent)
} else {
drawHorizontal(c, parent)
}
}
/**
* 绘制纵向列表时的分隔线 这时分隔线是横着的
* 每次 left相同,top根据child变化,right相同,bottom也变化
* @param canvas
* @param parent
*/
private fun drawVertical(canvas: Canvas, parent: RecyclerView) {
val left = parent.paddingLeft
val right = parent.measuredWidth - parent.paddingRight
val childSize = parent.childCount
for (i in 0 until childSize) {
val child = parent.getChildAt(i)
val layoutParams = child.layoutParams as RecyclerView.LayoutParams
val top = child.bottom + layoutParams.bottomMargin
val bottom = top + mDividerHeight
if (mDivider != null) {
mDivider!!.setBounds(left, top, right, bottom)
mDivider!!.draw(canvas)
}
if (mPaint != null) {
canvas.drawRect(left.toFloat(), top.toFloat(), right.toFloat(), bottom.toFloat(), mPaint!!)
}
}
}
/**
* 绘制横向列表时的分隔线 这时分隔线是竖着的
* l、r 变化; t、b 不变
* @param canvas
* @param parent
*/
private fun drawHorizontal(canvas: Canvas, parent: RecyclerView) {
val top = parent.paddingTop
val bottom = parent.measuredHeight - parent.paddingBottom
val childSize = parent.childCount
for (i in 0 until childSize) {
val child = parent.getChildAt(i)
val layoutParams = child.layoutParams as RecyclerView.LayoutParams
val left = child.right + layoutParams.rightMargin
val right = left + mDividerHeight
if (mDivider != null) {
mDivider!!.setBounds(left, top, right, bottom)
mDivider!!.draw(canvas)
}
if (mPaint != null) {
canvas.drawRect(left.toFloat(), top.toFloat(), right.toFloat(), bottom.toFloat(), mPaint!!)
}
}
}
companion object {
private val ATTRS = intArrayOf(android.R.attr.listDivider)
}
}