Android ViewPager2 setPageMargin не решена
Я хочу реализовать Карусель, используя View Pager2
с предварительным просмотром левой и правой страницы, например:
Изначально я использовал представление pager1, которое поддерживал. Теперь я думаю, что это удалено
viewPagerhost.setPageMargin(20);
Любая идея, как мы можем добиться этого с помощью View Pager 2
0 ответов
MarginPageTransformer
не могу помочь вашей потребности.
Вы должны использовать пользовательский setPageTrarnsformer.
Шаг 1
Вот мой метод расширения для этого.
Вы можете проверить детали в этой статье Средняя статья
fun ViewPager2.setShowSideItems(pageMarginPx : Int, offsetPx : Int) {
clipToPadding = false
clipChildren = false
offscreenPageLimit = 3
setPageTransformer { page, position ->
val offset = position * -(2 * offsetPx + pageMarginPx)
if (this.orientation == ViewPager2.ORIENTATION_HORIZONTAL) {
if (ViewCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_RTL) {
page.translationX = -offset
} else {
page.translationX = offset
}
} else {
page.translationY = offset
}
}
}
Шаг 2
установите pageMarginPx и offsetPx с вашим вариантом использования.
<resources>
<dimen name="pageMargin">20dp</dimen>
<dimen name="pagerOffset">30dp</dimen>
<dimen name="pageMarginAndoffset">50dp</dimen>
</resources>
Шаг 3
установите боковое поле элемента макета в XML.
нравится
<androidx.cardview.widget.CardView
app:cardCornerRadius="12dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:layout_marginLeft="@dimen/pageMarginAndoffset"
android:layout_marginRight="@dimen/pageMarginAndoffset"
android:layout_width="match_parent"
android:layout_height="match_parent">
Теперь нам нужно использовать setPageTransformer()
в Version 1.0.0-alpha05
Новые особенности
ItemDecorator
введен с поведением, совместимым с RecyclerView.MarginPageTransformer
введен для обеспечения возможности создания пространства между страницами (за пределами вставки страницы).CompositePageTransformer
введен, чтобы обеспечить возможность объединения нескольких PageTransformers.
ОБРАЗЕЦ КОДА
myViewPager2.setPageTransformer(new MarginPageTransformer(1500));
Я использовал подход MJ Studio для создания своего собственного
PageTransformer
который также изменяет поле страницы следующим образом:
class OffsetPageTransformer(
@Px private val offsetPx: Int,
@Px private val pageMarginPx: Int
) : ViewPager2.PageTransformer {
override fun transformPage(page: View, position: Float) {
val viewPager = requireViewPager(page)
val offset = position * -(2 * offsetPx + pageMarginPx)
val totalMargin = offsetPx + pageMarginPx
if (viewPager.orientation == ViewPager2.ORIENTATION_HORIZONTAL) {
page.updateLayoutParams<ViewGroup.MarginLayoutParams> {
marginStart = totalMargin
marginEnd = totalMargin
}
page.translationX = if (ViewCompat.getLayoutDirection(viewPager) == ViewCompat.LAYOUT_DIRECTION_RTL) {
-offset
} else {
offset
}
} else {
page.updateLayoutParams<ViewGroup.MarginLayoutParams> {
topMargin = totalMargin
bottomMargin = totalMargin
}
page.translationY = offset
}
}
private fun requireViewPager(page: View): ViewPager2 {
val parent = page.parent
val parentParent = parent.parent
if (parent is RecyclerView && parentParent is ViewPager2) {
return parentParent
}
throw IllegalStateException(
"Expected the page view to be managed by a ViewPager2 instance."
)
}
}
Таким образом, вы можете просто позвонить:
viewPager.setPageTransformer(OffsetPageTransformer(offsetPx, pageMarginPx))
MarginPageTransformer
помогает определять промежутки между страницами.
offscreenPageLimit
позволяют определить, сколько страниц должно отображаться за пределами экрана.
Пример кода:
viewPager2.offscreenPageLimit = 3
viewPager2.setPageTransformer(MarginPageTransformer({MARGIN AS PX}));
Вы можете использовать этот код
viewPager.setPageTransformer(new MarginPageTransformer(margin as PX));
но если вы хотите использовать DP, вы можете использовать приведенную ниже функцию для преобразования PX в DP
private int pxToDp(int px) {
return (int) (px / Resources.getSystem().getDisplayMetrics().density);
}