下面列出了android.view.ViewGroup#getScrollY ( ) 实例代码,或者点击链接到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;
}
}
private void invalidateDividersForScrollingView(ViewGroup view, final boolean setForTop, boolean setForBottom, boolean hasButtons) {
if (setForTop && view.getChildCount() > 0) {
mDrawTopDivider = mTitleBar != null &&
mTitleBar.getVisibility() != View.GONE &&
//Not scrolled to the top.
view.getScrollY() + view.getPaddingTop() > view.getChildAt(0).getTop();
}
if (setForBottom && view.getChildCount() > 0) {
mDrawBottomDivider = hasButtons &&
view.getScrollY() + view.getHeight() - view.getPaddingBottom() < view.getChildAt(view.getChildCount() - 1).getBottom();
}
}
/** Scroll the layout so that the focused child is on screen. */
private void requestChildFocus() {
ViewGroup parent = (ViewGroup) mLayout.getParent();
if (mLayout.getParent() == null) return;
// Scroll the parent to make the focused child visible.
if (mFocusedChild != null) parent.requestChildFocus(mLayout, mFocusedChild);
// {@link View#requestChildFocus} fails to account for children changing their height, so
// the scroll value may be past the actual maximum.
int viewportHeight = parent.getBottom() - parent.getTop();
int scrollMax = Math.max(0, mLayout.getMeasuredHeight() - viewportHeight);
if (parent.getScrollY() > scrollMax) parent.setScrollY(scrollMax);
}
/** Scroll the layout so that the focused child is on screen. */
private void requestChildFocus() {
ViewGroup parent = (ViewGroup) mLayout.getParent();
if (mLayout.getParent() == null) return;
// Scroll the parent to make the focused child visible.
if (mFocusedChild != null) parent.requestChildFocus(mLayout, mFocusedChild);
// {@link View#requestChildFocus} fails to account for children changing their height, so
// the scroll value may be past the actual maximum.
int viewportHeight = parent.getBottom() - parent.getTop();
int scrollMax = Math.max(0, mLayout.getMeasuredHeight() - viewportHeight);
if (parent.getScrollY() > scrollMax) parent.setScrollY(scrollMax);
}
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;
}
/** Scroll the layout so that the focused child is on screen. */
private void requestChildFocus() {
ViewGroup parent = (ViewGroup) mLayout.getParent();
if (mLayout.getParent() == null) return;
// Scroll the parent to make the focused child visible.
if (mFocusedChild != null) parent.requestChildFocus(mLayout, mFocusedChild);
// {@link View#requestChildFocus} fails to account for children changing their height, so
// the scroll value may be past the actual maximum.
int viewportHeight = parent.getBottom() - parent.getTop();
int scrollMax = Math.max(0, mLayout.getMeasuredHeight() - viewportHeight);
if (parent.getScrollY() > scrollMax) parent.setScrollY(scrollMax);
}
public static void transformPointToViewLocal(ViewGroup group, View child, float[] point) {
point[0] += group.getScrollX() - child.getLeft();
point[1] += group.getScrollY() - child.getTop();
}
public static boolean isViewGroupToBottom(ViewGroup viewGroup) {
View subChildView = viewGroup.getChildAt(0);
return (subChildView != null && subChildView.getMeasuredHeight() <= viewGroup.getScrollY() + viewGroup.getHeight());
}
public static boolean isViewGroupToBottom(ViewGroup viewGroup) {
View subChildView = viewGroup.getChildAt(0);
return (subChildView != null && subChildView.getMeasuredHeight() <= viewGroup.getScrollY() + viewGroup.getHeight());
}