From a76a35d2afb83a1c9591b5f2156d7e47476806ea 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 | 17 +++++++++++++++-- .../ReactHorizontalScrollViewManager.java | 5 +++++ 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/Libraries/Components/ScrollView/ScrollView.js b/Libraries/Components/ScrollView/ScrollView.js index b5836fa63089da..88a51a1add9a71 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 b8f6dfabd5d6a9..a40a2c39afd2cb 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 @@ -25,9 +25,10 @@ import com.facebook.infer.annotation.Assertions; import com.facebook.react.uimanager.MeasureSpecAssertions; -import com.facebook.react.uimanager.events.NativeGestureUtil; +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; import com.facebook.react.views.view.ReactViewBackgroundDrawable; /** @@ -43,6 +44,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; @@ -92,6 +94,10 @@ public void setPagingEnabled(boolean pagingEnabled) { mPagingEnabled = pagingEnabled; } + public void setSnapToInterval(double snapToInterval) { + mSnapToInterval = snapToInterval; + } + @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { MeasureSpecAssertions.assertExplicitMeasureSpec(widthMeasureSpec, heightMeasureSpec); @@ -233,6 +239,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(); } @@ -310,7 +323,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 24996edcf320e7..00a3a6a92ce16c 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 @@ -108,6 +108,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 */