Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@airowe
Last active January 18, 2018 15:53
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save airowe/fb5c59f94fdfb5f1eb0b776a398a68f3 to your computer and use it in GitHub Desktop.
Save airowe/fb5c59f94fdfb5f1eb0b776a398a68f3 to your computer and use it in GitHub Desktop.
Android ViewPager allowing for horizontally scrolling of each View without trigger onPageChanged
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
viewPagerAdapter = MLPagedScrollAdapter(childFragmentManager, fragments)
fragmentViewPager = viewPager!!
fragmentViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
override fun onPageScrollStateChanged(state: Int) {
viewPager.scrollState = state
}
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
override fun onPageSelected(position: Int) { }
})
fragmentViewPager.adapter = viewPagerAdapter
fragmentViewPager.setDurationScroll(325)
}
import android.content.Context
import android.support.v4.view.ViewPager
import android.util.AttributeSet
import android.view.MotionEvent
import android.webkit.WebView
import com.expion.expion.Services.WebViewPager
/**
* Created by arowe on 1/20/17.
*/
class HorizontalScrollWebView(context: Context, attrs: AttributeSet) : WebView(context, attrs) {
val deltaXThreshhold = 25
val perimeterThreshhold = .15
var position = -1
var programmaticScroll: Boolean = false
override fun overScrollBy(deltaX: Int, deltaY: Int, scrollX: Int, scrollY: Int, scrollRangeX: Int, scrollRangeY: Int, maxOverScrollX: Int, maxOverScrollY: Int, isTouchEvent: Boolean): Boolean {
if(parent.parent is WebViewPager) {
val viewPager: WebViewPager = (parent.parent as WebViewPager)
if(viewPager.scrollState == ViewPager.SCROLL_STATE_IDLE && !programmaticScroll) {
if(deltaX > deltaXThreshhold) {
programmaticScroll = true
if(checkAdapterLimits(1, viewPager.currentItem)) //right
(parent.parent as ViewPager).setCurrentItem(viewPager.currentItem + 1,true)
}
else if(deltaX < -deltaXThreshhold) {
programmaticScroll = true
if(checkAdapterLimits(-1, viewPager.currentItem)) //left
(parent.parent as ViewPager).setCurrentItem(viewPager.currentItem - 1,true)
}
else {
programmaticScroll = false
}
}
}
return false
}
override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
parent.requestDisallowInterceptTouchEvent(true)
programmaticScroll = event.action != MotionEvent.ACTION_DOWN
if(event.action == MotionEvent.ACTION_DOWN) {
val x1 = event.x
if (x1 >= width - width * perimeterThreshhold || x1 <= width * perimeterThreshhold) {
(parent.parent as WebViewPager).setDurationScroll(500)
}
else {
(parent.parent as WebViewPager).setDurationScroll(400)
}
}
else {
(parent.parent as WebViewPager).setDurationScroll(400)
}
return super.onInterceptTouchEvent(event)
}
private fun checkAdapterLimits(direction: Int, position: Int) : Boolean {
return if(direction < 0) //left
position >= 1
else //right
position < (parent.parent as ViewPager).adapter.count - 1
}
}
import android.content.Context
import android.support.v4.view.ViewPager
import android.util.AttributeSet
import android.view.animation.DecelerateInterpolator
import android.widget.Scroller
/**
* Created by arowe on 9/29/17.
*/
class WebViewPager(context: Context, attrs: AttributeSet) : ViewPager(context, attrs) {
var scrollState: Int = SCROLL_STATE_IDLE
fun setDurationScroll(millis: Int) {
try {
val viewpager = ViewPager::class.java
val scroller = viewpager.getDeclaredField("mScroller")
scroller.isAccessible = true
scroller.set(this, OwnScroller(context, millis))
} catch (e: Exception) {
e.printStackTrace()
}
}
inner class OwnScroller(context: Context, durationScroll: Int) : Scroller(context, DecelerateInterpolator()) {
private var durationScrollMillis = 1
init {
this.durationScrollMillis = durationScroll
}
override fun startScroll(startX: Int, startY: Int, dx: Int, dy: Int, duration: Int) {
super.startScroll(startX, startY, dx, dy, durationScrollMillis)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment