-
}
-
}
上面代码中,对count
进行了两轮循环,其中第一轮是针对lp.isDecor
为true
的,意为:如果当前view是一个decoration装饰,并不是adapter提供的view则返回true。
显然,我们要探讨的是adapter提供的View是如何摆放的,所以忽略这一块。
而在下面的循环中,可以看到:
-
child.layout(childLeft, childTop,
-
childLeft + child.getMeasuredWidth(),
-
childTop + child.getMeasuredHeight());
这个便是child的排布的核心代码,追溯这4个参数,可以得知:第 1,3 参数表示left,right,他们都和一个 intloff=(int)(childWidth*ii.offset);
挂钩,而 第2,4参数表示 top,bottom,则并没有与任何动态参数相挂钩。
因此可以断定,ViewPager
的子View
排布,只会存在X轴方向上的位置偏差,在Y方向上会保持上下平齐。
其实还可以继续追溯 intloff=(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) {
-
if (DEBUG) Log.v(TAG,