美文网首页
both ScrollView and ListView can

both ScrollView and ListView can

作者: 小寒飞刀 | 来源:发表于2017-02-15 18:29 被阅读0次

在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

写的特别详细, 参照源码看下来完全可以理解了整个过程.

下一篇写吧~

相关文章

网友评论

      本文标题:both ScrollView and ListView can

      本文链接:https://www.haomeiwen.com/subject/cfgqwttx.html