Android Scroll详解

男儿欲遂平生志,五经勤向窗前读。这篇文章主要讲述Android Scroll详解相关的知识,希望能为你提供帮助。
在前边的文章中,我们已经对Android触摸事件处理有了大致的了解,并且详细探讨了MotionEvent的相关用法。对之前文章中的知识还不是很了解的同学,请阅读《android MotionEvent详解》
 
今天,我们就来探讨一下Android中界面滚动效果的相关机制,本篇文章主要讲解一下滚动相关的知识点,之后的文章会涉及实际的代码和原理。希望大家阅读完这篇文章之后,能够了解或者掌握一下知识:
 

  • Android 视图的组成部分
  • mScrollX和mScrollY对视图显示的影响
  • scrollTo和scrollBy的使用
  • invalidate和postInvalidate的区别
 
View的mScrollX和mScrollY
 
我们都知道,View中有两个重要的成员变量,mScrollX,mScrollY.它们分别代表视图内容(view content)水平方向和竖直方向的滚动距离(app开发ty300.com)。我们可以通过setScrollX和setScrollY来个函数来改变它们的值,从而来滚动视图的内容。
 
在这里需要强调的是,mScrollX和mScrollY会导致视图内容(view content)变化,但是不会影响视图背景(background)。
 
看到这里同学们或许会有写疑问,视图的内容和背景有什么区别呢?视图还有哪些组成部分呢?
 
我们可以从View的draw方法中得知View的组成部分。
 
// http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/view/View.java#View
public  void  draw(Canvas  canvas)  {
【Android Scroll详解】                  ........
                /*
                * Draw traversal performs several drawing steps which must be executed
                * in the appropriate order:
                *
                *            1. Draw the background
                *            2. If necessary, save the canvas‘ layers to prepare for fading
                *            3. Draw view‘s content
                *            4. Draw children
                *            5. If necessary, draw the fading edges and restore layers
                *            6. Draw decorations (scrollbars for instance)
                */
 
                // Step 1, draw the background, if needed
                if  (!dirtyOpaque)  {
                        drawBackground(canvas);
                }
                .......
 
                // Step 2, save the canvas‘ layers
                .......
                // Step 3, draw the content
                if  (!dirtyOpaque)  onDraw(canvas);
 
                // Step 4, draw the children
                dispatchDraw(canvas);
 
                // Step 5, draw the fade effect and restore layers
                .......
                if  (drawTop)  {
                        matrix.setScale(1,  fadeHeight  *  topFadeStrength);
                        matrix.postTranslate(left,  top);
                        fade.setLocalMatrix(matrix);
                        p.setShader(fade);
                        canvas.drawRect(left,  top,  right,  top  +  length,  p);
                }
                .....
                // Step 6, draw decorations (scrollbars)
                onDrawScrollBars(canvas);
                ......
        }
 
View显示内容由一下几个部分组成:
 
  • 背景(background)
  • 本身的内容(content)
  • 子视图
  • 边界渐变效果(fade effect),上下左右四个边界都可能会有渐变效果,代码中只显示了上边界的渐变效果绘制。
  • 边框或者装饰效果(decorations),比如滚动条
 
举个例子吧,我们都知道在布局文件中,TextView有两个比较重要的属性:background,text。background可以设置TextView的背景,而text则是设置要绘制字体内容。
稿源:勤快学QKXue.NET
阅读完整Android Scroll详解

    推荐阅读