Scroller用法
手写笔记:
另外需要补充一些相关知识:
1.既然viewgroup内部实现了滑动的方法scrollTo()/scrollBy(),为什么要用还scroller呢?
因为:
* 为了让View或者ViewGroup的内容发生移动,我们常用scrollTo()和scrollBy()方法.
* 但这两个方法执行的速度都很快,瞬间完成了移动感觉比较生硬.
* 为了使View或者ViewGroup的内容发生移动时比较平滑或者有其他的移动渐变效果
* 而采用Scroller可以分割移动过程,让过程有一段时间,从而能感受到滑动的效果.
* 在具体实现时,我们继承并重写View或者ViewGroup时可生成一个Scroller由它来具体
* 掌控移动过程和结合插值器Interpolator调用scrollTo()和scrollBy()方法.
2.为什么要postinvalidate()或者invalidate()?
因为这两个方法都是可以让整个view体系从最顶端开始自上而下重绘整个view,而当绘制到当前的viewgroup时,便去调用viewgroup的computeScroll(),从而达到滑动的过程。
3.scroll到底是一个什么样的动作?
回答这个问题,首先要明白一个原理:
Android View视图是没有边界的,Canvas是没有边界的,只不过我们通过绘制特定的View时对Canvas对象进行了一定的操作,例如 : translate(平移)、clipRect(剪切)等,以便达到我们的对该Canvas对象绘制的要求 ,我们可以将这种无边界的视图称为“视图坐标”-----它不受物理屏幕限制。通常我们所理解的一个Layout布局文件只是该视图的显示区域,超过了这个显示区域将不能显示到父视图的区域中
,对应的,我们可以将这种有边界的视图称为“布局坐标”------ 父视图给子视图分配的布局(layout)大小。而且, 一个视图的在屏幕的起始坐标位于视图坐标起始处。
那么下面的问题就是:如何将我们的视图的任意坐标能显示到该视图的中心坐标上呢? 由于该布局位置是只能显示特定的一块视图内容 ,因此我们需要通过scrollTo()或者scrollBy()方法将我们期望的视图“滚动”至布局坐标上。
所以,我们得到的结论是:即使没用到scrollView,我们也能实现视图的滑动。而事实上我们在用linearlayout时,用scrollTo()方法便可实现视图的移动,而加入scroller后,便实现了滑动的效果。