实现代码如下:
class DragBounceLayout @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {
companion object {
private const val MAX_DRAG_PERCENT = 0.1f
}
private val scroller: OverScroller = OverScroller(context, DecelerateInterpolator())
private var lastY = 0f
@SuppressLint("ClickableViewAccessibility")
override fun onTouchEvent(event: MotionEvent): Boolean {
when (event.action) {
MotionEvent.ACTION_DOWN -> {
if (!scroller.isFinished) {
scroller.abortAnimation()
}
lastY = event.rawY
}
MotionEvent.ACTION_MOVE -> {
val deltaY = event.rawY - lastY
val maxHeight = height * MAX_DRAG_PERCENT
val translationY = (this.translationY + deltaY).coerceIn(-maxHeight, maxHeight)
this.translationY = translationY
lastY = event.rawY
}
MotionEvent.ACTION_UP -> {
val startY = translationY.toInt()
val targetY = 0
scroller.startScroll(0, startY, 0, targetY - startY, 300)
invalidate()
}
}
return true
}
override fun computeScroll() {
if (scroller.computeScrollOffset()) {
translationX = scroller.currX.toFloat()
translationY = scroller.currY.toFloat()
invalidate()
}
}
}