Android scrollTo和scrollBy方法使用解析
在一个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方法使用解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
- 无图片字体icon
- 数据结构(三):栈与队列
- 3555: [Ctsc2014]企鹅QQ
- 3381: [Usaco2004 Open]Cave Cows 2 洞穴里的牛之二
- 3097: Hash Killer I
- 3390: [Usaco2004 Dec]Bad Cowtractors牛的报复
- 1684: [Usaco2005 Oct]Close Encounter
- 算法模板——Dinic最小费用最大流
- 算法模板——Dinic网络最大流 1
- SQL Server 使用全文索引进行页面搜索
- 2764: [JLOI2011]基因补全
- 1000: A+B Problem(NetWork Flow)
- 博弈论进阶之Multi-SG
- 2929: [Poi1999]洞穴攀行
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 【排序】堆排序
- redis灵魂拷问:怎样搭建一个哨兵主从集群
- 是时候给你的鼠标指针更换样式换下风格体验了!如何卸载与安装鼠标指针?
- Linux设置虚拟内存
- SSM 单体框架 - 教育平台后台管理系统:接口文档
- java学习应用篇|使用环境变量做一些工具
- 【Java8新特性】06 新的日期和时间:LocalDate LocalTime LocalDateTime
- UNSAFE和Java 内存布局
- 【玩转Redis面试第1讲】Redis数据结构和常用命令速记
- SSM 单体框架 - 教育平台后台管理系统:课程模块
- 【玩转Redis面试第2讲】面试官再问Redis事务把这篇文章扔给他
- SSM 单体框架 - 教育平台后台管理系统:Maven 进阶使用
- SSM 单体框架 - 教育平台后台管理系统:广告和用户模块开发
- 杀死进程
- SSM 单体框架 - 教育平台后台管理系统:权限模块开发