private val viewConfiguration = ViewConfiguration.get(context)
private var scaledPagingTouchSlop = viewConfiguration.scaledPagingTouchSlop//触发移动的最小距离
private var scaledMinimumFlingVelocity = viewConfiguration.scaledMinimumFlingVelocity//惯性滑动的最小滑动速度
private var scaledMaximumFlingVelocity = viewConfiguration.scaledMaximumFlingVelocity//惯性滑动的最大滑动速度
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
measureChildren(widthMeasureSpec, heightMeasureSpec)//所有的子view都以这个尺寸为最大来自测
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
}
private val velocityTracker = VelocityTracker.obtain()
velocityTracker.addMovement(event)//添加event
velocityTracker.computeCurrentVelocity(1000,scaledMaximumFlingVelocity.toFloat())//计算1000ms内移动的像素值,并设置最大速度
velocityTracker.xVelocity//获得X轴的速度(必须先调用computeCurrentVelocity)
velocityTracker.yVelocity//获得Y轴的速度
velocityTracker.clear()//
scrollTo(x,y)//对view内部的所有进行偏移
private val overScroller = OverScroller(context)
overScroller.computeScrollOffset()//动画是否正在进行
overScroller.startScroll(startX, startY, dx, dy)//提供起点和滑动距离的动画
postInvalidateOnAnimation()
整体的实现思路
- 在onInterceptTouchEvent判断滑动,拦截子view且告知父view不要拦截
- 在MotionEvent.ACTION_MOVE时scrollTo设置滑动
- 在MotionEvent.ACTION_UP时结合惯性速度与已滑动的距离决定接下来的动作
网友评论