ViewPager size changes
Fix some bugs that happen when ViewPagers change size that could
cause pages to become misaligned.
Bug 6335994
Change-Id: Iada902dea1436858b902d2d85c81418a179af5a9
diff --git a/v4/java/android/support/v4/view/PagerTitleStrip.java b/v4/java/android/support/v4/view/PagerTitleStrip.java
index 1c91bf2..aa98ae2 100644
--- a/v4/java/android/support/v4/view/PagerTitleStrip.java
+++ b/v4/java/android/support/v4/view/PagerTitleStrip.java
@@ -238,7 +238,7 @@
mLastKnownCurrentPage = currentItem;
if (!mUpdatingPositions) {
- updateTextPositions(currentItem, mLastKnownPositionOffset);
+ updateTextPositions(currentItem, mLastKnownPositionOffset, false);
}
mUpdatingText = false;
@@ -266,10 +266,10 @@
}
}
- void updateTextPositions(int position, float positionOffset) {
+ void updateTextPositions(int position, float positionOffset, boolean force) {
if (position != mLastKnownCurrentPage) {
updateText(position, mPager.getAdapter());
- } else if (positionOffset == mLastKnownPositionOffset) {
+ } else if (!force && positionOffset == mLastKnownPositionOffset) {
return;
}
@@ -394,7 +394,7 @@
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
if (mPager != null) {
- updateTextPositions(mPager.getCurrentItem(), 0.f);
+ updateTextPositions(mPager.getCurrentItem(), 0.f, true);
}
}
@@ -408,7 +408,7 @@
// Consider ourselves to be on the next page when we're 50% of the way there.
position++;
}
- updateTextPositions(position, positionOffset);
+ updateTextPositions(position, positionOffset, false);
}
@Override
diff --git a/v4/java/android/support/v4/view/ViewPager.java b/v4/java/android/support/v4/view/ViewPager.java
index 5b80232..5220d30 100644
--- a/v4/java/android/support/v4/view/ViewPager.java
+++ b/v4/java/android/support/v4/view/ViewPager.java
@@ -1247,24 +1247,25 @@
}
private void recomputeScrollPosition(int width, int oldWidth, int margin, int oldMargin) {
+ final int widthWithMargin = width + margin;
if (oldWidth > 0 && !mItems.isEmpty()) {
final int xpos = getScrollX();
- final ItemInfo ii = infoForCurrentScrollPosition();
- final float pageOffset = (((float) xpos / width) - ii.offset) / ii.widthFactor;
- final int offsetPixels = (int) (pageOffset * width);
+ final int oldWidthWithMargin = oldWidth + oldMargin;
+ final float pageOffset = (float) xpos / oldWidthWithMargin;
+ final int newOffsetPixels = (int) (pageOffset * widthWithMargin);
- scrollTo(offsetPixels, getScrollY());
+ scrollTo(newOffsetPixels, getScrollY());
if (!mScroller.isFinished()) {
// We now return to your regularly scheduled scroll, already in progress.
final int newDuration = mScroller.getDuration() - mScroller.timePassed();
ItemInfo targetInfo = infoForPosition(mCurItem);
- mScroller.startScroll(offsetPixels, 0, (int) (targetInfo.offset * width), 0,
- newDuration);
+ mScroller.startScroll(newOffsetPixels, 0,
+ (int) (targetInfo.offset * widthWithMargin), 0, newDuration);
}
} else {
final ItemInfo ii = infoForPosition(mCurItem);
final int scrollPos =
- (int) ((ii != null ? Math.min(ii.offset, mLastOffset) : 0) * width);
+ (int) ((ii != null ? Math.min(ii.offset, mLastOffset) : 0) * widthWithMargin);
if (scrollPos != getScrollX()) {
completeScroll();
scrollTo(scrollPos, getScrollY());