web-dev-qa-db-ja.com

Android ViewPager2 SetPageMargin未解決)

このような左右のページのプレビューを使用して、_View Pager2_を使用してカルーセルを実装したいです。

enter image description here

最初に私はサポートされているView Pager1を使用していました。今、私はそれが取り除かれていると思います

_    viewPagerhost.setPageMargin(20);
_

View Pager 2を使ってこれを達成できる方法はあらゆるアイデア

15
Hitesh Sahu

私は使用しました 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))
 _
0
Gnzlt