Android中scrollView的滑动原理

原创 2016年08月30日 08:42:36

android中所有View都是可以滑动的,其实所有的View都有两套坐标系,一个是指定View位置的XY,另一对则是指定View滑动坐标系,mScrollXmScrollY,两对坐标系统是完全独立的,即XY坐标的改变不会影响mScrollXmScrollY,反之也成立。

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

 mScrollXmScrollYView类中专门用于记录滑动位置的变量。这两个函数最终调用onScrollChanged()函数。

android的滑动原理就是:通过调用scrollTo(),使的View的滑动坐标系发生改变,并保存在mScrollXmScrollY这两个成员变量中,我们可以通过getScrollX()getScrollY(),获取滑动坐标值。

当我们调用scrollTo(100,0);时,发现View是向左滑动了,传入一个正数滑动的方向却是向左,这与我们平常理解的坐标轴是相反的,其实并不矛盾,因为滑动坐标系本来就与我们平常的坐标系统不一样,调用scrollTo方法,最终会执行到以下代码:

1. public void invalidate(int l, int t, int r, int b) {    

2.     if (ViewDebug.TRACE_HIERARCHY) {    

3.         ViewDebug.trace(this, ViewDebug.HierarchyTraceType.INVALIDATE);    

4.     }    

5.     

6.     if (skipInvalidate()) {    

7.         return;    

8.     }    

9.     if ((mPrivateFlags & (DRAWN | HAS_BOUNDS)) == (DRAWN | HAS_BOUNDS) ||    

10.             (mPrivateFlags & DRAWING_CACHE_VALID) == DRAWING_CACHE_VALID ||    

11.             (mPrivateFlags & INVALIDATED) != INVALIDATED) {    

12.         mPrivateFlags &= ~DRAWING_CACHE_VALID;    

13.         mPrivateFlags |= INVALIDATED;    

14.         mPrivateFlags |= DIRTY;    

15.         final ViewParent p = mParent;    

16.         final AttachInfo ai = mAttachInfo;    

17.         //noinspection PointlessBooleanExpression,ConstantConditions    

18.         if (!HardwareRenderer.RENDER_DIRTY_REGIONS) {    

19.             if (p != null && ai != null && ai.mHardwareAccelerated) {    

20.                 // fast-track for GL-enabled applications; just invalidate the whole hierarchy    

21.                 // with a null dirty rect, which tells the ViewAncestor to redraw everything    

22.                 p.invalidateChild(thisnull);    

23.                 return;    

24.             }    

25.         }    

26.         if (p != null && ai != null && l < r && t < b) {    

27.             final int scrollX = mScrollX;    

28.             final int scrollY = mScrollY;    

29.             final Rect tmpr = ai.mTmpInvalRect;    

30.             tmpr.set(l - scrollX, t - scrollY, r - scrollX, b - scrollY);    

31.             p.invalidateChild(this, tmpr);    

32.         }    

33.     }    

34. }    

看倒数第五行代码,更新滑动坐标系时,走的是 tmpr.set(l - scrollX, t - scrollY, r - scrollX, b - scrollY);传入一个正数后一减,就成了负数,然后就成了向左移动了;View中的滑动都是瞬时滑动。没有任何的过渡效果.


版权声明:本文为博主原创文章,未经博主允许不得转载。

android 中ScrollView的使用

android中布局一般都有两种方式,一种xml声明,另外一种则是程序声明: xml: xml version="1.0" encoding="utf-8"?> LinearLayou...
  • tw19811220
  • tw19811220
  • 2014年09月08日 01:11
  • 1368

10分钟详细解读android scrollview

一种可供用户滚动的层次结构布局容器,允许显示比实际多的内容。ScrollView是一种FrameLayout,意味需要在其上放置有自己滚动内容的子元素。子元素可以是一个复杂的对象的布局管理器。通常用的...
  • xuhuan_wh
  • xuhuan_wh
  • 2016年08月03日 15:40
  • 1912

android 弹性ScrollView(已优化)

想要的效果最近项目中想实现一个效果,效果如下: 网上demo展示就是上滑或者下滑,能实现弹性效果,代码大致如下:public class BounceScrollView extends Scrol...
  • a394268045
  • a394268045
  • 2016年07月12日 19:52
  • 9939

Android中HorizontalScrollView的使用总结

Android中HorizontalScrollView的使用总结
  • lixiang_Y
  • lixiang_Y
  • 2017年02月14日 17:47
  • 5423

一步一步学android之控件篇——ScrollView

一个手机的屏幕大小是有限的,那么我要显示的东西显示不下怎么办?这就会使用到ScrollView来进行滚动显示,他的定义如下: 可以看到ScrollView是继承于FrameLayout的,所以Sc...
  • zenglinkai
  • zenglinkai
  • 2013年08月30日 11:28
  • 3933

Android ScrollView的使用

转自:http://hi.baidu.com/chunying031/item/34f6a0e88721400c560f1d9f 下面是一个测试android滚动条的例子,只是简单的...
  • scy411082514
  • scy411082514
  • 2013年03月09日 21:10
  • 41459

[Android实例] Scroll原理-附ScrollView源码分析

From: http://www.eoeandroid.com/thread-553375-1-1.html 想象一下你拿着放大镜贴很近的看一副巨大的清明上河图, 那放大镜里可以看到的内容是很有...
  • fyfcauc
  • fyfcauc
  • 2015年01月24日 21:22
  • 897

scroll view 原理

 scroll view 原理在滚动过程当中,其实是在修改原点坐标当手指触摸后, scroll view会暂时拦截触摸事件,使用一个计时器,假如在计时器到点后,没有发生手指移动事件,那么,scroll...
  • diyagoanyhacker
  • diyagoanyhacker
  • 2010年12月08日 11:21
  • 2553

Android 对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果

随着移动互联网的快速发展,它已经和我们的生活息息相关了,在公交地铁里面都能看到很多人的人低头看着自己的手机屏幕,从此“低头族”一词就产生了,作为一名移动行业的开发人员,我自己也是一名“低头族”,上下班...
  • xiaanming
  • xiaanming
  • 2013年12月20日 09:04
  • 100085

android之ScrollView滑动到指定的View

昨天看有人问ScrollView滑动到指定的View,说实话我没做过这需求,但是一看应该很简单吧,不就是计算下需要滑动的距离然后调用下滑动方法进行滑动吗?然后他又说不行,我反正是不知道为啥了,难道我理...
  • gsw333
  • gsw333
  • 2016年11月25日 11:17
  • 5362
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android中scrollView的滑动原理
举报原因:
原因补充:

(最多只允许输入30个字)