我有一个配置了各种扩展函数的回收器视图,以居中并查看下一项:
fun RecyclerView.pageSnap() = this.post {
if (this.onFlingListener == null) PagerSnapHelper().attachToRecyclerView(this)
}
fun RecyclerView.snapCenterWithMargin(left: Int, top: Int, right: Int, bottom: Int) {
val offsetItemDecoration = SnapCenterWithMargin(left, top, right, bottom)
this.addItemDecoration(offsetItemDecoration)
}
private class SnapCenterWithMargin(
private val left: Int,
private val top: Int,
private val right: Int,
private val bottom: Int
) : RecyclerView.ItemDecoration() {
override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
view.measure(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)
val position = parent.getChildAdapterPosition(view)
val firstItem = 0
val lastItem = state.itemCount - 1
when (position) {
firstItem -> {
val firstPadding = (parent.width) / 2 - view.measuredWidth / 2
outRect.set(firstPadding, 0, 0, 0)
}
lastItem -> {
val lastPadding = (parent.width) / 2 - view.measuredWidth / 2
outRect.set(0, 0, lastPadding, 0)
}
else -> {
outRect.set(left, top, right, bottom)
}
}
}
}
问题是 ListAdapter 动画在这种方法中很糟糕。然后我尝试移动到 ViewPager2,但我无法获得此行为(请参阅下一个屏幕并保持项目居中(。
页面项目的布局:
android:paddingStart="24dp"
android:paddingEnd="24dp"
代码中的查看页面r2:
viewPager2.setClipToPadding(false);
viewPager2.setOffscreenPageLimit(2);
viewPager2.setPageTransformer(new ViewPager2.PageTransformer()
{
@Override
public void transformPage(@NonNull View page, float position)
{
float offset = (int)ScreenUtils.dpToPx(48) * position;
page.setTranslationX(-offset);
}
});