Skip to content

Instantly share code, notes, and snippets.

@reuniware
Last active March 13, 2019 13:31
Show Gist options
  • Save reuniware/b86e630ab46281906ed6ceba58c8220c to your computer and use it in GitHub Desktop.
Save reuniware/b86e630ab46281906ed6ceba58c8220c to your computer and use it in GitHub Desktop.
Implements a basic swipe on recyclerview item
package com.util
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.support.v7.widget.RecyclerView
import android.support.v7.widget.helper.ItemTouchHelper.Callback
import android.support.v7.widget.helper.ItemTouchHelper.*
import android.view.MotionEvent
import android.support.v7.widget.helper.ItemTouchHelper.ACTION_STATE_SWIPE
import android.view.View
import android.graphics.RectF
import timber.log.Timber
/*
Classe de gestion du Swipe sur RecyclerView
*/
internal class SwipeController : Callback() {
override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
//Log.d("SwipeController", "onSelectedChanged")
super.onSelectedChanged(viewHolder, actionState)
}
override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int {
//return makeMovementFlags(0, LEFT or RIGHT)
return makeMovementFlags(0, LEFT)
}
override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
return false
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
// La ligne a été swipée
}
override fun onChildDraw(c: Canvas, recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, dX: Float, dY: Float, actionState: Int, isCurrentlyActive: Boolean) {
if (actionState == ACTION_STATE_SWIPE) {
setTouchListener(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive)
}
// Dessiner les boutons arbitairement
// TODO: Remplacer par des icônes ou fontes si possible
drawButtons(c, viewHolder)
val translationX: Float
val itemViewWidth: Float = viewHolder.itemView.width.toFloat()
if (dX > 0) {
translationX = Math.min(-dX, /*itemViewWidth / 2*/ buttonWidth*2)
} else {
translationX = Math.max(dX, -1 * /*itemViewWidth / 2*/ buttonWidth*2)
}
super.onChildDraw(c, recyclerView, viewHolder, translationX, dY, actionState, isCurrentlyActive)
}
private fun setTouchListener(c: Canvas, recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, dX: Float, dY: Float, actionState: Int, isCurrentlyActive: Boolean) {
recyclerView.setOnTouchListener(object : View.OnTouchListener {
override fun onTouch(v: View, event: MotionEvent): Boolean {
//swipeBack = event.action == MotionEvent.ACTION_CANCEL || event.action == MotionEvent.ACTION_UP
//Timber.d("onTouch")
//Timber.d(event.toString())
if (event.action == MotionEvent.ACTION_DOWN) {
Timber.d("ACTION_DOWN")
val x = event.getX()
val y = event.getY()
if (x>=deleteButton.left && x<=deleteButton.right && y>=deleteButton.top && y<=deleteButton.bottom) {
Timber.d("Delete button clicked")
} else if (x>=editButton.left && x<=editButton.right && y>=editButton.top && y<=editButton.bottom) {
Timber.d("Edit button clicked")
}
}
return false
}
})
}
val buttonWidth = 150f
var buttonWidthWithoutPadding : Float = 0.0F
lateinit var deleteButton : RectF
lateinit var editButton : RectF
private fun drawButtons(c: Canvas, viewHolder: RecyclerView.ViewHolder) {
buttonWidthWithoutPadding = buttonWidth - 20
val corners = 16f
val itemView = viewHolder.itemView
val p = Paint()
deleteButton = RectF(itemView.right - buttonWidthWithoutPadding, itemView.top.toFloat(), itemView.right.toFloat(), itemView.bottom.toFloat())
p.setColor(Color.RED)
c.drawRoundRect(deleteButton, corners, corners, p)
drawText("Suppr.", c, deleteButton, p)
editButton = RectF(itemView.right - buttonWidthWithoutPadding, itemView.top.toFloat(), itemView.right - buttonWidthWithoutPadding * 2, itemView.bottom.toFloat())
p.setColor(Color.GREEN)
c.drawRoundRect(editButton, corners, corners, p)
drawText("Editer", c, editButton, p)
}
private fun drawText(text: String, c: Canvas, button: RectF, p: Paint) {
val textSize = 20f
p.color = Color.WHITE
p.isAntiAlias = true
p.textSize = textSize
val textWidth = p.measureText(text)
c.drawText(text, button.centerX() - textWidth / 2, button.centerY() + textSize / 2, p)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment