Android View Pager2水平轮播

问题描述 投票:0回答:1

我有一个基本的轮播逻辑,设置在

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)

android kotlin android-viewpager
1个回答
0
投票

我设法解决了它

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)
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.