protected bool CanScroll(View view, bool checkV, int dx, int x, int y) { var viewGroup = view as ViewGroup; if (viewGroup == null) { return(checkV && ViewCompat.CanScrollHorizontally(view, -dx)); } var scrollX = viewGroup.ScrollX; var scrollY = viewGroup.ScrollY; var count = viewGroup.ChildCount; for (var i = count - 1; i >= 0; i--) { var child = viewGroup.GetChildAt(i); if (x + scrollX >= child.Left && x + scrollX < child.Right && y + scrollY >= child.Top && y + scrollY < child.Bottom && CanScroll(child, true, dx, x + scrollX - child.Left, y + scrollY - child.Top)) { return(true); } } return(checkV && ViewCompat.CanScrollHorizontally(view, -dx)); }
/// <summary> /// Tests scrollability within child views of v given a delta of dx. /// </summary> /// <param name="v"> View to test for horizontal scrollability </param> /// <param name="checkV"> Whether the view v passed should itself be checked for scrollability (true), /// or just its children (false). </param> /// <param name="dx"> Delta scrolled in pixels </param> /// <param name="x"> X coordinate of the active touch point </param> /// <param name="y"> Y coordinate of the active touch point </param> /// <returns> true if child views of v can be scrolled by delta of dx. </returns> protected bool CanScroll(View v, bool checkV, int dx, int x, int y) { if (v is ViewGroup) { ViewGroup group = (ViewGroup)v; int scrollX = v.ScrollX; int scrollY = v.ScrollY; int count = group.ChildCount; // Count backwards - let topmost views consume scroll distance first. for (int i = count - 1; i >= 0; i--) { View child = group.GetChildAt(i); if (x + scrollX >= child.Left && x + scrollX < child.Right && y + scrollY >= child.Top && y + scrollY < child.Bottom && CanScroll(child, true, dx, x + scrollX - child.Left, y + scrollY - child.Top)) { return(true); } } } return(checkV && ViewCompat.CanScrollHorizontally(v, -dx)); }