mScroller = new Scroller(getContext());
Scroller给我的感觉更像ValueAnimator,给他的坐标值并一段时间内变化但是没有主动变化view;
主要配合scrollTo使用实现平滑滑动(匀速滑动)
整个过程可以看作x轴从startX到dx用500毫秒变化,
y轴从startY到dy用500毫秒变化,
程序运行一段时间我们用getCurrX()和getCurrY()获取当前时间的值(当然要先调用computeScrollOffset())。
startScroll()之后的调用invalidate()利用draw花费的时间获取不同时间的值要先调用computeScrollOffset()这时Scroller才计算出当前值;
因为每次draw都调用自己的compiteScroll()方法(方法本身是空的)。
我们可以Override这个方法并获取当前X和Y然后调用scrollTo滑动再调用postInvalidate就可以完成匀速滑动一段位移。
mScroller.startScroll(getScrollX(), 0, dx, 0, 500);startScroll(int startX, int startY, int dx, int dy, int duration)
public boolean computeScrollOffset()
根据当前已经消逝的时间计算当前的坐标点,保存在mCurrX和mCurrY值中
如果已经完成了本次动画控制,直接返回为false
draw方法中会自己调用
computeScroll();
invalidate()方法 :
说明:请求重绘View树,即draw()过程,假如视图发生大小没有变化就不会调用layout()过程,并且只绘制那些“需要重绘的”
视图,即谁(View的话,只绘制该View ;ViewGroup,则绘制整个ViewGroup)请求invalidate()方法,就绘制该视图。
一般引起invalidate()操作的函数如下:
1、直接调用invalidate()方法,请求重新draw(),但只会绘制调用者本身。
2、setSelection()方法 :请求重新draw(),但只会绘制调用者本身。
3、setVisibility()方法 : 当View可视状态在INVISIBLE转换VISIBLE时,会间接调用invalidate()方法,
继而绘制该View。
4 、setEnabled()方法 : 请求重新draw(),但不会重新绘制任何视图包括该调用者本身。
postInvalidate()
android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,
其中前者是在UI线程自身中使用,而后者在非UI线程中使用。