Skip to content

Commit

Permalink
Add scrollEnabled prop to Android ScrollView
Browse files Browse the repository at this point in the history
Summary:
Perhaps there is a better way to do this, curious to hear it!

- If momentum scroll is active when `scrollEnabled` is toggled, the momentum scroll continues and the onMomentumScrollEnd event fires, which is the same as on iOS.
Closes #5656

Reviewed By: svcscm

Differential Revision: D2889897

Pulled By: dmmiller

fb-gh-sync-id: b2f44d2bcb48373f9945f6afd966447a118df717
  • Loading branch information
brentvatne authored and facebook-github-bot-8 committed Feb 3, 2016
1 parent 98373ac commit 82b0df9
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 13 deletions.
1 change: 0 additions & 1 deletion Libraries/Components/ScrollView/ScrollView.js
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,6 @@ var ScrollView = React.createClass({
/**
* When false, the content does not scroll.
* The default value is true.
* @platform ios
*/
scrollEnabled: PropTypes.bool,
/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,13 @@ public class ReactHorizontalScrollView extends HorizontalScrollView implements

private final OnScrollDispatchHelper mOnScrollDispatchHelper = new OnScrollDispatchHelper();

private boolean mRemoveClippedSubviews;
private boolean mSendMomentumEvents;
private @Nullable Rect mClippingRect;
private boolean mDoneFlinging;
private boolean mDragging;
private boolean mFlinging;
private boolean mDoneFlinging;

private @Nullable Rect mClippingRect;
private boolean mRemoveClippedSubviews;
private boolean mScrollEnabled = true;
private boolean mSendMomentumEvents;

public ReactHorizontalScrollView(Context context) {
super(context);
Expand All @@ -61,6 +61,10 @@ public void setSendMomentumEvents(boolean sendMomentumEvents) {
mSendMomentumEvents = sendMomentumEvents;
}

public void setScrollEnabled(boolean scrollEnabled) {
mScrollEnabled = scrollEnabled;
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
MeasureSpecAssertions.assertExplicitMeasureSpec(widthMeasureSpec, heightMeasureSpec);
Expand Down Expand Up @@ -95,6 +99,10 @@ protected void onScrollChanged(int x, int y, int oldX, int oldY) {

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (!mScrollEnabled) {
return false;
}

if (super.onInterceptTouchEvent(ev)) {
NativeGestureUtil.notifyNativeGestureStarted(this, ev);
ReactScrollViewHelper.emitScrollBeginDragEvent(this);
Expand All @@ -107,6 +115,10 @@ public boolean onInterceptTouchEvent(MotionEvent ev) {

@Override
public boolean onTouchEvent(MotionEvent ev) {
if (!mScrollEnabled) {
return false;
}

int action = ev.getAction() & MotionEvent.ACTION_MASK;
if (action == MotionEvent.ACTION_UP && mDragging) {
ReactScrollViewHelper.emitScrollEndDragEvent(this);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,17 +39,21 @@ public ReactHorizontalScrollView createViewInstance(ThemedReactContext context)
return new ReactHorizontalScrollView(context);
}

@ReactProp(name = ReactClippingViewGroupHelper.PROP_REMOVE_CLIPPED_SUBVIEWS)
public void setRemoveClippedSubviews(ReactHorizontalScrollView view, boolean removeClippedSubviews) {
view.setRemoveClippedSubviews(removeClippedSubviews);
@ReactProp(name = "scrollEnabled", defaultBoolean = true)
public void setScrollEnabled(ReactHorizontalScrollView view, boolean value) {
view.setScrollEnabled(value);
}


@ReactProp(name = "showsHorizontalScrollIndicator")
public void setShowsHorizontalScrollIndicator(ReactHorizontalScrollView view, boolean value) {
view.setHorizontalScrollBarEnabled(value);
}

@ReactProp(name = ReactClippingViewGroupHelper.PROP_REMOVE_CLIPPED_SUBVIEWS)
public void setRemoveClippedSubviews(ReactHorizontalScrollView view, boolean removeClippedSubviews) {
view.setRemoveClippedSubviews(removeClippedSubviews);
}

/**
* Computing momentum events is potentially expensive since we post a runnable on the UI thread
* to see when it is done. We only do that if {@param sendMomentumEvents} is set to true. This
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,13 @@ public class ReactScrollView extends ScrollView implements ReactClippingViewGrou

private final OnScrollDispatchHelper mOnScrollDispatchHelper = new OnScrollDispatchHelper();

private boolean mRemoveClippedSubviews;
private @Nullable Rect mClippingRect;
private boolean mSendMomentumEvents;
private boolean mDoneFlinging;
private boolean mDragging;
private boolean mFlinging;
private boolean mDoneFlinging;
private boolean mRemoveClippedSubviews;
private boolean mScrollEnabled = true;
private boolean mSendMomentumEvents;

public ReactScrollView(Context context) {
super(context);
Expand All @@ -49,6 +50,10 @@ public void setSendMomentumEvents(boolean sendMomentumEvents) {
mSendMomentumEvents = sendMomentumEvents;
}

public void setScrollEnabled(boolean scrollEnabled) {
mScrollEnabled = scrollEnabled;
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
MeasureSpecAssertions.assertExplicitMeasureSpec(widthMeasureSpec, heightMeasureSpec);
Expand Down Expand Up @@ -99,6 +104,10 @@ protected void onScrollChanged(int x, int y, int oldX, int oldY) {

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (!mScrollEnabled) {
return false;
}

if (super.onInterceptTouchEvent(ev)) {
NativeGestureUtil.notifyNativeGestureStarted(this, ev);
ReactScrollViewHelper.emitScrollBeginDragEvent(this);
Expand All @@ -111,6 +120,10 @@ public boolean onInterceptTouchEvent(MotionEvent ev) {

@Override
public boolean onTouchEvent(MotionEvent ev) {
if (!mScrollEnabled) {
return false;
}

int action = ev.getAction() & MotionEvent.ACTION_MASK;
if (action == MotionEvent.ACTION_UP && mDragging) {
ReactScrollViewHelper.emitScrollEndDragEvent(this);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@ public ReactScrollView createViewInstance(ThemedReactContext context) {
return new ReactScrollView(context);
}

@ReactProp(name = "scrollEnabled", defaultBoolean = true)
public void setScrollEnabled(ReactScrollView view, boolean value) {
view.setScrollEnabled(value);
}

@ReactProp(name = "showsVerticalScrollIndicator")
public void setShowsVerticalScrollIndicator(ReactScrollView view, boolean value) {
view.setVerticalScrollBarEnabled(value);
Expand Down

0 comments on commit 82b0df9

Please sign in to comment.