弹性滑动实现方法

亚纶 / 文 发表于2018-04-12 22:39 次阅读 kotlin,弹性滑动

一、通过Scroller

Scroller本身并不能实现View的滑动,需要配合View的computeScroll方法才能完成弹性的效果。 不断地让View重绘,而每次重绘距滑动起始时间会有一个时间间隔,通过这个时间间隔Scroller就可以得出View当前的滑动位置,再通过scrollTo方法来完成View的滑动。

    private var mScroller:Scroller
    init{
        mScroller=Scroller(context)
    }

    private fun smoothScrollBy(dx:Int,dy:Int){
        var scrollX=getScrollX()
        var deltaX=dx-scrollX
        mScroller.startScroller(scrollX,0,deltaX,0,1000)
        //invalidate方法会导致View重绘,在View的draw方法中又会调用computeScroll方法
        invalidate()
    }

    //默认是空实现,获取当前Scroller的scrollX和scrollY,通过scrollTo方法实现滑动,又掉用postInvalidate方法进行第二次绘制
    override fun computeScroll(){
        if(mScroller.computeScrollOffset()){
            scrollTo(mScroller.currX,mScroller.currY)
            postInvalidate()
        }
    }

二、通过动画

            val startX=0
            val deltaX=100
            var animator=ValueAnimator.ofInt(0,1).setDuration(1000)
            animator.addUpdateListener {
                var fraction=animator.animatedFraction
                textView.scrollTo(startX+(deltaX*fraction) as Int,0)
            }
            animator.start()

三、通过延时策略

companion object {
        private val TAG="Demo2Activity"
        private val MESSAGE_SCROLL_TO=1
        private val FRAME_COUNT=30
        private val DELAYED_TIME=33L
    }
 private var mCount: Int = 0
    var mHandler=object: Handler() {
        override fun handleMessage(msg: Message) {
            when (msg.what) {
                MESSAGE_SCROLL_TO -> {
                    mCount++
                    if(mCount<= FRAME_COUNT){
                        var fraction=mCount/ FRAME_COUNT as Float
                        var scrollX=fraction*100 as Int
                        view.scrollTo(scrollX,0)
                        sendEmptyMessageDelayed(MESSAGE_SCROLL_TO, DELAYED_TIME)
                    }
                }
                else -> {
                }
            }
        }
    }
收藏 赞 (0) 踩 (0)