Scroller

来源:互联网 发布:淘宝新店旺旺号采集 编辑:程序博客网 时间:2024/06/07 18:15

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)
第一个参数是起始移动的x坐标值,第二个是起始移动的y坐标值,第三个第四个参数都是移到某点的坐标值,而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线程中使用。



)()
原创粉丝点击