mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-04-29 21:46:07 +08:00
Add scrollEnabled prop to Android ScrollView
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 https://github.com/facebook/react-native/pull/5656 Reviewed By: svcscm Differential Revision: D2889897 Pulled By: dmmiller fb-gh-sync-id: b2f44d2bcb48373f9945f6afd966447a118df717
This commit is contained in:
committed by
facebook-github-bot-8
parent
98373ac6e3
commit
82b0df9d2a
@@ -227,7 +227,6 @@ var ScrollView = React.createClass({
|
|||||||
/**
|
/**
|
||||||
* When false, the content does not scroll.
|
* When false, the content does not scroll.
|
||||||
* The default value is true.
|
* The default value is true.
|
||||||
* @platform ios
|
|
||||||
*/
|
*/
|
||||||
scrollEnabled: PropTypes.bool,
|
scrollEnabled: PropTypes.bool,
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -31,13 +31,13 @@ public class ReactHorizontalScrollView extends HorizontalScrollView implements
|
|||||||
|
|
||||||
private final OnScrollDispatchHelper mOnScrollDispatchHelper = new OnScrollDispatchHelper();
|
private final OnScrollDispatchHelper mOnScrollDispatchHelper = new OnScrollDispatchHelper();
|
||||||
|
|
||||||
private boolean mRemoveClippedSubviews;
|
private @Nullable Rect mClippingRect;
|
||||||
private boolean mSendMomentumEvents;
|
private boolean mDoneFlinging;
|
||||||
private boolean mDragging;
|
private boolean mDragging;
|
||||||
private boolean mFlinging;
|
private boolean mFlinging;
|
||||||
private boolean mDoneFlinging;
|
private boolean mRemoveClippedSubviews;
|
||||||
|
private boolean mScrollEnabled = true;
|
||||||
private @Nullable Rect mClippingRect;
|
private boolean mSendMomentumEvents;
|
||||||
|
|
||||||
public ReactHorizontalScrollView(Context context) {
|
public ReactHorizontalScrollView(Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
@@ -61,6 +61,10 @@ public class ReactHorizontalScrollView extends HorizontalScrollView implements
|
|||||||
mSendMomentumEvents = sendMomentumEvents;
|
mSendMomentumEvents = sendMomentumEvents;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setScrollEnabled(boolean scrollEnabled) {
|
||||||
|
mScrollEnabled = scrollEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||||
MeasureSpecAssertions.assertExplicitMeasureSpec(widthMeasureSpec, heightMeasureSpec);
|
MeasureSpecAssertions.assertExplicitMeasureSpec(widthMeasureSpec, heightMeasureSpec);
|
||||||
@@ -95,6 +99,10 @@ public class ReactHorizontalScrollView extends HorizontalScrollView implements
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onInterceptTouchEvent(MotionEvent ev) {
|
public boolean onInterceptTouchEvent(MotionEvent ev) {
|
||||||
|
if (!mScrollEnabled) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (super.onInterceptTouchEvent(ev)) {
|
if (super.onInterceptTouchEvent(ev)) {
|
||||||
NativeGestureUtil.notifyNativeGestureStarted(this, ev);
|
NativeGestureUtil.notifyNativeGestureStarted(this, ev);
|
||||||
ReactScrollViewHelper.emitScrollBeginDragEvent(this);
|
ReactScrollViewHelper.emitScrollBeginDragEvent(this);
|
||||||
@@ -107,6 +115,10 @@ public class ReactHorizontalScrollView extends HorizontalScrollView implements
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onTouchEvent(MotionEvent ev) {
|
public boolean onTouchEvent(MotionEvent ev) {
|
||||||
|
if (!mScrollEnabled) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
int action = ev.getAction() & MotionEvent.ACTION_MASK;
|
int action = ev.getAction() & MotionEvent.ACTION_MASK;
|
||||||
if (action == MotionEvent.ACTION_UP && mDragging) {
|
if (action == MotionEvent.ACTION_UP && mDragging) {
|
||||||
ReactScrollViewHelper.emitScrollEndDragEvent(this);
|
ReactScrollViewHelper.emitScrollEndDragEvent(this);
|
||||||
|
|||||||
@@ -39,17 +39,21 @@ public class ReactHorizontalScrollViewManager
|
|||||||
return new ReactHorizontalScrollView(context);
|
return new ReactHorizontalScrollView(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ReactProp(name = ReactClippingViewGroupHelper.PROP_REMOVE_CLIPPED_SUBVIEWS)
|
@ReactProp(name = "scrollEnabled", defaultBoolean = true)
|
||||||
public void setRemoveClippedSubviews(ReactHorizontalScrollView view, boolean removeClippedSubviews) {
|
public void setScrollEnabled(ReactHorizontalScrollView view, boolean value) {
|
||||||
view.setRemoveClippedSubviews(removeClippedSubviews);
|
view.setScrollEnabled(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ReactProp(name = "showsHorizontalScrollIndicator")
|
@ReactProp(name = "showsHorizontalScrollIndicator")
|
||||||
public void setShowsHorizontalScrollIndicator(ReactHorizontalScrollView view, boolean value) {
|
public void setShowsHorizontalScrollIndicator(ReactHorizontalScrollView view, boolean value) {
|
||||||
view.setHorizontalScrollBarEnabled(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
|
* 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
|
* to see when it is done. We only do that if {@param sendMomentumEvents} is set to true. This
|
||||||
|
|||||||
@@ -34,12 +34,13 @@ public class ReactScrollView extends ScrollView implements ReactClippingViewGrou
|
|||||||
|
|
||||||
private final OnScrollDispatchHelper mOnScrollDispatchHelper = new OnScrollDispatchHelper();
|
private final OnScrollDispatchHelper mOnScrollDispatchHelper = new OnScrollDispatchHelper();
|
||||||
|
|
||||||
private boolean mRemoveClippedSubviews;
|
|
||||||
private @Nullable Rect mClippingRect;
|
private @Nullable Rect mClippingRect;
|
||||||
private boolean mSendMomentumEvents;
|
private boolean mDoneFlinging;
|
||||||
private boolean mDragging;
|
private boolean mDragging;
|
||||||
private boolean mFlinging;
|
private boolean mFlinging;
|
||||||
private boolean mDoneFlinging;
|
private boolean mRemoveClippedSubviews;
|
||||||
|
private boolean mScrollEnabled = true;
|
||||||
|
private boolean mSendMomentumEvents;
|
||||||
|
|
||||||
public ReactScrollView(Context context) {
|
public ReactScrollView(Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
@@ -49,6 +50,10 @@ public class ReactScrollView extends ScrollView implements ReactClippingViewGrou
|
|||||||
mSendMomentumEvents = sendMomentumEvents;
|
mSendMomentumEvents = sendMomentumEvents;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setScrollEnabled(boolean scrollEnabled) {
|
||||||
|
mScrollEnabled = scrollEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||||
MeasureSpecAssertions.assertExplicitMeasureSpec(widthMeasureSpec, heightMeasureSpec);
|
MeasureSpecAssertions.assertExplicitMeasureSpec(widthMeasureSpec, heightMeasureSpec);
|
||||||
@@ -99,6 +104,10 @@ public class ReactScrollView extends ScrollView implements ReactClippingViewGrou
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onInterceptTouchEvent(MotionEvent ev) {
|
public boolean onInterceptTouchEvent(MotionEvent ev) {
|
||||||
|
if (!mScrollEnabled) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (super.onInterceptTouchEvent(ev)) {
|
if (super.onInterceptTouchEvent(ev)) {
|
||||||
NativeGestureUtil.notifyNativeGestureStarted(this, ev);
|
NativeGestureUtil.notifyNativeGestureStarted(this, ev);
|
||||||
ReactScrollViewHelper.emitScrollBeginDragEvent(this);
|
ReactScrollViewHelper.emitScrollBeginDragEvent(this);
|
||||||
@@ -111,6 +120,10 @@ public class ReactScrollView extends ScrollView implements ReactClippingViewGrou
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onTouchEvent(MotionEvent ev) {
|
public boolean onTouchEvent(MotionEvent ev) {
|
||||||
|
if (!mScrollEnabled) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
int action = ev.getAction() & MotionEvent.ACTION_MASK;
|
int action = ev.getAction() & MotionEvent.ACTION_MASK;
|
||||||
if (action == MotionEvent.ACTION_UP && mDragging) {
|
if (action == MotionEvent.ACTION_UP && mDragging) {
|
||||||
ReactScrollViewHelper.emitScrollEndDragEvent(this);
|
ReactScrollViewHelper.emitScrollEndDragEvent(this);
|
||||||
|
|||||||
@@ -42,6 +42,11 @@ public class ReactScrollViewManager
|
|||||||
return new ReactScrollView(context);
|
return new ReactScrollView(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ReactProp(name = "scrollEnabled", defaultBoolean = true)
|
||||||
|
public void setScrollEnabled(ReactScrollView view, boolean value) {
|
||||||
|
view.setScrollEnabled(value);
|
||||||
|
}
|
||||||
|
|
||||||
@ReactProp(name = "showsVerticalScrollIndicator")
|
@ReactProp(name = "showsVerticalScrollIndicator")
|
||||||
public void setShowsVerticalScrollIndicator(ReactScrollView view, boolean value) {
|
public void setShowsVerticalScrollIndicator(ReactScrollView view, boolean value) {
|
||||||
view.setVerticalScrollBarEnabled(value);
|
view.setVerticalScrollBarEnabled(value);
|
||||||
|
|||||||
Reference in New Issue
Block a user