网站首页 > 知识剖析 正文
Android开发中,在自定义控件的时候,如果涉及到滑动事件,经常需要使用View提供的诸如scrollTo()、scrollBy()、getScrollX()、getScrollY()等方法。但在这些api的实际使用过程中,开发人员很容易在移动方向、移动距离上产生迷惑,本文通过图例总结了这四种方法的区别和联系。
在讲解之前,首先需要明白的一点时,在Android手机屏幕坐标系中,坐标原点(0, 0)位于左上角,X轴方向向右为正方向,但Y轴方向与“笛卡尔”坐标系中的Y轴方向相反,即向下为Y轴正方向。
同理,View相对于它的父容器ParentView的相对位置的坐标变化方向也是与上图坐标系方向一致的。下面是亦枫列举的关于scrollTo()、scrollBy()、getScrollX()和getScrollY()的一些知识点和容易混淆的地方。为了更好地讲述,先贴上源码:
滑动对象
scrollTo和scrollBy用于滑动View的内容,而不是改变View本身所处的位置。所以,单独的View滑动很少见,更多的是ViewGroup调用scroll方法滑动子控件的位置。比如,使用TextView对象调用scrollTo或者ScrollBy方法,会发现TextView里面的文本内容的位置发生改变,而TextView本身所处的位置没有变化。
getScrollX()和getScrollY()
返回值mScrollX和mScrollY分别表示距离起始位置的X轴或Y轴方向上的偏移量,而不是View在X轴或Y轴方向上的坐标值,用于记录偏移增量的两个变量。所以,mScrollX和mScrollY的初始值为0和0。
scrollTo(int x, int y)
从源码中可以看出,scrollTo移动的目标位置x和y值是以初始化的mScrollX和mScrollY为参考点的,只要位置发生偏移,就对mScrollX和mScrollY赋新值。注意,这里的(x,y)理解为针对初始化值的偏移量,比如,我想移动到(100,100)这个位置,那么偏移量就是(0,0)-(100,100)=(-100,100),所以调用的时候就是view.scrollTo(-100, -100),这样才能达到我们想要的偏移效果。
scrollBy(int x, int y)
从源码中可以看到,scrollBy依旧调用了scrollTo方法:scrollTo(mScrollX + x, mScrollY + y),只是参考点不再是初始化时的(0,0),相对于当前位置的偏移量。
最后,通过图例来说明上述所讲的内容。
初始化视图(为了展示效果,此处故意将子View和父View大小岔开):
以scrollTo的正负值移动为例来说明移动方向:
scrollBy(int x,int y)在正负值的移动方向和scrollBy一致,这里就不重复列举了。
猜你喜欢
- 2025-03-06 基于Selenium4+PageObject模式的Web自动化测试最佳实践
- 05-05vin码怎么查车型?车辆VIN码的第十位代表什么信息?
- 05-05Java数组数据的操作之检查日期格式是否正确
- 05-05苹果序列号怎么看生产日期和产地?
- 05-05参考文献中的M J N D字母代表什么?
- 05-05闲鱼交易技巧,满满的干货(闲鱼的交易流程怎么样的?我是买家)
- 05-05忘记自已多少岁了?可试试年龄计算器
- 05-05汽车-剖析、解析车架号(VIN)中的第10位-车型年份
- 05-05干货|史上最全波特酒年份指南(波特酒 年份)
- 最近发表
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)