Last active
January 18, 2018 15:53
-
-
Save airowe/fb5c59f94fdfb5f1eb0b776a398a68f3 to your computer and use it in GitHub Desktop.
Android ViewPager allowing for horizontally scrolling of each View without trigger onPageChanged
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
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) | |
} |
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
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 | |
} | |
} |
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
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