首页
JAVA笔记
数据库笔记
混乱记忆
小站记
您现在的位置
android View scroll fling 效果实现原理
简介: android scroll 实现原理和机制笔记,要实现fling 效果,通常我们在onTouchEvent中还会用到 VelocityTracker 来计算出速率,这个速率的值将会被 OverScroller 或 Scroller 用到
滚动效果的实现原理简介
这里以ScrollView 为例进行简单的说明。android View 本身就对对滚动条进行了支持,但是却不支持惯性 和 fling 效果,为了实现这些效果 ScrollView 用OverScroller 来做支撑,ViewPage 用到 Scroller。简单的滚动效果其实很简单,一般情况情况下在 onTouchEvent 或 onInterceptTouchEvent 中当根据需要调用 invalidate,然后在void draw(Canvas canvas) 中重绘制。那么问题就来了 fling 效果是怎么做到的呢?

滚动效果fling的实现原理简介
上面提到过对于这样的效果android framework 实现了一些 Scroller来辅助计算 fling 的进度,通过它的源码我们大多能看到 关于惯性、加速度、摩擦力、减速度、粘性等数值的计算过程(这些计算过程我们都不需要去理会)。我们主要应该注意的是 computeScrollOffset() 和 fling(int startX, int startY, int velocityX, int velocityY,
            int minX, int maxX, int minY, int maxY, int overX, int overY),其中computeScrollOffset 一般会在ViewGroup.computeScroll() 中被调用到,computeScrollOffset 为false 时表示 fling 操作已经结束,为 true 时表示 fling 正在进行,这时候就需要调用 postInvalidate 来失效当前 View,当 View 调用draw 重绘过程中还会调用computeScroll()这样就构成了一个闭环的循环[ draw() -> computeScroll() -> computeScrollOffset -> postInvalidate() -> draw()] 当 computeScrollOffset 返回false 时说明 fling 结束。

注意:要实现fling 效果,通常我们在onTouchEvent中还会用到 VelocityTracker 来计算出速率,这个速率的值将会被 OverScroller 或 Scroller 用到。

最近更新