问题描述
我有一个示例SwipeHelper类,该类在RecyclerView菜单中创建一个滑动按钮。但是它仅在显示的按钮上显示文本,我想添加图像。有人可以告诉我如何在课堂上正确拼写出来吗。
SwipeHelper.kt
abstract class SwipeHelper(
private val recyclerView: RecyclerView
) : itemtouchhelper.SimpleCallback(
itemtouchhelper.ACTION_STATE_IDLE,itemtouchhelper.LEFT
) {
private var swipedPosition = -1
private val buttonsBuffer: MutableMap<Int,List<UnderlayButton>> = mutableMapOf()
private val recoverQueue = object : LinkedList<Int>() {
override fun add(element: Int): Boolean {
if (contains(element)) return false
return super.add(element)
}
}
@SuppressLint("ClickableViewAccessibility")
private val touchListener = View.OnTouchListener { _,event ->
if (swipedPosition < 0) return@OnTouchListener false
buttonsBuffer[swipedPosition]?.forEach { it.handle(event) }
recoverQueue.add(swipedPosition)
swipedPosition = -1
recoverSwipedItem()
true
}
init {
recyclerView.setonTouchListener(touchListener)
}
private fun recoverSwipedItem() {
while (!recoverQueue.isEmpty()) {
val position = recoverQueue.poll() ?: return
recyclerView.adapter?.notifyItemChanged(position)
}
}
private fun drawButtons(
canvas: Canvas,buttons: List<UnderlayButton>,itemView: View,dX: Float
) {
var right = itemView.right
buttons.forEach { button ->
val width = button.intrinsicWidth / buttons.intrinsicWidth() * abs(dX)
val left = right - width
button.draw(
canvas,RectF(left,itemView.top.toFloat(),right.toFloat(),itemView.bottom.toFloat())
)
right = left.toInt()
}
}
override fun onChildDraw(
c: Canvas,recyclerView: RecyclerView,viewHolder: RecyclerView.ViewHolder,dX: Float,dY: Float,actionState: Int,isCurrentlyActive: Boolean
) {
val position = viewHolder.adapterPosition
var maxDX = dX
val itemView = viewHolder.itemView
if (actionState == itemtouchhelper.ACTION_STATE_SWIPE) {
if (dX < 0) {
if (!buttonsBuffer.containsKey(position)) {
buttonsBuffer[position] = instantiateUnderlayButton(position)
}
val buttons = buttonsBuffer[position] ?: return
if (buttons.isEmpty()) return
maxDX = max(-buttons.intrinsicWidth(),dX)
drawButtons(c,buttons,itemView,maxDX)
}
}
super.onChildDraw(
c,recyclerView,viewHolder,maxDX,dY,actionState,isCurrentlyActive
)
}
override fun onMove(
recyclerView: RecyclerView,target: RecyclerView.ViewHolder
): Boolean {
return false
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder,direction: Int) {
val position = viewHolder.adapterPosition
if (swipedPosition != position) recoverQueue.add(swipedPosition)
swipedPosition = position
recoverSwipedItem()
}
abstract fun instantiateUnderlayButton(position: Int): List<UnderlayButton>
//region UnderlayButton
interface UnderlayButtonClickListener {
fun onClick()
}
class UnderlayButton(
private val context: Context,private val title: String,textSize: Float,@ColorRes private val colorRes: Int,private val clickListener: UnderlayButtonClickListener
) {
private var clickableRegion: RectF? = null
private val textSizeInPixel: Float = textSize * context.resources.displayMetrics.density // dp to px
private val horizontalPadding = 50.0f
val intrinsicWidth: Float
init {
val paint = Paint()
paint.textSize = textSizeInPixel
paint.typeface = Typeface.DEFAULT_BOLD
paint.textAlign = Paint.Align.LEFT
val titleBounds = Rect()
paint.getTextBounds(title,title.length,titleBounds)
intrinsicWidth = titleBounds.width() + 2 * horizontalPadding
}
fun draw(canvas: Canvas,rect: RectF) {
val paint = Paint()
// Draw background
paint.color = ContextCompat.getColor(context,colorRes)
canvas.drawRect(rect,paint)
// Draw title
paint.color = ContextCompat.getColor(context,android.R.color.white)
paint.textSize = textSizeInPixel
paint.typeface = Typeface.DEFAULT_BOLD
paint.textAlign = Paint.Align.LEFT
val titleBounds = Rect()
paint.getTextBounds(title,titleBounds)
val y = rect.height() / 2 + titleBounds.height() / 2 - titleBounds.bottom
canvas.drawText(title,rect.left + horizontalPadding,rect.top + y,paint)
clickableRegion = rect
}
fun handle(event: MotionEvent) {
clickableRegion?.let {
if (it.contains(event.x,event.y)) {
clickListener.onClick()
}
}
}
}
//endregion
}
private fun List<SwipeHelper.UnderlayButton>.intrinsicWidth(): Float {
if (isEmpty()) return 0.0f
return map { it.intrinsicWidth }.reduce { acc,fl -> acc + fl }
}
这是我现在的滑动按钮的外观。 enter image description here
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)