博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
站在源码的角度全解Scroller工作机制(三)
阅读量:6733 次
发布时间:2019-06-25

本文共 922 字,大约阅读时间需要 3 分钟。

hot3.png

现在,已经对这两个方法有了基本的了解,我们再看看它们的用法。

在这个示例中对TextView分别调用和,代码如下:

当我们调用时,TextView的中的文本逐渐往其左侧滚动,当执行scrollTo()时TextView的中的文本会滚动到其右侧。在这是不是又印证了我们刚才的描述呢:执行scrollTo()和scrollBy()后View的内容发生了滚动,但是View本身是没有发生移动的。关于这点已经得到了验证,但是View的内容滚动的方向怎么和我们预想的不一样呢?平常我们不是说坐标是左负右正,上负下正么,为什么这里执行mTextView.scrollBy(30,0)时TextView的文本却是往X的负轴移动呢?

       其实,许多人都是有类似的疑问,现在我们一起来探究其产生的原因。

 

在scrollTo()的源码中我们看到,该方法最后会调用postInvalidateOnAnimation()对View进行重绘从而执行到invalidate()。在此以Android 6.0 API Level 23为例,对其进行剖析:

看到第4行代码的时候,是不是就恍然大悟了呢?

 

在进行重绘的时候在会利用l - scrollX, t - scrollY, r - scrollX, b - scrollY计算出新的l,t,r,b。

如果在调用scrollTo()和scrollBy()时传入的x,y为正值,那么新的l,t,r,b均会变小,从而导致View的内容向左且向上滚动。

 

如果在调用scrollTo()和scrollBy()时传入的x,y为负值,那么新的l,t,r,b均会变大,从而导致View的内容向右且向下滚动。

       刚才我们通过scrollTo()和scrollBy()作用于某个View,如果要想让多个View同时发生滚动,可以怎么办呢?很简单,只需要把这些View放到同一个ViewGroup中然后再调用这两个方法即可,例如mLinearLayout.scrollBy(50, 0)、mLinearLayout.scrollTo(100, 20)

 

转载于:https://my.oschina.net/u/2971691/blog/793925

你可能感兴趣的文章
Java将byte[]和int的互相转换
查看>>
10.1-10.2泛型算法
查看>>
【转】Objective-C学习笔记四:循环结构
查看>>
JavaBeans 中添加 private static final long serialVersionUID = 1L
查看>>
ORACLE RAC集群硬件资源管理与单节点的区别
查看>>
洛谷 5061 秘密任务——二分图染色
查看>>
bzoj 2836 魔法树——树链剖分
查看>>
linux基本命令
查看>>
如何从深层嵌套的循环中迅速跳出
查看>>
windows环境下mysql忘记密码如何重置
查看>>
浪潮之巅第七章 — 硅谷的见证人(惠普公司)
查看>>
「ubuntu」修改权限和owner命令
查看>>
改变presentModalView大小
查看>>
ASP存储过程参数数据类型
查看>>
获取元素offsetLeft值
查看>>
mapreduce开发 -- 多文件输出
查看>>
Server.CreateObject 失败解决方案
查看>>
lua table 中#,getn,maxn 的区别
查看>>
IAP远程在线升级
查看>>
C语言进阶剖析第三课--浮点数的秘密
查看>>