我有一个基本的轮播逻辑,设置在
ViewPager2.PageTransformer
我可以观察上一个和下一个视图,还应用了缩放。
但是我需要改进这个逻辑,当它是轮播中的第一个项目时,我需要将它向左移动偏移量,当它是最后一个时,将它向右移动偏移量。如何做到这一点?
我实在不知道如何实现这个功能,理论上可以获取当前的项目索引,但动画不会很流畅,至少我尝试过。
我目前在做什么:
查找中心视图应移动的偏移量(缩放视图的偏移量)
val cardWidthPlusPaddings = view.width + padding * 2F
val desiredCardWidthPlusPaddings = cardWidthPlusPaddings + padding
val cardScale: Float = cardWidthPlusPaddings/desiredCardWidthPlusPaddings
val currentCardWidth = cardWidthPlusPaddings * cardScale
val offset = ((cardWidthPlusPaddings - currentCardWidth)/2) - padding
设置翻译X:
它只会通过缩放偏移+填充来移动左右项目,而不是中央项目。
而且我想省略左右卡缩放的计算,可以稍后添加。
view.translationX = position * -(2 * padding + offset)
我设法解决了它
class PageTransformer : ViewPager2.PageTransformer {
private val margin = [add your margin] - amount by which card be moved
private val viewsPadding = [add your View/ViewPager to screen end pad]
private var size: Int = -1
override fun transformPage(view: View, position: Float) {
adapter?.itemCount?.let {
if (size != it) {
size = it
}
}
val currentItemIndex = viewPager.currentItem
val cardWith = view.width
val desiredCardWidthPlusPaddings = cardWith + margin
val cardScale: Float = cardWith/desiredCardWidthPlusPaddings.toFloat()
val scaledCardWidth = cardWith * cardScale
val centralCardOffset: Float = when (currentItemIndex) {
0 -> ((cardWith - scaledCardWidth)/2) - margin
size - 1 -> -(((cardWith - scaledCardWidth)/2) - margin)
else -> 1F
}
with(view) {
translationX = centralCardOffset + position * -(margin + cardsPadding)
scaleY = (1 - abs(position) * (1 - cardScale))
scaleX = cardScale + abs(position) * (1 - cardScale)
}
}