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))
}
}