Android scrollTo和scrollBy方法使用解析

所属分类: 软件编程 / Android 阅读数: 42
收藏 0 赞 0 分享

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

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

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,代码如下所示:

((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将向坐标轴正方向移动。因此回到前面的例子,要实现跟随手指移动而滑动的效果,就必须将偏移量改为负值,代码如下:

int offsetX = x - lastY; 
int offsetY = y - lastY; 
((View) getParent()).scrollBy(-offsetX,-offsetY); 

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

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

更多精彩内容其他人还在看

Android异常 java.lang.IllegalStateException解决方法

这篇文章主要介绍了Android异常 java.lang.IllegalStateException解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android中Split()字符串分割特殊用法案例详解

本文通过案例的形式给大家详细介绍了android中split()字符串分割特殊用法的知识,非常不错具有参考借鉴价值,感兴趣的朋友参考下
收藏 0 赞 0 分享

Android仿新浪微博启动界面或登陆界面(1)

这篇文章主要为大家详细介绍了Android仿新浪微博启动界面或登陆界面的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android仿新浪微博oauth2.0授权界面实现代码(2)

这篇文章主要为大家详细介绍了Android仿新浪微博oauth2.0授权界面实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android开发中使用sqlite实现新闻收藏和取消收藏的功能

本篇文章主要介绍了sqlite实现新闻收藏和取消收藏功能,主要涉及到oracle数据库方面的内容,对于Android开发sqlite实现收藏和取消功能感兴趣的朋友可以参考下本文
收藏 0 赞 0 分享

Android仿新浪微博分页管理界面(3)

这篇文章主要为大家详细介绍了Android仿新浪微博分页管理界面,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android UI自定义ListView实现下拉刷新和加载更多效果

这篇文章主要介绍了Android UI自定义ListView实现下拉刷新和加载更多效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android—基于微信开放平台v3SDK开发(微信支付填坑)

这篇文章主要介绍了Android—基于微信开放平台v3SDK开发(微信支付填坑),具有一定的参考价值,有需要的可以了解一下。
收藏 0 赞 0 分享

Android仿新浪微博自定义ListView下拉刷新(4)

这篇文章主要为大家详细介绍了Android仿新浪微博自定义ListView下拉刷新,重点介绍了Adapter的详细代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android控件之使用ListView实现时间轴效果

这篇文章主要介绍了Android基础控件之使用ListView实现时间轴效果的相关资料,本文是以查看物流信息为例,给大家介绍了listview时间轴的实现代码,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多