Advertisement
Guest User

Untitled

a guest
Sep 12th, 2019
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 3.89 KB | None | 0 0
  1. package org.furs.knotes.ui.recycler
  2.  
  3. import android.graphics.Canvas
  4. import android.graphics.Paint
  5. import android.graphics.Rect
  6. import android.graphics.RectF
  7. import android.view.View
  8. import androidx.recyclerview.widget.ItemTouchHelper
  9. import androidx.recyclerview.widget.RecyclerView
  10. import org.furs.knotes.R
  11. import org.furs.knotes.data.TextNote
  12.  
  13. class ItemTouchHelperCallback(
  14.     private val adapter: NoteAdapter,
  15.     private val swipeListener: (TextNote) -> Unit
  16. ) : ItemTouchHelper.Callback() {
  17.     private val bgRect = RectF()
  18.     private val bgPaint = Paint(Paint.ANTI_ALIAS_FLAG)
  19.     private val iconBounds = Rect()
  20.  
  21.     override fun getMovementFlags(
  22.         recyclerView: RecyclerView,
  23.         viewHolder: RecyclerView.ViewHolder
  24.     ): Int {
  25.         return if(viewHolder is ItemTouchViewHolder) {
  26.             makeFlag(ItemTouchHelper.ACTION_STATE_SWIPE, ItemTouchHelper.START)
  27.         } else {
  28.             makeFlag(ItemTouchHelper.ACTION_STATE_IDLE, ItemTouchHelper.START)
  29.         }
  30.     }
  31.  
  32.     override fun onMove(
  33.         recyclerView: RecyclerView,
  34.         viewHolder: RecyclerView.ViewHolder,
  35.         target: RecyclerView.ViewHolder
  36.     ): Boolean {
  37.         return false
  38.     }
  39.  
  40.     override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
  41.         if(viewHolder is ItemTouchViewHolder) {
  42.             swipeListener.invoke(adapter.items[viewHolder.adapterPosition])
  43.         }
  44.     }
  45.  
  46.     override fun onChildDraw(
  47.         canvas: Canvas,
  48.         recyclerView: RecyclerView,
  49.         viewHolder: RecyclerView.ViewHolder,
  50.         dX: Float,
  51.         dY: Float,
  52.         actionState: Int,
  53.         isCurrentlyActive: Boolean
  54.     ) {
  55.         if(actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
  56.             val itemView = viewHolder.itemView
  57.             drawBackground(canvas, itemView, dX)
  58.             drawIcon(canvas, itemView, dX)
  59.         }
  60.  
  61.         super.onChildDraw(canvas, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive)
  62.     }
  63.  
  64.     override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
  65.         if(actionState != ItemTouchHelper.ACTION_STATE_IDLE && viewHolder is ItemTouchViewHolder) {
  66.             viewHolder.onItemSelected()
  67.         }
  68.         super.onSelectedChanged(viewHolder, actionState)
  69.     }
  70.  
  71.     override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) {
  72.         if(viewHolder is ItemTouchViewHolder) {
  73.             viewHolder.onItemCleared()
  74.         }
  75.         super.clearView(recyclerView, viewHolder)
  76.     }
  77.  
  78.     private fun drawBackground(
  79.         canvas: Canvas,
  80.         itemView: View,
  81.         dX: Float
  82.     ) {
  83.         with(bgRect) {
  84.             left = dX
  85.             top = itemView.top.toFloat()
  86.             right = itemView.right.toFloat()
  87.             bottom = itemView.bottom.toFloat()
  88.         }
  89.  
  90.         with(bgPaint) {
  91.             color = itemView.resources.getColor(R.color.item_swipe_background, itemView.context.theme)
  92.         }
  93.  
  94.         canvas.drawRect(bgRect, bgPaint)
  95.     }
  96.  
  97.     private fun drawIcon(
  98.         canvas: Canvas,
  99.         itemView: View,
  100.         dX: Float
  101.     ) {
  102.         val icon = itemView.resources.getDrawable(R.drawable.ic_remove_swipe, itemView.context.theme)
  103.         val iconSize = itemView.resources.getDimensionPixelSize(R.dimen.icon_size)
  104.         val space = itemView.resources.getDimensionPixelSize(R.dimen.space_normal_16)
  105.         val margin = (itemView.bottom - itemView.top - iconSize) / 2
  106.  
  107.         with(iconBounds) {
  108.             left = itemView.right + dX.toInt() + space
  109.             top = itemView.top + margin
  110.             right = itemView.right + dX.toInt() + iconSize + space
  111.             bottom = itemView.bottom - margin
  112.         }
  113.  
  114.         icon.bounds = iconBounds
  115.         icon.draw(canvas)
  116.     }
  117.  
  118.     interface ItemTouchViewHolder {
  119.         fun onItemSelected()
  120.         fun onItemCleared()
  121.     }
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement