}
}
}
上面代码中,对 `count` 进行了两轮循环,其中第一轮是针对 `lp.isDecor` 为 `true`的,
意为:如果当前view是一个 decoration 装饰,并不是adapter提供的view 则返回 true
显然,我们要探讨的是 adapter提供的View 是如何摆放的,所以忽略这一块。
而在下面的循环中,可以看到
```java
child.layout(childLeft, childTop,
childLeft + child.getMeasuredWidth(),
childTop + child.getMeasuredHeight());
这个便是child的排布的核心代码,追溯这4个参数,可以得知:第 1,3 参数 表示 left ,right , 他们都和一个 int loff = (int) (childWidth * ii.offset);
挂钩,而 第2,4 参数表示 top,bottom , 则 并没有与 任何动态参数相挂钩。
因此可以断定,ViewPager
的子View
排布,只会存在X轴方向上的位置偏差,在Y方向上会保持上下平齐。
其实还可以继续追溯 int loff = (int) (childWidth * ii.offset);
看看 x轴方向上的位置偏差是如何造成的,但是目的已经达到,到有必要的时候再去追查。
确定是横向排布,那么左右滑动逻辑又是怎么样的呢?
找到 onTouchEvent()
方法, 并且在其中找到 ACTION_MOVE 逻辑分支:
case MotionEvent.ACTION_MOVE:
if (!mIsBeingDragged) {
final int pointerIndex = ev.findPointerIndex(mActivePointerId);
if (pointerIndex == -1) {
// A child has consumed some touch events and put us into an inconsistent
// state.
needsInvalidate = resetTouch();
break;
}
final float x = ev.getX(pointerIndex);
final float xDiff = Math.abs(x - mLastMotionX);
final float y = ev.getY(pointerIndex);
final float yDiff = Math.abs(y - mLastMotionY);
if (DEBUG) {
Log.v(TAG, "Moved x to " + x + "," + y + " diff=" + xDiff + "," + yDiff);
}
if (xDiff > mTouchSlop && xDiff > yDiff) {