Android ViewPager2 setPageMargin 未解决
Android ViewPager2 setPageMargin unresolved
我想使用 View Pager2
实现 Carousel,像这样预览左右页面:
最初我使用的是支持的view pager1。现在我认为它已被删除
viewPagerhost.setPageMargin(20);
知道我们如何使用 View Pager 2 实现此目的吗
现在我们需要在Version 1.0.0-alpha05
中使用setPageTransformer()
New features
ItemDecorator
引入了与 RecyclerView 一致的行为。
引入 MarginPageTransformer
以提供在页面之间(页面插图之外)创建 space 的能力。
CompositePageTransformer
引入以提供组合多个 PageTransformer 的能力。
示例代码
myViewPager2.setPageTransformer(new MarginPageTransformer(1500));
Check out my previous answer if you want to implement Carousel using View Pager2
MarginPageTransformer
无法满足您的需求。
您必须使用自定义 setPageTransformer。
第 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">
您可以使用此代码
viewPager.setPageTransformer(new MarginPageTransformer(margin as PX));
但是如果你想使用 DP,你可以使用下面的函数将 PX 转换为 DP
private int pxToDp(int px) {
return (int) (px / Resources.getSystem().getDisplayMetrics().density);
}
MarginPageTransformer
有助于定义页面之间的空间。
offscreenPageLimit
让您定义应在屏幕外呈现多少页。
代码示例:
viewPager2.offscreenPageLimit = 3
viewPager2.setPageTransformer(MarginPageTransformer({MARGIN AS PX}));
我使用 创建了我的自定义 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))
我想使用 View Pager2
实现 Carousel,像这样预览左右页面:
最初我使用的是支持的view pager1。现在我认为它已被删除
viewPagerhost.setPageMargin(20);
知道我们如何使用 View Pager 2 实现此目的吗
现在我们需要在Version 1.0.0-alpha05
setPageTransformer()
New features
ItemDecorator
引入了与 RecyclerView 一致的行为。
引入 MarginPageTransformer
以提供在页面之间(页面插图之外)创建 space 的能力。CompositePageTransformer
引入以提供组合多个 PageTransformer 的能力。
示例代码
myViewPager2.setPageTransformer(new MarginPageTransformer(1500));
Check out my previous answer if you want to implement Carousel using View Pager2
MarginPageTransformer
无法满足您的需求。
您必须使用自定义 setPageTransformer。
第 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">
您可以使用此代码
viewPager.setPageTransformer(new MarginPageTransformer(margin as PX));
但是如果你想使用 DP,你可以使用下面的函数将 PX 转换为 DP
private int pxToDp(int px) {
return (int) (px / Resources.getSystem().getDisplayMetrics().density);
}
MarginPageTransformer
有助于定义页面之间的空间。
offscreenPageLimit
让您定义应在屏幕外呈现多少页。
代码示例:
viewPager2.offscreenPageLimit = 3
viewPager2.setPageTransformer(MarginPageTransformer({MARGIN AS PX}));
我使用 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))