Skip to content

Commit a76a35d

Browse files
committed
Add snapToInterval support for Android ScrollView
1 parent dc22bd6 commit a76a35d

File tree

3 files changed

+20
-4
lines changed

3 files changed

+20
-4
lines changed

Libraries/Components/ScrollView/ScrollView.js

-2
Original file line numberDiff line numberDiff line change
@@ -335,8 +335,6 @@ const ScrollView = createReactClass({
335335
* that have lengths smaller than the scroll view. Typically used in
336336
* combination with `snapToAlignment` and `decelerationRate="fast"`.
337337
* Overrides less configurable `pagingEnabled` prop.
338-
*
339-
* @platform ios
340338
*/
341339
snapToInterval: PropTypes.number,
342340
/**

ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java

+15-2
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,10 @@
2525

2626
import com.facebook.infer.annotation.Assertions;
2727
import com.facebook.react.uimanager.MeasureSpecAssertions;
28-
import com.facebook.react.uimanager.events.NativeGestureUtil;
28+
import com.facebook.react.uimanager.PixelUtil;
2929
import com.facebook.react.uimanager.ReactClippingViewGroup;
3030
import com.facebook.react.uimanager.ReactClippingViewGroupHelper;
31+
import com.facebook.react.uimanager.events.NativeGestureUtil;
3132
import com.facebook.react.views.view.ReactViewBackgroundDrawable;
3233

3334
/**
@@ -43,6 +44,7 @@ public class ReactHorizontalScrollView extends HorizontalScrollView implements
4344
private @Nullable Rect mClippingRect;
4445
private boolean mDragging;
4546
private boolean mPagingEnabled = false;
47+
private double mSnapToInterval;
4648
private @Nullable Runnable mPostTouchRunnable;
4749
private boolean mRemoveClippedSubviews;
4850
private boolean mScrollEnabled = true;
@@ -92,6 +94,10 @@ public void setPagingEnabled(boolean pagingEnabled) {
9294
mPagingEnabled = pagingEnabled;
9395
}
9496

97+
public void setSnapToInterval(double snapToInterval) {
98+
mSnapToInterval = snapToInterval;
99+
}
100+
95101
@Override
96102
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
97103
MeasureSpecAssertions.assertExplicitMeasureSpec(widthMeasureSpec, heightMeasureSpec);
@@ -233,6 +239,13 @@ private void disableFpsListener() {
233239
}
234240
}
235241

242+
private int getPageWidth() {
243+
if(mSnapToInterval != 0) {
244+
return (int) (PixelUtil.toPixelFromDIP(mSnapToInterval) + 0.5);
245+
}
246+
return getWidth();
247+
}
248+
236249
private boolean isScrollPerfLoggingEnabled() {
237250
return mFpsListener != null && mScrollPerfTag != null && !mScrollPerfTag.isEmpty();
238251
}
@@ -310,7 +323,7 @@ public void run() {
310323
* scrolling.
311324
*/
312325
private void smoothScrollToPage(int velocity) {
313-
int width = getWidth();
326+
int width = getPageWidth();
314327
int currentX = getScrollX();
315328
// TODO (t11123799) - Should we do anything beyond linear accounting of the velocity
316329
int predictedX = currentX + velocity;

ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollViewManager.java

+5
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,11 @@ public void setPagingEnabled(ReactHorizontalScrollView view, boolean pagingEnabl
108108
view.setPagingEnabled(pagingEnabled);
109109
}
110110

111+
@ReactProp(name = "snapToInterval")
112+
public void setSnapToInterval(ReactHorizontalScrollView view, double snapToInterval) {
113+
view.setSnapToInterval(snapToInterval);
114+
}
115+
111116
/**
112117
* Controls overScroll behaviour
113118
*/

0 commit comments

Comments
 (0)