andorid 与滑动相关的一些知识---getscrollY onscrollchange() scrollby scrollto等

2023-11-13

Android系统手机屏幕的左上角为坐标系,同时y轴方向与笛卡尔坐标系的y轴方向想反。通过提供的api如getLeft , getTopgetBottomgetRight可以获得控件在parent中的相对位置。同时,也可以获得控件在屏幕中的绝对位置,详细用法可参考android应用程序中获取view的位置

当我们编写一些自定义的滑动控件时,会用到一些api如scrollTo(),scrollBy(),getScrollX(), getScrollY()。由于常常会对函数getScrollX(), getScrollY()返回的值的含义产生混淆,尤其是正负关系,因此本文将使用几幅图来对这些函数进行讲解以方便大家记忆。

注意:调用View的scrollTo()和scrollBy()是用于滑动View中的内容,而不是把某个View的位置进行改变。如果想改变莫个View在屏幕中的位置,可以使用如下的方法。

调用public void offsetLeftAndRight(int offset)用于左右移动方法或public void  offsetTopAndBottom(int offset)用于上下移动。

                 如:button.offsetLeftAndRignt(300)表示将button控件向左移动300个像素。


scrollTo(int x, int y) 是将View中内容滑动到相应的位置,参考的坐标系原点为parent View的左上角。

       调用scrollTo(100, 0)表示将View中的内容移动到x = 100, y = 0的位置,如下图所示。注意,图中黄色矩形区域表示的是一个parent View,绿色虚线矩形为parent view中的内容。一般情况下两者的大小一致,本文为了显示方便,将虚线框画小了一点。图中的黄色区域的位置始终不变,发生位置变化的是显示的内容。


 同理,scrollTo(0, 100)的效果如下图所示:


scrollTo(100, 100)的效果图如下:


若函数中参数为负值,则子View的移动方向将相反。

scrollBy(int x, int y)其实是对scrollTo的包装,移动的是相当位置。 scrollTo(int x, int y)的源码和scrollBy(int x, int y)源码如下所示.

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * Move the scrolled position of your view. This will cause a call to 
  3.  * {@link #onScrollChanged(int, int, int, int)} and the view will be 
  4.  * invalidated. 
  5.  * @param x the amount of pixels to scroll by horizontally<pre name="code" class="java">    /** 
  6.  * Set the scrolled position of your view. This will cause a call to 
  7.  * {@link #onScrollChanged(int, int, int, int)} and the view will be 
  8.  * invalidated. 
  9.  * @param x the x position to scroll to 
  10.  * @param y the y position to scroll to 
  11.  */  
  12. public void scrollTo(int x, int y) {  
  13.     if (mScrollX != x || mScrollY != y) {  
  14.         int oldX = mScrollX;  
  15.         int oldY = mScrollY;  
  16.         mScrollX = x;  
  17.         mScrollY = y;  
  18.         invalidateParentCaches();  
  19.         onScrollChanged(mScrollX, mScrollY, oldX, oldY);  
  20.         if (!awakenScrollBars()) {  
  21.             postInvalidateOnAnimation();  
  22.         }  
  23.     }  
  24. }  

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /* @param y the amount of pixels to scroll by vertically */   
[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public void scrollBy(int x, int y) { scrollTo(mScrollX + x, mScrollY + y); }  


 
可见,mScrollX和mScrollY是View类中专门用于记录滑动位置的变量。这两个函数最终调用onScrollChanged()函数,感兴趣者可以参考他们的源代码。(在数值上getScrollY()与onScrollChanged(int l, int t, int oldl, int oldt)中的 t是相等的 都是view 与相对于初始位置的Y坐标) 

理解了scrollTo(int x, int y)和scrollBy(int x, int y)的用法,就不难理解getScrollX() 和getScrollY()。这两个函数的源码如下所示:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * Return the scrolled left position of this view. This is the left edge of 
  3.  * the displayed part of your view. You do not need to draw any pixels 
  4.  * farther left, since those are outside of the frame of your view on 
  5.  * screen. 
  6.  * 
  7.  * @return The left edge of the displayed part of your view, in pixels. 
  8.  */  
  9. public final int getScrollX() {  
  10.     return mScrollX;  
  11. }  

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * Return the scrolled top position of this view. This is the top edge of 
  3.  * the displayed part of your view. You do not need to draw any pixels above 
  4.  * it, since those are outside of the frame of your view on screen. 
  5.  * 
  6.  * @return The top edge of the displayed part of your view, in pixels. 
  7.  */  
  8. public final int getScrollY() {  
  9.     return mScrollY;  
  10. }  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

andorid 与滑动相关的一些知识---getscrollY onscrollchange() scrollby scrollto等 的相关文章

随机推荐

  • Lua 学习笔记:沙盒

    背景知识 Lua 给我的感觉是 各种内置函数和标准库的存在感都是比较强的 如果执行这句 for name in pairs G do print G end 就会把各种环境中已存在名称的打印出来 全局变量 比如字符串 VERSION 内置函
  • Linux系统简介和各发行版介绍

    一 Linux 简介 二 Linux和UNIX的关系及区别 UNIX 的发展历史 Linux 和 UNIX 的关系 区别 三 Linux 的发行版介绍 Linux各发行版简介 Debian 以社区的方式运作 Redhat 商业公司维护的发行
  • 使用 OpenSSL API 建立安全连接 - 双向认证

    使用 OpenSSL API 进行安全编程 一 概念 1 什么是 SSL SSL 是一个缩写 全称是 Secure Sockets Layer 它是支持在 Internet 上进行安全通信的标准 并且将数据密码术集成到了协议之中 数据在离开
  • mybatis log插件

    目前idea当中已经实施收费了 最近找了一个不收费的插件安装上重启一下就行了 点我下载提取码 sjc8
  • 如何提取视频的m3u8地址

    1 用360浏览器或者其他Chrome内核浏览器打开优酷网页 2 在播放页面按F12打开审核模式 3 点击如图图标模拟移动设备 4 设置模拟的设备 5 按F5刷新即可进入手机版网页 6 点击Network 7 点击Media 8 点击播放按
  • 2017年蓝桥杯B组C/C++省赛-分巧克力

    题目 题目链接 题解 二分 想到二分比实现二分要难点 可行解部分可以与不可行解部分完美地分隔开来 绿色部分是分成的巧克力比较小时都可以满足 而大于一定程度的时候就不可行了 所以可以将其抽象成小于可行 大于不可行的二分问题 在判断时 遍历全部
  • JAVA的分支结构

    分支结构 基本概述 当需要进行条件判断的时候 并且根据条件是否成立来执行某一段代码的时候 需要分支结构 1 if结构 if 布尔表达式 语句块 如果布尔表达式为true将执行的语句 如果布尔表达式的值为 true 则执行 if 语句中的代码
  • 四大私募量化策略解析——阿尔法、套利、期货CTA、高频交易

    近年来 随着证券市场规模的不断扩大 金融衍生产品不断推出 投资策略和盈利模式发生根本性改变 投资复杂程度日益提高 导致证券市场投资者的构成比例出现了相应的变化 专业投资管理人的占比越来越大 且有加速之势 另一方面 量化对冲投资策略以其中低风
  • Unity制作FPS Demo

    等到把这个Unity FPS Demo 僵尸杀手 完成后再详细补充一下 使用Unity制作FPS游戏的经历 今天做个标识
  • 算法入门Bu1:排序

    算法入门 BuBuBu 相关数据结构 栈 队列 链表 树 并差集 堆 图等 相关算法 排序 枚举 深度和广度优先搜索 图的遍历 图中最短路径算法 最小生成树算法 割点和割遍算法 二分图的最大匹配算法等 排序算法 简单的桶排序 特点 如果需要
  • Java HashMap底层实现

    HashMap 是 Java 使用频率最高的用于映射 键值对 处理的数据类型 JDK1 8 对 HashMap 底层的实现进行了优化 例如引入红黑树的数据结构和扩容的优化等 在JDK1 8以前HashMap是由数组 链表的数据结构组成的 J
  • 【整理】串口(RS232/RS485等)通讯中RTS/CTS,DTR/DSR的含义详解

    整理 串口 RS232 RS485等 通讯中RTS CTS DTR DSR的含义详解 RS232 crifan 7年前 2013 10 17 14942浏览 0评论 背景 之前就折腾过很多关于RTS CTS DTR DSR的内容 整理 RT
  • excel 文档管理服务器,Excel Server Tutorial

    在企事业单位的实际业务中所需要使用的信息 除了数据之外 还包括文档 文档是各种类别和格式的 它们可能是Word文件 如企业的规章制度 可能是AutoCAD文件 如产品设计图纸 也可能是视频 音频文件 如内部培训资料 等等 通常的管理信息系统
  • 计算之魂思考题1.4赛跑问题

    一 问题 假设由25名短跑者争夺比赛前三名 赛场上有5条赛道 一次可以有5名选手同时比赛 比赛不计时 只看相应名次 假设选手发挥稳定 也就是说如果约翰比张三跑得快 张三比凯莉跑得快 那么约翰一定比凯莉跑得快 最少需要几次比赛才能决出前三名
  • 墨者学院的靶场之SQL注入漏洞测试(布尔盲注)

    这是我作为小白第一次成功的把key找出来了 分享一下 墨者学院的靶场SQL注入漏洞测试 布尔盲注 IP地址 219 153 49 228 端口 40205 协议 http 首先我输入了IP地址和端口号 看到这个后 我按了F12看了后台的代码
  • 【华为OD机试】食堂供餐【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 某公司员工食堂以盒饭方式供餐 为将员工取餐排队时间降低为0 食堂的供餐速度必须要足够快 现在需要根据以往员工取餐的统计信息 计算出一个刚好能达成排队时间为0的最低供餐
  • 【华为OD机试真题】【python】 网上商城优惠活动(一)【2022 Q4

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 某网上商场举办优惠活动 发布了满减 打折 无门槛3种 优惠券 分别为 1 每满100元优惠10元 无使用数限制 如100 199元可以使用1张减
  • Ubuntu18.04/16.04调整屏幕分辨率至1920*1080

    Ubuntu在设置 显示里面的分辨率选择没有1920 1080 我们可以手动增加该分辨率配置 然后进行设置 参考文字和图片 crtl alt t 打开终端窗口 获取添加分辨率的格式 输入 cvt 1920 1080 查看显示器信息及已经支持
  • 安卓HAL层 so库文件加载原理

    本文分析代码基于安卓6 0 上层app通过jni调用hal层的hw get module函数获取硬件模块 这个函数是上层与hal打交道的入口 这里我们就具体来看看hw get module的实现 文件路径 vim hardware libh
  • andorid 与滑动相关的一些知识---getscrollY onscrollchange() scrollby scrollto等

    Android系统手机屏幕的左上角为坐标系 同时y轴方向与笛卡尔坐标系的y轴方向想反 通过提供的api如getLeft getTop getBottom getRight可以获得控件在parent中的相对位置 同时 也可以获得控件在屏幕中的