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