Last active
March 13, 2019 13:31
-
-
Save reuniware/b86e630ab46281906ed6ceba58c8220c to your computer and use it in GitHub Desktop.
Implements a basic swipe on recyclerview item
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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