/** * Returns whether the touch point is within the child View * It is transform aware and will invert the transform Matrix to find the true local points * This code is taken from {@link ViewGroup#isTransformedTouchPointInView()} */ private static boolean isTransformedTouchPointInView( float x, float y, ViewGroup parent, View child, PointF outLocalPoint) { float localX = x + parent.getScrollX() - child.getLeft(); float localY = y + parent.getScrollY() - child.getTop(); Matrix matrix = child.getMatrix(); if (!matrix.isIdentity()) { float[] localXY = mMatrixTransformCoords; localXY[0] = localX; localXY[1] = localY; Matrix inverseMatrix = mInverseMatrix; matrix.invert(inverseMatrix); inverseMatrix.mapPoints(localXY); localX = localXY[0]; localY = localXY[1]; } 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; } }