Use padding in pages instead of pageMargin

ViewPager pageMargin does some rounding when calculating the offset of
each page, leading to positions that are not integers at the snapping
points. This is usually not an issue, except that we use those positions
to drive the PageIndicator.

Instead, set padding on the pages and negative margin in
PagedTileLayout. As everything has clip false, this produces the exact
same effect.

Test: manual
Fixes: 187954110
Change-Id: Ie1055a34c26214b012e96e3ec032ce4db576694d
This commit is contained in:
Fabian Kozynski
2021-05-14 10:35:44 -04:00
parent 1dfd948440
commit 17abc7482f
3 changed files with 22 additions and 4 deletions

View File

@@ -18,4 +18,8 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tile_page"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
android:layout_height="match_parent"
android:paddingStart="@dimen/notification_side_paddings"
android:paddingEnd="@dimen/notification_side_paddings"
android:clipChildren="false"
android:clipToPadding="false" />

View File

@@ -80,8 +80,22 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout {
@Override
public void setPageMargin(int marginPixels) {
if (marginPixels != getPageMargin()) {
super.setPageMargin(marginPixels);
// Using page margins creates some rounding issues that interfere with the correct position
// in the onPageChangedListener and therefore present bad positions to the PageIndicator.
// Instead, we use negative margins in the container and positive padding in the pages,
// matching the margin set from QSContainerImpl (note that new pages will always be inflated
// with the correct value.
// QSContainerImpl resources are set onAttachedView, so this view will always have the right
// values when attached.
MarginLayoutParams lp = (MarginLayoutParams) getLayoutParams();
lp.setMarginStart(-marginPixels);
lp.setMarginEnd(-marginPixels);
setLayoutParams(lp);
int nPages = mPages.size();
for (int i = 0; i < nPages; i++) {
View v = mPages.get(i);
v.setPadding(marginPixels, v.getPaddingTop(), marginPixels, v.getPaddingBottom());
}
}

View File

@@ -295,7 +295,7 @@ public class QSContainerImpl extends FrameLayout {
qsPanelController.setContentMargins(mContentPadding, mContentPadding);
// Set it as double the side margin (to simulate end margin of current page +
// start margin of next page).
qsPanelController.setPageMargin(2 * mSideMargins);
qsPanelController.setPageMargin(mSideMargins);
} else if (view == mHeader) {
// No content padding for the header.
} else {