Android ViewPager2 setPageMargin无法解析

时间:2019-05-13 14:26:32

标签: android carousel android-viewpager2

我想使用 View Pager2 实施Carousel,并预览左右页面,如下所示:

enter image description here

最初,我使用的是受支持的视图pager1。现在我认为它已被删除

    viewPagerhost.setPageMargin(20);

任何想法我们如何使用View Pager 2来实现这一目标

5 个答案:

答案 0 :(得分:1)

MarginPageTransformer无法满足您的需求。

您必须使用自定义 setPageTrarnsformer


步骤1

这是我的扩展方法。

您可以在本文中查看详细信息 Medium article

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">

答案 1 :(得分:0)

现在我们需要在Version 1.0.0-alpha05中使用setPageTransformer()

  

新功能

  • ItemDecorator引入了与RecyclerView一致的行为。
  • MarginPageTransformer的引入是为了能够在页面之间(页面插图之外)创建空间。
  • CompositePageTransformer被引入以提供组合多个PageTransformer的功能。

示例代码

myViewPager2.setPageTransformer(new MarginPageTransformer(1500));

答案 2 :(得分:0)

您可以使用此代码

select 
    Field1, 
    Field2,
    Field3,
    Field4 
from temp_table
lateral view posexplode(Field2) pn as f2_1,f2_2, Field2
lateral view posexplode(Field3) pn as f3_1,f3_2, Field3 
lateral view posexplode(Field3) pn as f4_1,f4_2, Field4
where 
    (f2_1 == F3_1 and f3_1 == f4_1) and/or (f2_2 == F3_2 and f3_2 == f4_2)

但是如果要使用DP,可以使用以下功能将PX转换为DP

   viewPager.setPageTransformer(new MarginPageTransformer(margin as PX));

答案 3 :(得分:0)

MarginPageTransformer有助于定义页面之间的空间。

offscreenPageLimit让您定义应在屏幕外呈现多少页面。

代码示例:

viewPager2.offscreenPageLimit = 3
viewPager2.setPageTransformer(MarginPageTransformer({MARGIN AS PX}));

答案 4 :(得分:0)

我使用MJ Studio's approach创建了自定义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))