Created
December 16, 2017 07:50
-
-
Save whalemare/9a4c6e06545381f21471688807eb4110 to your computer and use it in GitHub Desktop.
Vertical View Pager
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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