垂直滑动viewpager

import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View
import androidx.viewpager.widget.ViewPager
import com.youth.banner.view.BannerViewPager
import kotlin.math.abs

/**
 * VerticalViewPager
 * Translate by kang on 2017/5/4.
 *
 * 交换触摸事件的X和Y坐标
 */
class VerticalViewPager : BannerViewPager {

    constructor(context: Context) : super(context) {
        init()
    }

    constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
        init()
    }

    private fun init() {
        setPageTransformer(true, VerticalPageTransformer())
        // 禁止左右滑动
        overScrollMode = View.OVER_SCROLL_NEVER
    }

    private inner class VerticalPageTransformer : ViewPager.PageTransformer {
        //最小缩放值
        private val MIN_SCALE = 0.9f

        /**
         * @param position
         * 当前页的上一页+当前页+当前页下一页 ----> 上,中,下
         * 左滑 上[-2,-1)  中[-1,0) 下 [0,1)
         * 右滑 上(-1,0]   中(0,1]  下 (1,2]
         * */
        override fun transformPage(view: View, position: Float) {
            when {
                position < -1 -> {// [(-∞)-2,-1)
                    /**当前页的上一页 (或上N页) */
                    //透明值
//                    view.alpha = 0f
                    //缩放值
//                    view.scaleX = 0f
//                    view.scaleY = 0f
                    //旋转
//                    view.rotationX = 0f
                }
                position <= 1 -> { // [-1,1]
                    //透明
//                    view.alpha = getTransP(position)
                    //缩放
//                    view.scaleX = if(getTransP(position) > MIN_SCALE) getTransP(position) else MIN_SCALE
//                    view.scaleY= if(getTransP(position) > MIN_SCALE) getTransP(position) else MIN_SCALE
                    //旋转
                    view.rotationX =  60 * position

                    //-------------------------------上下滑动的关键代码-----------------------------
                    // 抵消默认幻灯片过渡
                    view.translationX = view.width * -position
                    //设置从上滑动到Y位置
                    view.translationY = position * view.height
                    //------------------------------------------------------------------------------
                }
                else -> {// (1,+2(+∞)]
                    /**当前页的下一页(或下N页)*/
                    //透明值
//                    view.alpha = 0f
                    //缩放值
//                    view.scaleX = 0f
//                    view.scaleY = 0f
                    //旋转
//                    view.rotationX = 0f
                }
            }
        }

        /**
         * 计算变化值
         * */
        fun getTransP(position: Float):Float{
            var final = 1 - abs(position)
            return if(final != 0f){
                abs(final)
            } else {
                1f
            }
        }
    }

    /**
     * 交换触摸事件的X和Y坐标
     */
    private fun swapXY(ev: MotionEvent): MotionEvent {
        val width = width.toFloat()
        val height = height.toFloat()

        val newX = ev.y / height * width
        val newY = ev.x / width * height

        ev.setLocation(newX, newY)

        return ev
    }

    override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
        val intercepted = super.onInterceptTouchEvent(swapXY(ev))
        swapXY(ev)
        return intercepted //为所有子视图返回触摸的原始坐标
    }

    override fun onTouchEvent(ev: MotionEvent): Boolean {
        return super.onTouchEvent(swapXY(ev))
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值