读安卓群英传滑动机制之-=------==========scroller
scroller类其实作用和scrollBy、scrollTo的作用是差不多的,区别就是通过scroller移动可以有一个缓冲动画,并不是一下就从起点到终点了。说到这里,就顺便说下scrollBy,scrollTo,
=========scrollBy,scrollTo
注意,这两个方法移动的是内容:
在viewGroup中,移动的就是其所有的子控件,同时,可以通过((View)getParent()).getScrollX()来获取子控件在viewGroup中的滑动坐标;
在view中,移动的就是内容,譬如TextView中移动的就是文本,在ImageView中移动的就是图片
另外,需要注意的是这两个方法移动的都是坐标系
===Scroller
调用scroller的基本步骤
1.初始化
mScroller = new Scroller(context);
2.重写view或者ViewGoup的computeScroll()方法实现模拟滑动,这个方法在onDraw中调用的,这个方法也是scroller用法的核心,通过不断的移动一小段达到平滑移动的效果
@Override
public void computeScroll() {//该方法在onDraw中调用,实现模拟滑动,只有在这个方法中能够获取到模拟过程中的scrollx,与scrolly,所以必须要复写这个方法
super.computeScroll();
if (mScroller.computeScrollOffset()) {//scroller是否执行完毕
((View) getParent()).scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
invalidate();
}
}
注意的是需要调用invalidate()来请求重绘,从而不断来调用computeScroll(),从而递归直到滑动完成。getCurrX(),getCurrY()分别是获取到当前滑动坐标。
3.开启模拟过程
View viewGroup = (View) getParent();
mScroller.startScroll(viewGroup.getScrollX(), viewGroup.getScrollY(), -viewGroup.getScrollX(), -viewGroup.getScrollY());这里是通过父控件来获取view的滑动坐标
invalidate();
这里需要注意到也调用了invalidate()方法,这样通知view重绘才能调用到computeScroll()方法