使用
RecyclerView.ItemDecoration用來裝飾RecyclerView的itemView,我們常用來做分割線,但它的功能不僅是分割線。
實現ItemDecoration,需要實現子類,主要實現他的兩個主要方法
/**
這個方法主要是獲取itemView的範圍
outRect就是擴展參數,0表示範圍跟itemView範圍一樣。
>0表示範圍外擴(如果無法外擴則邊界預留)。
outRect.top=10,表示上邊界外擴 10px (如果範圍超出了RecyclerView區域,表示0-10px用於繪製邊界,不會用於itemView的展示)
**/
override fun getItemOffsets(
outRect: Rect, view: View, parent: RecyclerView,state: RecyclerView.State
)
/**
畫裝飾條目,需要繪製出全部item的裝飾。一般根據itemView的LayoutParam,定位到canvas繪製的位置
**/
override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State)
代碼片
package com.me.kotlinlearn
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Rect
import android.view.View
import androidx.recyclerview.widget.RecyclerView
class MyDecoration(val isVertical: Boolean, val colorValue:Int, val size:Int) : RecyclerView.ItemDecoration() {
public constructor() : this(false, Color.parseColor("#ff000000"), 100)
private val paint = Paint().apply {
flags = Paint.ANTI_ALIAS_FLAG
color = colorValue
}
override fun getItemOffsets(
outRect: Rect,
view: View,
parent: RecyclerView,
state: RecyclerView.State
) {
super.getItemOffsets(outRect, view, parent, state)
if(isVertical) {
outRect.set(0, 0, size, 0)
} else {
outRect.set(0, 0, 0, size)
}
}
override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
super.onDraw(c, parent, state)
if (isVertical) {
drawVertical(c, parent, state)
} else {
drawHorizontal(c, parent, state)
}
}
/**
* 畫水平分割線
*/
private fun drawHorizontal(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
for(i in 0 until parent.childCount) {
val child = parent.getChildAt(i)
val param = child.layoutParams as RecyclerView.LayoutParams
val left = child.left - param.leftMargin
val top = child.bottom + param.bottomMargin
val right = child.right + param.rightMargin
val bottom = top + size
c.drawRect(Rect(left, top, right, bottom), paint)
}
}
/**
* 畫豎直分割線
**/
private fun drawVertical(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
for(i in 0 until parent.childCount) {
val child = parent.getChildAt(i)
val param = child.layoutParams as RecyclerView.LayoutParams
val left = child.right + param.rightMargin
val top = child.top - param.topMargin
val right = left + size
val bottom = child.bottom + param.bottomMargin
c.drawRect(Rect(left, top, right,bottom), paint)
}
}
}
RecyclerView提供的ItemDecoration
DividerItemDecoration
用來爲線性佈局提供分割線。分割線可直接在layout中實現。