在android中, 可以滚动的view主角是scrollView 和 listview.
1. 关于scrollview滚动的实现原理, 首先需要了解mScrollX, mScrollY.
如果你将mScrollX和mScrollY的数值都增大10,然后调用invalidate()重新绘制界面的话,你会发现视图中的内容都向左上角移动啦!
这是怎么回事呢?从概念上你可以先这样解:mScrollX和mScrollY改变导致View的可视区域的移动,并不是导致View的视图区域的移动。
View的视图区域相当于无限大的,你可以在onDraw函数中的canvas中绘制任意大的图像,但是你会发现,最终屏幕上显示出来的只会是一部分,因为View自身还有大小概念,也就是measure和layout时,视图会被设置长宽还有界面中位置,这样的话,视图可视区域就被确定啦。
做一个形象的比喻。View的可视区域就是一面墙上的窗户,View的视图区域就相当于墙后边的优美景色。墙外风光无线,但是你只能看到窗户中的景色。如果窗户变大啦,外边风景不变,你看到的景色就大了一点;如果窗户向右下角移动了一段距离,你就会发现外边的景色好像是向左上角”移动”了一段距离。
2. 了解了1的内容. scrollView的的scroll的过此
3. 了解listview的滚动过程, 首先要了解listview缓存机制
当ListView第一次向适配器请求一个VIew的时候,convertView为null,因此需要新建一个convertView.
当ListView请求一个条目item1的VIew,并且item1已经超出屏幕之外,并进来一个相同类型的条目从底部进入到屏幕里面,这时convertVIew 不为null,而是等于item1。 你只需要获取新的数据装载到该View里面并返回回去。而不必要重新创建一个新的VIew
4. 所以, listview scroll: (我自己想的, 待验证)
listview的view大小和位置是固定的. 滑动的时候, translate 它的children. 当一个child translate出listview的可视范围后, 就将这个child remove掉, 放在Recycler里.
今天验证, 我想的是对的, 总体流程比较参照:
http://blog.csdn.net/guolin_blog/article/details/44996879
写的特别详细, 参照源码看下来完全可以理解了整个过程.
下一篇写吧~