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);
}
Другие вопросы по тегам