parent
9cd4234fb0
commit
a29ea1c62b
@ -0,0 +1,102 @@ |
||||
package io.legado.app.ui.book.bookmark |
||||
|
||||
import android.graphics.Canvas |
||||
import android.graphics.Paint |
||||
import android.graphics.Rect |
||||
import android.text.TextPaint |
||||
import android.view.View |
||||
import androidx.recyclerview.widget.RecyclerView |
||||
import io.legado.app.lib.theme.accentColor |
||||
import io.legado.app.lib.theme.backgroundColor |
||||
import io.legado.app.utils.dpToPx |
||||
import io.legado.app.utils.spToPx |
||||
import splitties.init.appCtx |
||||
|
||||
class BookmarkDecoration(val adapter: BookmarkAdapter) : RecyclerView.ItemDecoration() { |
||||
|
||||
private val headerLeft = 16f.dpToPx() |
||||
private val headerHeight = 32f.dpToPx() |
||||
|
||||
private val headerPaint = Paint().apply { |
||||
color = appCtx.backgroundColor |
||||
} |
||||
private val textPaint = TextPaint().apply { |
||||
textSize = 16f.spToPx() |
||||
color = appCtx.accentColor |
||||
} |
||||
private val textRect = Rect() |
||||
|
||||
override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State) { |
||||
val count = parent.childCount |
||||
for (i in 0 until count) { |
||||
val view = parent.getChildAt(i) |
||||
val position = parent.getChildLayoutPosition(view) |
||||
val isHeader = adapter.isItemHeader(position) |
||||
if (isHeader) { |
||||
c.drawRect(0f, 0f, parent.width.toFloat(), headerHeight, headerPaint) |
||||
val headerText = adapter.getHeaderText(position) |
||||
textPaint.getTextBounds(headerText, 0, headerText.length, textRect) |
||||
c.drawText( |
||||
headerText, |
||||
headerLeft, |
||||
(view.top - headerHeight) + headerHeight / 2 + textRect.height() / 2, |
||||
textPaint |
||||
) |
||||
} |
||||
} |
||||
} |
||||
|
||||
// override fun onDrawOver(c: Canvas, parent: RecyclerView, state: RecyclerView.State) { |
||||
// val position = (parent.layoutManager as LinearLayoutManager).findFirstVisibleItemPosition() |
||||
// val view = parent.findViewHolderForAdapterPosition(position)?.itemView ?: return |
||||
// val isHeader = adapter.isItemHeader(position + 1) |
||||
// val headerText = adapter.getHeaderText(position) |
||||
// if (isHeader) { |
||||
// val bottom = min(headerHeight.toInt(), view.bottom) |
||||
// c.drawRect( |
||||
// 0f, |
||||
// view.top.toFloat(), |
||||
// parent.width.toFloat(), |
||||
// view.top + headerHeight, |
||||
// headerPaint |
||||
// ) |
||||
// textPaint.getTextBounds(headerText, 0, headerText.length, textRect) |
||||
// c.drawText( |
||||
// headerText, |
||||
// headerLeft, |
||||
// headerHeight / 2 + textRect.height() / 2 - (headerHeight - bottom), |
||||
// textPaint |
||||
// ) |
||||
// } else { |
||||
// c.drawRect( |
||||
// 0f, |
||||
// 0f, |
||||
// parent.width.toFloat(), |
||||
// headerHeight, |
||||
// headerPaint |
||||
// ) |
||||
// textPaint.getTextBounds(headerText, 0, headerText.length, textRect) |
||||
// c.drawText( |
||||
// headerText, |
||||
// headerLeft, |
||||
// headerHeight / 2 + textRect.height() / 2, |
||||
// textPaint |
||||
// ) |
||||
// } |
||||
// c.save() |
||||
// } |
||||
|
||||
override fun getItemOffsets( |
||||
outRect: Rect, |
||||
view: View, |
||||
parent: RecyclerView, |
||||
state: RecyclerView.State |
||||
) { |
||||
val position = parent.getChildLayoutPosition(view) |
||||
val isHeader = adapter.isItemHeader(position) |
||||
if (isHeader) { |
||||
outRect.top = headerHeight.toInt() |
||||
} |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue