Skip to content

Instantly share code, notes, and snippets.

@whalemare
Created December 16, 2017 07:50
Show Gist options
  • Save whalemare/9a4c6e06545381f21471688807eb4110 to your computer and use it in GitHub Desktop.
Save whalemare/9a4c6e06545381f21471688807eb4110 to your computer and use it in GitHub Desktop.
Vertical View Pager
package ru.werbary.tv1000play.mobile.view
import android.content.Context
import android.support.v4.view.ViewPager
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View
/**
* @since 2017
* @author Anton Vlasov - whalemare
*/
class VerticalViewPager @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null
) : ViewPager(context, attrs) {
val VERTICAL = 1
private var mSwipeOrientation: Int = VERTICAL
init {
// The majority of the work is done over here
setPageTransformer(true, VerticalPageTransformer())
// The easiest way to get rid of the overscroll drawing that happens on the left and right
overScrollMode = View.OVER_SCROLL_NEVER
}
override fun onTouchEvent(event: MotionEvent): Boolean {
return super.onTouchEvent(if (mSwipeOrientation == VERTICAL) swapXY(event) else event)
}
override fun canScrollHorizontally(direction: Int): Boolean {
return false
}
override fun canScrollVertically(direction: Int): Boolean {
return true
}
override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
if (mSwipeOrientation == VERTICAL) {
val intercepted = super.onInterceptHoverEvent(swapXY(event))
swapXY(event)
return intercepted
}
return super.onInterceptTouchEvent(event)
}
private fun swapXY(event: MotionEvent): MotionEvent {
val width = width.toFloat()
val height = height.toFloat()
val newX = event.y / height * width
val newY = event.x / width * height
event.setLocation(newX, newY)
return event
}
private inner class VerticalPageTransformer : ViewPager.PageTransformer {
override fun transformPage(page: View, position: Float) = when {
// This page is way off-screen to the leftL
position < -1 -> {
page.setAlpha(0F)
}
position <= 1 -> {
page.alpha = 1F
// Counteract the default slide transition
page.translationX = page.width * -position
// set Y position to swipe in from top
val yPosition = position * page.height
page.setTranslationY(yPosition)
}
// This page is way off screen to the right
else -> page.setAlpha(0F)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment