From 2e41b46dfeac30cc5435281e5d0dbb0b1d3b2ce8 Mon Sep 17 00:00:00 2001 From: Sigve Sebastian Farstad Date: Sat, 26 Aug 2017 15:08:32 +0200 Subject: [PATCH] Add snapToInterval support for Android ScrollView --- Libraries/Components/ScrollView/ScrollView.js | 2 -- .../views/scroll/ReactHorizontalScrollView.java | 15 ++++++++++++++- .../scroll/ReactHorizontalScrollViewManager.java | 5 +++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/Libraries/Components/ScrollView/ScrollView.js b/Libraries/Components/ScrollView/ScrollView.js index 980d5d734e0ede..6cb9977b252600 100644 --- a/Libraries/Components/ScrollView/ScrollView.js +++ b/Libraries/Components/ScrollView/ScrollView.js @@ -335,8 +335,6 @@ const ScrollView = createReactClass({ * that have lengths smaller than the scroll view. Typically used in * combination with `snapToAlignment` and `decelerationRate="fast"`. * Overrides less configurable `pagingEnabled` prop. - * - * @platform ios */ snapToInterval: PropTypes.number, /** diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java index 3acb61e9c9e407..ab90ce7664f360 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java @@ -22,6 +22,7 @@ import android.widget.HorizontalScrollView; import com.facebook.infer.annotation.Assertions; import com.facebook.react.uimanager.MeasureSpecAssertions; +import com.facebook.react.uimanager.PixelUtil; import com.facebook.react.uimanager.ReactClippingViewGroup; import com.facebook.react.uimanager.ReactClippingViewGroupHelper; import com.facebook.react.uimanager.events.NativeGestureUtil; @@ -41,6 +42,7 @@ public class ReactHorizontalScrollView extends HorizontalScrollView implements private @Nullable Rect mClippingRect; private boolean mDragging; private boolean mPagingEnabled = false; + private double mSnapToInterval; private @Nullable Runnable mPostTouchRunnable; private boolean mRemoveClippedSubviews; private boolean mScrollEnabled = true; @@ -94,6 +96,10 @@ public void flashScrollIndicators() { awakenScrollBars(); } + public void setSnapToInterval(double snapToInterval) { + mSnapToInterval = snapToInterval; + } + @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { MeasureSpecAssertions.assertExplicitMeasureSpec(widthMeasureSpec, heightMeasureSpec); @@ -235,6 +241,13 @@ private void disableFpsListener() { } } + private int getPageWidth() { + if(mSnapToInterval != 0) { + return (int) (PixelUtil.toPixelFromDIP(mSnapToInterval) + 0.5); + } + return getWidth(); + } + private boolean isScrollPerfLoggingEnabled() { return mFpsListener != null && mScrollPerfTag != null && !mScrollPerfTag.isEmpty(); } @@ -312,7 +325,7 @@ public void run() { * scrolling. */ private void smoothScrollToPage(int velocity) { - int width = getWidth(); + int width = getPageWidth(); int currentX = getScrollX(); // TODO (t11123799) - Should we do anything beyond linear accounting of the velocity int predictedX = currentX + velocity; diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollViewManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollViewManager.java index 9d40757919493c..539250493a8912 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollViewManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollViewManager.java @@ -105,6 +105,11 @@ public void setPagingEnabled(ReactHorizontalScrollView view, boolean pagingEnabl view.setPagingEnabled(pagingEnabled); } + @ReactProp(name = "snapToInterval") + public void setSnapToInterval(ReactHorizontalScrollView view, double snapToInterval) { + view.setSnapToInterval(snapToInterval); + } + /** * Controls overScroll behaviour */