美文网首页
手写ViewPager

手写ViewPager

作者: 王灵 | 来源:发表于2020-05-13 21:31 被阅读0次
        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时结合惯性速度与已滑动的距离决定接下来的动作

    相关文章

      网友评论

          本文标题:手写ViewPager

          本文链接:https://www.haomeiwen.com/subject/yogonhtx.html