viewpager解析笔记

以前拿到viewpager时我都是只管使用,不曾探究的。直到领导让做一个竖直滑动的viewpager时,我才想着要去了解一下viewpager的实现原理。那么,我就从源码的角度去分析,并巩固一下自定义view方面的知识。
viewpager解析笔记_第1张图片
viewpager(1).png

首先看这个方法,根据方法名顾名思义的了解,这个方法是判定viewpager是否能够水平滑动的方法。
Check if this ViewPager can be scrolled horizontally in a certain direction.(检查这个viewpager是否可以在指定的方向滑动)。
@param direction Negative to check scrolling left, positive to check scrolling right.(direction参数小于代表检查是否能够左滑,大于0代表是否能够右滑)。
@return Whether this ViewPager can be scrolled in the specified direction. It will always return false if the specified direction is 0.(这个viewpager是否可以在指定的方向上滑动。如果指定的方向是0的话,那么无论它能否在指定的方向上滑动都会返回false)
通过上面对注释的解释,那么我们就能很容易明白方法的作用。那么我们继续看代码:

  if (direction < 0) {
        return (scrollX > (int) (width * mFirstOffset));
    } else if (direction > 0) {
        return (scrollX < (int) (width * mLastOffset));
    } else {
        return false;
    }

通过对direction的判定,返回不同的结果。那这里又引入了final int width = getClientWidth();final int scrollX = getScrollX();这两个方法,那我们追踪这两个方法,看看到底干了什么:

 private int getClientWidth() {
    return getMeasuredWidth() - getPaddingLeft() - getPaddingRight();
}

我们可以看出,getClientWidth返回了viewpager的宽度。

而,关于getScrollX()方法,会追踪到view父类中,关于返回值,官方是这样描述的:The left edge of the displayed part of your view, in pixels.即返回了当前view显示部分的左边缘位置,单位是pixels。

public final int getScrollX() {
    return mScrollX;
}

那么我们再回到canScrollHorizontally()方法中。当

    if (direction < 0) {
        return (scrollX > (int) (width * mFirstOffset));
    }

时,如果当前显示的viewpager左边缘位置大于viewpager的第一个item的左边缘位置时,即说明当前viewpager的child显示的不是第一个item,那么就可以向左边滑动。反之,如果当前显示的viewpager右边缘位置小于最后一个iten位置的有边缘位置时,就可以向右滑动。这也就和官方的注释一一对应了。

你可能感兴趣的:(viewpager解析笔记)