Skip to content

Instantly share code, notes, and snippets.

View sergei-lapin's full-sized avatar

Sergey Lapin sergei-lapin

  • Vivid Money
  • Berlin, Germany
View GitHub Profile
@sergei-lapin
sergei-lapin / DragGestureDetector.kt
Created September 2, 2021 11:58
Simple drag gesture detector with API simillar to android.view.ScaleGestureDetector
class DragGestureDetector(private val onDragListener: OnDragListener) {
var posX = 0f
private set
var posY = 0f
private set
private var activePointerId = -1
fun onTouchEvent(event: MotionEvent): Boolean {
@sergei-lapin
sergei-lapin / RotateGestureDetector.kt
Last active September 2, 2021 12:47
A simple rotate gesture detector with API simillar to android.view.ScaleGestureDetector
class RotateGestureDetector(private val onRotateListener: OnRotateListener) {
val rotationDeltaDegrees: Float
get() {
val diffRadians = atan2(prevDiffY, prevDiffX) - atan2(currDiffY, currDiffX)
return Math.toDegrees(diffRadians.toDouble()).toFloat()
}
var focusX = 0f
private set
@sergei-lapin
sergei-lapin / ViewHolderSupplier.kt
Created August 5, 2021 07:00
onItemCreatedOutside
internal fun onItemCreatedOutside(viewType: Int) {
itemsCreated[viewType] = itemsCreated.getOrZero(viewType) + 1
}
@sergei-lapin
sergei-lapin / ViewHolderSupplier.kt
Created August 5, 2021 07:00
ViewHolderProducer
typealias ViewHolderProducer = (parent: ViewGroup, viewType: Int) -> RecyclerView.ViewHolder
protected fun createItem(viewType: Int) {
val created = itemsCreated.getOrZero(viewType) + 1
val queued = itemsQueued.getOrZero(viewType)
if (created > queued) return
val holder: RecyclerView.ViewHolder
val start: Long
val end: Long
try {
internal fun setPrefetchBound(viewType: Int, count: Int) {
if (itemsQueued.getOrZero(viewType) >= count) return
itemsQueued[viewType] = count
val created = itemsCreated.getOrZero(viewType)
if (created >= count) return
repeat(count - created) { enqueueItemCreation(viewType) }
}
@sergei-lapin
sergei-lapin / ViewHolderSupplier.kt
Created August 5, 2021 06:57
Full Supplier code
typealias ViewHolderProducer = (parent: ViewGroup, viewType: Int) -> RecyclerView.ViewHolder
typealias ViewHolderConsumer = (viewHolder: RecyclerView.ViewHolder, creationTimeNanos: Long) -> Unit
abstract class ViewHolderSupplier(
context: Context,
private val viewHolderProducer: ViewHolderProducer
) {
internal lateinit var viewHolderConsumer: ViewHolderConsumer
init {
attachToPreventFromClearing()
viewHolderSupplier.viewHolderConsumer = ::putViewFromSupplier
viewHolderSupplier.start()
}
private fun putViewFromSupplier(scrap: RecyclerView.ViewHolder, creationTimeNanos: Long) {
factorInCreateTime(scrap.itemViewType, creationTimeNanos)
putRecycledView(scrap)
}
@sergei-lapin
sergei-lapin / PrefetchViewPool.kt
Created August 5, 2021 06:56
getRecycledView
override fun getRecycledView(viewType: Int): RecyclerView.ViewHolder? {
val holder = super.getRecycledView(viewType)
if (holder == null) viewHolderSupplier.onItemCreatedOutside(viewType)
return holder
}
@sergei-lapin
sergei-lapin / PrefetchViewPool.kt
Created August 5, 2021 06:56
putRecycledView
override fun putRecycledView(scrap: RecyclerView.ViewHolder) {
val viewType = scrap.itemViewType
val maxRecycledViews = recycledViewsBounds.getOrPut(viewType) { defaultMaxRecycledViews }
setMaxRecycledViews(viewType, maxRecycledViews)
super.putRecycledView(scrap)
}