重点主要在于在每次触摸事件中计算和上次触摸事件的偏移值,然后滚动这个距离
看代码(代码没有考虑很多边缘情况,主要是为了体现滚动的主要实现,对意外情况的考虑需要自行实现):
class HpScrollView(context: Context, attrs: AttributeSet): LinearLayout(context, attrs) {
// 上一次触摸事件的y坐标
private var lastY = 0f
override fun onTouchEvent(event: MotionEvent): Boolean {
if (!super.onTouchEvent(event)) {
val eventY = event.y
when(event.actionMasked) {
MotionEvent.ACTION_DOWN -> lastY = eventY
MotionEvent.ACTION_MOVE -> {
val dy = lastY - eventY
scrollTo(0, (scrollY + dy).toInt())
lastY = eventY
}
else -> {}
}
return true
}
return false
}
}
布局



