blob: 0524f4bda442676ed6a92cb642bfe33b27c26b61 [file] [log] [blame]
/*
* Copyright 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package androidx.viewpager2.widget;
import android.view.View;
import android.view.ViewParent;
import androidx.annotation.NonNull;
import androidx.annotation.Px;
import androidx.core.util.Preconditions;
import androidx.recyclerview.widget.RecyclerView;
/**
* Adds space between pages via the {@link ViewPager2.PageTransformer} API.
* <p>
* Internally relies on {@link View#setTranslationX} and {@link View#setTranslationY}.
* <p>
* Note: translations on pages are not reset when this adapter is changed for another one, so you
* might want to set them manually to 0 when dynamically switching to another transformer, or
* when switching ViewPager2 orientation.
*
* @see ViewPager2#setPageTransformer
* @see CompositePageTransformer
*/
public final class MarginPageTransformer implements ViewPager2.PageTransformer {
private final int mMarginPx;
/**
* Creates a {@link MarginPageTransformer}.
*
* @param marginPx non-negative margin
*/
public MarginPageTransformer(@Px int marginPx) {
Preconditions.checkArgumentNonnegative(marginPx, "Margin must be non-negative");
mMarginPx = marginPx;
}
@Override
public void transformPage(@NonNull View page, float position) {
ViewPager2 viewPager = requireViewPager(page);
float offset = mMarginPx * position;
if (viewPager.getOrientation() == ViewPager2.ORIENTATION_HORIZONTAL) {
page.setTranslationX(viewPager.isRtl() ? -offset : offset);
} else {
page.setTranslationY(offset);
}
}
private ViewPager2 requireViewPager(@NonNull View page) {
ViewParent parent = page.getParent();
ViewParent parentParent = parent.getParent();
if (parent instanceof RecyclerView && parentParent instanceof ViewPager2) {
return (ViewPager2) parentParent;
}
throw new IllegalStateException(
"Expected the page view to be managed by a ViewPager2 instance.");
}
}