下面列出了android.view.ViewGroup#getScrollX ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
public void transformPointToViewLocal(ViewGroup group, float[] point, View child) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
group.transformPointToViewLocal(point, child);
} else {
// When the system version is lower than LOLLIPOP_MR1, the system source code has no
// transformPointToViewLocal method. We need to be compatible with it.
point[0] += group.getScrollX() - child.getLeft();
point[1] += group.getScrollY() - child.getTop();
Matrix matrix = child.getMatrix();
if (!matrix.isIdentity()) {
mCachedMatrix.reset();
if (matrix.invert(mCachedMatrix)) {
mCachedMatrix.mapPoints(point);
}
}
}
}
/**
* 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;
}
}
private static boolean isTransformedTouchPointInView(float x, float y, ViewGroup parent, View child, PointF outLocalPoint) {
float localX = (((float) parent.getScrollX()) + x) - ((float) child.getLeft());
float localY = (((float) parent.getScrollY()) + y) - ((float) 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 < ((float) (-hitSlopRect.left)) || localX >= ((float) ((child.getRight() - child.getLeft()) + hitSlopRect.right)) || localY < ((float) (-hitSlopRect.top)) || localY >= ((float) ((child.getBottom() - child.getTop()) + hitSlopRect.bottom))) {
return false;
}
outLocalPoint.set(localX, localY);
return true;
} else if (localX < 0.0f || localX >= ((float) (child.getRight() - child.getLeft())) || localY < 0.0f || localY >= ((float) (child.getBottom() - child.getTop()))) {
return false;
} else {
outLocalPoint.set(localX, localY);
return true;
}
}
public static boolean isTransformedPointInView(
ViewGroup parent,
View child,
float x,
float y,
@Nullable PointF outLocalPoint) {
Util.throwIfNull(parent);
Util.throwIfNull(child);
float localX = x + parent.getScrollX() - child.getLeft();
float localY = y + parent.getScrollY() - child.getTop();
// TODO: handle transforms
/*Matrix childMatrix = child.getMatrix();
if (!childMatrix.isIdentity()) {
final float[] localXY = new float[2];
localXY[0] = localX;
localXY[1] = localY;
child.getInverseMatrix
}*/
final boolean isInView = ViewUtil.pointInView(child, localX, localY);
if (isInView && outLocalPoint != null) {
outLocalPoint.set(localX, localY);
}
return isInView;
}
public static void transformPointToViewLocal(ViewGroup group, View child, float[] point) {
point[0] += group.getScrollX() - child.getLeft();
point[1] += group.getScrollY() - child.getTop();
}