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中的滑动都是瞬时滑动。没有任何的过渡效果.


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

scrollview的原理及一些属性

在滚动过程当中,其实是在修改原点坐标 当手指触摸后, scroll view会暂时拦截触摸事件,使用一个 计时器,假如在计时器到点后,没有发生手指移动事件, 那么,scroll view发送trac...
  • h22111
  • h22111
  • 2016年06月12日 18:40
  • 404

Android 带你从源码的角度解析Scroller的滚动实现原理

今天给大家讲解的是Scroller类的滚动实现原理,可能很多朋友不太了解该类是用来干嘛的,但是研究Launcher的朋友应该对他很熟悉,Scroller类是滚动的一个封装类,可以实现View的平滑滚动...

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

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

android之用scrollview实现控件滑动固定效果

项目中最近用到需要布局滑动到某一个地方的时候某个控件固定在屏幕顶部不动,就去研究了下,思路其实挺简单的,我置顶的悬浮控件上边还需要留个控件,比如搜索框之类的,看个人需求了...
  • gsw333
  • gsw333
  • 2016年02月04日 15:49
  • 5966

android之ScrollView滑动到指定的View

昨天看有人问ScrollView滑动到指定的View,说实话我没做过这需求,但是一看应该很简单吧,不就是计算下需要滑动的距离然后调用下滑动方法进行滑动吗?然后他又说不行,我反正是不知道为啥了,难道我理...
  • gsw333
  • gsw333
  • 2016年11月25日 11:17
  • 4262

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

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

实现ScrollView滑动时标题栏的隐藏效果

想把最近做项目学会的东西整理一下,项目中有一个要求,就是实现ScrollView滑动时标题栏的隐藏效果,整体效果是ScrollView从头往下滑动的时候慢慢的隐藏标题栏的效果 注意:我的标题栏是自己...

android自定义View之自定义可置顶ScrollView,View滑动原理简析

使用各种App的时候,发现一个特点,现在的App在可以滑动的页面中,基本上都添加了一个置顶按钮的效果,使的用户可以很方便的回到顶部,就像网页中几乎所有的页面都有置顶效果按钮一样,觉得这个交互不错,以后...

Android ScrollView自动滑动问题解决

项目中大量布局用到了ScrollView布局嵌套,而在切换数据是会发生内容自动滑动上移的情况,而此问题发生的原因是:ScrollView中子布局的的焦点的变化导致ScrollView自动的滑动 。这种...
  • t_an123
  • t_an123
  • 2017年06月15日 21:34
  • 872

【Android】Scrollview返回顶部,快速返回顶部的功能实现,详解代码。

作者:程序员小冰,GitHub主页:https://github.com/QQ986945193 新浪微博:http://weibo.com/mcxiaobing 首先给大家看一下我们今天这个...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android中scrollView的滑动原理
举报原因:
原因补充:

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