前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android scrollTo和scrollBy方法使用解析

Android scrollTo和scrollBy方法使用解析

作者头像
砸漏
发布2020-11-04 11:41:45
1.6K0
发布2020-11-04 11:41:45
举报
文章被收录于专栏:恩蓝脚本

在一个View中,系统提供了scrollTo、scrollBy两种方式来改变一个View的位置。这两个方法的区别非常好理解,与英文中To与By的区别类似,scrollTo(x, y)标识移动到一个具体的坐标点(x, y),而scrollBy(dx, dy)表示移动的增量为dx、dy。

在获取偏移量后使用scrollBy来移动View,代码如下所示:

代码语言:javascript
复制
int offsetX = x - lastX; 
int offsetY = y - lastY; 
scrollBy(offsetX, offsetY); 

但是,当我们拖动View的时候,你会发现View并没有移动!难道是我们方法写错了吗?其实,方法并没有写错,View也确实移动了,只是它移动的并不是我们想要移动的东西。scrollTo、scrollBy方法移动的是View的content,即让View的内容移动,如果在ViewGroup中使用scrollTo、scrollBy方法,那么移动的将是所有子View,但如果在View中使用,那么移动的将是View的内容,例如TextView,content就是它的文本;ImageView,content就是它的drawable对象。

相信通过上面的分析,应该知道为什么不能再View中使用这两个方法来拖动这个View了。那么我们就该View所有的ViewGroup中来使用scrollBy方法,移动它的子View,代码如下所示:

代码语言:javascript
复制
((View) getParent()).scrollBy(offsetX, offsetY); 

但是,当再次拖动View的时候,你会发现View虽然移动了,但却在乱动,并不是我们想要的跟随触摸点的移动儿移动。这里需要先了解一下视图移动的一些知识。大家在理解这个问题的时候,不妨这样想象手机屏幕是一个中空的盖板,盖板下面是一个巨大的画布,也就是我们想要显示的视图。当把这个盖板盖在画布上的某一处时,透过中间的矩形,我们看见了手机屏幕上想要显示视图,而画布上其他地方的视图,则被盖板盖住了无法看见。我们的视图与这个例子非常类似,我们没有看见视图,并不代表它就不存在,有可能只是在屏幕外面而已。当调用scrollBy方法时,可以想象为外面的盖板在移动,这么说比较抽象,来看一个具体的例子:

如下图:中间的矩形相当于屏幕,即可视区域。后面的content就相当于画布,代表视图。大家可以看到,只有视图的中间的部分目前是可视的,其他部分都不可见。在可见区域中,我们设置了一个Button,它的坐标为(20, 10)。

下面使用scrollBy方法,将盖板(屏幕、可视区域),在水平方向上向X轴正方向(右方)平移20,在竖直方向上向Y轴正方向(下方)平移10。

我们可以发现,虽然设置scrollBy(20,10),偏移量均为X轴、Y轴正方向上的正数,但是在屏幕的可视区域内,Button却向X轴、Y轴负方向上移动了。这就是因为参考系选择的不同,而产生的不同效果。

通过上面的分析可以发现,如果将scrollBy中的参数dx和dy设置为证书,那么content将向坐标负方向移动;如果将scrollBy中的参数dx和dy设置为负数,那么content将向坐标轴正方向移动。因此回到前面的例子,要实现跟随手指移动而滑动的效果,就必须将偏移量改为负值,代码如下:

代码语言:javascript
复制
int offsetX = x - lastY; 
int offsetY = y - lastY; 
((View) getParent()).scrollBy(-offsetX,-offsetY); 

再去试验一下,大家就可以发现,效果与前面几种方式的效果相同了。类似地,在使用绝对坐标时,也可以通过使用scrollTo方法来实现这一效果。

总结

以上所述是小编给大家介绍的Android scrollTo和scrollBy方法使用解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对ZaLou.Cn网站的支持!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档