mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Add hitSlop prop on iOS and Android
Summary:New prop `hitSlop` allows extending the touch area of Touchable components. This makes it easier to touch small buttons without needing to change your styles. It takes `top`, `bottom`, `left`, and `right` same as the `pressRetentionOffset` prop. When a touch is moved, `hitSlop` is combined with `pressRetentionOffset` to determine how far the touch can move off the button before deactivating the button. On Android I had to add a new file `ids.xml` to generate a unique ID to use for the tag where I store the `hitSlop` state. The iOS side is more straightforward. terribleben worked on the iOS and JS parts of this diff. Fixes #110 Closes https://github.com/facebook/react-native/pull/5720 Differential Revision: D2941671 Pulled By: androidtrunkagent fb-gh-sync-id: 07e3eb8b6a36eebf76968fdaac3c6ac335603194 shipit-source-id: 07e3eb8b6a36eebf76968fdaac3c6ac335603194
This commit is contained in:
1 parent
ecf6981093
commit
0176ac488e
15 files changed
+225
-8
No files matched your search
@@ -13,12 +13,14 @@ import javax.annotation.Nullable;
|
||||
|
||||
import android.graphics.Matrix;
|
||||
import android.graphics.PointF;
|
||||
import android.graphics.Rect;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import com.facebook.react.bridge.JSApplicationIllegalArgumentException;
|
||||
import com.facebook.react.bridge.UiThreadUtil;
|
||||
import com.facebook.react.touch.ReactHitSlopView;
|
||||
|
||||
/**
|
||||
* Class responsible for identifying which react view should handle a given {@link MotionEvent}.
|
||||
@@ -118,7 +120,7 @@ public class TouchTargetHelper {
|
||||
}
|
||||
}
|
||||
return viewGroup;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether the touch point is within the child View
|
||||
@@ -144,12 +146,24 @@ public class TouchTargetHelper {
|
||||
localX = localXY[0];
|
||||
localY = localXY[1];
|
||||
}
|
||||
if ((localX >= 0 && localX < (child.getRight() - child.getLeft()))
|
||||
&& (localY >= 0 && localY < (child.getBottom() - child.getTop()))) {
|
||||
outLocalPoint.set(localX, localY);
|
||||
return true;
|
||||
if (child instanceof ReactHitSlopView && ((ReactHitSlopView) child).getHitSlopRect() != null) {
|
||||
Rect hitSlopRect = ((ReactHitSlopView) child).getHitSlopRect();
|
||||
if ((localX >= -hitSlopRect.left && localX < (child.getRight() - child.getLeft()) + hitSlopRect.right)
|
||||
&& (localY >= -hitSlopRect.top && localY < (child.getBottom() - child.getTop()) + hitSlopRect.bottom)) {
|
||||
outLocalPoint.set(localX, localY);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
} else {
|
||||
if ((localX >= 0 && localX < (child.getRight() - child.getLeft()))
|
||||
&& (localY >= 0 && localY < (child.getBottom() - child.getTop()))) {
|
||||
outLocalPoint.set(localX, localY);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user