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

Android系统手机屏幕的左上角为坐标系,同时y轴方向与笛卡尔坐标系的y轴方向想反。通过提供的api如getLeft , getTop, getBottom, getRight可以获得控件在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

  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

  1. /* @param y the amount of pixels to scroll by vertically */

[java] view
plain
copy

  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

  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

  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. }
时间: 2024-07-31 17:49:51

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

[转]一些NSArray,NSDictionary,NSSet相关的算法知识

iOS编程当中的几个集合类:NSArray,NSDictionary,NSSet以及对应的Mutable版本,应该所有人都用过.只是简单使用的话,相信没人会用错,但要做到高效(时间复杂度)精确(业务准确性),还需要了解其中所隐藏的算法知识. 在项目当中使用集合类几乎是不可避免的,集合类的使用场景其实可以进行抽象的归类.大多数时候我们需要将若干个对象(object)暂时保存起来,以备后续的业务逻辑进行操作,「保存和操作」,或者说「存与取」,对应到计算机世界的术语就是读和写.最初保存的时候我们Ins

音频相关的基本知识

最近的项目需要和音频打交道,所以网上搜集了一些音频相关的基本知识,整理如下 自然界中的声音非常复杂,波形极其复杂,通常我们采用脉冲编码码调制编码,即PCM编码.PCM编码通过抽样.量化.编码三个步骤将连续变化的模拟信号转换为数字信号 采样(sample) 数码音频系统是通过将声波波形转换成一连串的二进制数据来再现原始声音的(原始声音是模拟信号),实现这个步骤使用的设备是模/数转换器(A/D转换器,或者ADC,或者analog to digital convert).它以每秒上万次的速率对声波进行

操作系统相关硬件基础知识

http://blog.csdn.net/oqq_5518/article/details/35232097 相关知识:数字逻辑电路.计算机组成原理. 操作系统 开关呈开启状态,给予一定的电压,通电,1. 开关呈关闭状态,断电,0. 运算器.控制器.存储器.输入设备.输出设备 利用控制位实现线路复用,利用寄存器解决线路复用带来的数据覆盖问题(暂存). ROM: RAM:内存 中断机制解决CPU不断进行对IO设备轮询的问题,减少CPU的中断次数,提高性能. 北桥(高速总线控制器):内存 现在的内存

qt绘图相关的基础知识

近期,从新提升一下软件平台中的组态部分,图形组态是最直观的界面操作入口,设计好,提高软件的使用效率.和数据可视化相比,图形组态更能说明业务逻辑关系. Qt绘图知识主要由三大部分:普通2D绘图;图形视图,动画相关,3D绘图. 下面是主要知识基础点: 一 2D绘图 1.1基本绘制与填充 1.2坐标系统 1.3组合绘制:文字,路径,图像 1.4双缓冲绘图 就是在绘制时,先将所有内容都绘制到一个绘图设备上,然后将整个图像绘制到部件上显示出来.使用双缓冲绘图,可以避免显示时闪烁现场. 1.5其它相关知识点

白盒测试相关的一些知识

在白盒测试中,可以使用各种测试方法进行测试.下面这篇文章,可能比较枯燥,如果不乐意读,可以先收藏.如果在你的工作中真遇到白盒测试的话,可以回过头再来看看,还是值得读一读. 一般来说,白盒测试时要考虑以下5个问题: 1)测试中尽量先用自动化工具来进行静态结构分析. 2)测试中建议先从静态测试开始,如:静态结构分析.代码走查和静态质量度量,然后进行动态测试,如:覆盖率测试. 3)将静态分析的结果作为依据,再使用代码检查和动态测试的方式对静态分析结果进行进一步确认,提高测试效率及准确性. 4)覆盖率测

测量行业(RTK)相关的小知识总结

RTK测量系统,一般需要先架设基准站(参考站),数据链模式外挂大电台(有天线大功率模式,理想范围方圆18公里以内).基准站通过收到卫星(多星)进行计算出当前的位置. 其中涉及到频率的设置,波特率,以及协议(常用的天宝协议,透明协议等). 这些参数的设置就是输出到移动站(流动站)需要设置的.移动站设置了跟基准站相同的频率以及其它参数.那么就会接收基准站数据解算出移动站的解算数据以及其它相关的位置精度等.最后移动站输出到移动端的数据通常是按照A0183标准协议输出.携带相关的参数. 静态采集:是在一

h5 slider页面滑动相关问题

1.touchend事件不能触发? a.在touchstart中添加event.preventDefault(),该方法会阻止元素的默认事件,如<a>标签的超链接无法响应,但是click事件可以通过tap事件代替. b.在touchmove中添加event.preventDefault(),该方法在touchstart的时候不会阻止默认事件,所以可以使用click和a标签的超链接 2.在iphone手机中无法触发iframe的播放按钮? 原因:translate3d会导致页面的焦点错误 方法:

Android 相关重难点知识整理

[原文] 集合 对 HashMap 进行排序: HashMap 本身无序,但其子类 LinkedHashMap 使用链表结构,实现了有序.通过 HashMap#entrySet() 方法可以将 Map 转为 Set<Entry> ,再在 ArrayList 的构造函数中可以传入 Collections ,正好 Set 和 List 的父类就是 Collections ,这样就可以调用 Collections.sort(list, comparator) 进行排序了.排序好后,使用 for 遍历

andorid 向上滑动控制标题栏显示

要实现这样的功能,原理不难,监听滑动距离再设置标题栏的透明度 下面是监听一个带头view的list实现核心代码: mbar是标题栏 mListView.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsL