美文网首页
怎样判断 android ScrollView 是否滚到底部

怎样判断 android ScrollView 是否滚到底部

作者: 岁月静好浅笑安然 | 来源:发表于2023-03-14 19:14 被阅读0次
    • 怎样判断 android ScrollView 是否滚到底部

    您可以使用以下代码来判断ScrollView是否到达底部:

    ScrollView scrollView = findViewById(R.id.scroll_view);
    
    // 获取ScrollView的高度
    int scrollViewHeight = scrollView.getHeight();
    
    // 获取ScrollView的子View
    View lastChild = scrollView.getChildAt(scrollView.getChildCount() - 1);
    
    // 获取ScrollView的子View的Y轴坐标
    int lastChildBottomY = lastChild.getBottom();
    
    // 获取ScrollView的滚动位置
    int scrollY = scrollView.getScrollY();
    
    // 判断滚动位置是否到达底部
    if (scrollY + scrollViewHeight >= lastChildBottomY) {
        // 到达底部
    }
    

    其中 scrollY + scrollViewHeight 表示ScrollView当前的底部Y轴坐标,lastChildBottomY 表示ScrollView中最后一个子View的底部Y轴坐标。如果 scrollY + scrollViewHeight 大于或等于 lastChildBottomY,则ScrollView已经滚动到底部。

    • 有上下padding判断一样吗

    当ScrollView存在上下Padding时,判断是否滚动到底部的逻辑与没有Padding时略有不同。此时可以使用以下代码来判断是否滚动到底部:

    ScrollView scrollView = findViewById(R.id.scroll_view);
    
    // 获取ScrollView的可视高度
    int visibleHeight = scrollView.getHeight() - scrollView.getPaddingTop() - scrollView.getPaddingBottom();
    
    // 获取ScrollView的子View
    View lastChild = scrollView.getChildAt(scrollView.getChildCount() - 1);
    
    // 获取ScrollView的子View的底部位置
    int lastChildBottom = lastChild.getBottom();
    
    // 获取ScrollView的滚动位置
    int scrollY = scrollView.getScrollY();
    
    // 计算ScrollView底部位置
    int scrollViewBottom = scrollY + visibleHeight;
    
    // 判断ScrollView是否滚动到底部
    if (scrollViewBottom >= lastChildBottom) {
        // 到达底部
    }
    

    其中,scrollView.getHeight() 指的是 ScrollView 的可视高度,也就是除去上下 padding 后的高度;scrollView.getPaddingTop() 和 scrollView.getPaddingBottom() 分别获取 ScrollView 的上下 padding 值。

    计算 ScrollView 的底部位置时,将滚动的 Y 轴坐标 scrollY 加上可视高度 visibleHeight 就得到了 ScrollView 的底部位置。然后判断 ScrollView 的底部是否大于等于它的最后一个子 View 的底部位置 lastChildBottom,如果是,就表明 ScrollView 已经滚动到了底部。

    • 有padding和没有padding可以结合判断吗

    可以结合上述两种方法,对 ScrollView 是否滚动到底部进行判断:

    ScrollView scrollView = findViewById(R.id.scroll_view);
    
    // 获取 ScrollView 的可视高度
    int visibleHeight = scrollView.getHeight() - scrollView.getPaddingTop() - scrollView.getPaddingBottom();
    
    // 获取 ScrollView 的子View
    View lastChild = scrollView.getChildAt(scrollView.getChildCount() - 1);
    
    // 获取 ScrollView 可以滑动的范围
    int scrollRange = scrollView.getChildAt(0).getHeight() - scrollView.getHeight();
    
    // 获取 ScrollView 的滚动位置
    int scrollY = scrollView.getScrollY();
    
    // 判断 ScrollView 是否滚动到底部
    if (scrollY == scrollRange) {
        // 已滑动到底部
        return true;
    } else if (scrollViewBottom >= lastChildBottom) {
        // scrollTo 和 scrollTo 不是同时回调,所以添加两个逻辑都可(可根据需要决定是否需要使用两个逻辑组合)
        // 已滑动到底部
        return true;
    } else {
        // 未滑动到底部
        return false;
    }
    

    其中,scrollRange 是整个 ScrollView 可以滑动的范围,即第一个子 View 的高度减去 ScrollView 的高度。如果 scrollY 的值等于 scrollRange 则表明 ScrollView 已经到达底部。接下来,根据上下 padding 情况,可以使用第一种方法或第二种方法来判断是否到达底部。

    上述代码把 ScrollView 是否滚动到底部的判断条件划分为两个部分,先判断是否到达滑动范围的底部(即是否滑动到底部)。如果未到达滑动范围的底部,则根据上下 padding 情况使用不同的方法再次对 ScrollView 是否到达底部进行判断。

    • 可以通过自定义方式进行内部封装判断吗

    可以通过自定义一个继承自 ScrollView 的类,在该类中添加一个方法来判断 ScrollView 是否滚动到底部。

    这种方式的好处就是可以将判断 ScrollView 是否滚动到底部的逻辑封装在一个类中,不需要每次操作 ScrollView 都编写重复的代码。下面是一个示例:

    public class MyScrollView extends ScrollView {
        
        public MyScrollView(Context context) {
            super(context);
        }
    
        public MyScrollView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
        
        public boolean isScrolledToBottom() {
            if (getChildCount() == 0) {
                return true;
            }
    
            int scrollViewHeight = getHeight();
            int scrollY = getScrollY();
            View lastChild = getChildAt(getChildCount() - 1);
            int lastChildBottom = lastChild.getBottom() + getPaddingBottom();
    
            if (scrollY + scrollViewHeight >= lastChildBottom) {
                return true;
            } else {
                return false;
            }
        }
    }
    

    在上面的代码中,首先继承自 ScrollView,在 isScrolledToBottom() 方法中添加了 ScrollView 是否到达底部的逻辑,其中,getChildCount() 方法用来获取 ScrollView 的子 View 的数量;getScrollY()方法用来获取 ScrollView 的滚动位置;getChildAt() 方法用来获取 ScrollView 的子 View;getPaddingBottom() 方法用来获取 ScrollView 的下 padding。最后判断 ScrollView 是否到达底部。

    这样,在使用 MyScrollView 的时候,只需要调用 isScrolledToBottom() 方法就能判断 ScrollView 是否滚动到了底部。

    • 上面自定义考虑到了上下padding的情况吗?

    很抱歉,我之前自定义类的回答并没有考虑到上下 Padding 的情况。这里提供一个带有上下 Padding 的判断方法的自定义 ScrollView 类:

    public class CustomScrollView extends ScrollView {
        
        public CustomScrollView(Context context) {
            super(context);
        }
    
        public CustomScrollView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public CustomScrollView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        /**
         * 判断 ScrollView 的滑动位置是否到达底部
         * @return  true 表示到达底部,false 表示未到达底部
         */
        public boolean isScrolledToBottom() {
            if (getChildCount() == 0) {
                return true;
            }
    
            int scrollViewHeight = getHeight() - getPaddingTop() - getPaddingBottom();
            int scrollY = getScrollY() + getPaddingTop();
            View lastChild = getChildAt(getChildCount() - 1);
            int lastChildBottom = lastChild.getBottom() + ((MarginLayoutParams) lastChild.getLayoutParams()).bottomMargin;
    
            if (scrollY + scrollViewHeight >= lastChildBottom) {
                return true;
            }
    
            return false;
        }
    }
    

    在这个自定义 ScrollView 类中,我们重写了 isScrolledToBottom() 方法,这个方法的实现方式和之前在ScrollView中提供的方法类似,不同之处在于这里将上下 Padding 也计算进去了。

    具体而言,以上述代码为例,首先使用 getHeight() 方法获取了 ScrollView 的可显示高度,然后使用 getScrollY() 方法获取了 ScrollView 的滚动位置,接下来获取了 ScrollView 最后一个子 View 的底部位置,这里的底部位置需要加上子 View 的底部 Margin,最后将 Padding 也计算进去,就得到了 ScrollView 底部的位置。通过判断 ScrollView 最底端的位置是否小于或等于 ScrollView 的底部位置,就可以判断 ScrollView 是否滑动到了底部。

    您可以使用以下代码来判断ScrollView是否到达底部:

    ScrollView scrollView = findViewById(R.id.scroll_view);
    
    // 获取ScrollView的高度
    int scrollViewHeight = scrollView.getHeight();
    
    // 获取ScrollView的子View
    View lastChild = scrollView.getChildAt(scrollView.getChildCount() - 1);
    
    // 获取ScrollView的子View的Y轴坐标
    int lastChildBottomY = lastChild.getBottom();
    
    // 获取ScrollView的滚动位置
    int scrollY = scrollView.getScrollY();
    
    // 判断滚动位置是否到达底部
    if (scrollY + scrollViewHeight >= lastChildBottomY) {
        // 到达底部
    }
    

    其中 scrollY + scrollViewHeight 表示ScrollView当前的底部Y轴坐标,lastChildBottomY 表示ScrollView中最后一个子View的底部Y轴坐标。如果 scrollY + scrollViewHeight 大于或等于 lastChildBottomY,则ScrollView已经滚动到底部。

    • 有上下padding判断一样吗

    当ScrollView存在上下Padding时,判断是否滚动到底部的逻辑与没有Padding时略有不同。此时可以使用以下代码来判断是否滚动到底部:

    ScrollView scrollView = findViewById(R.id.scroll_view);
    
    // 获取ScrollView的可视高度
    int visibleHeight = scrollView.getHeight() - scrollView.getPaddingTop() - scrollView.getPaddingBottom();
    
    // 获取ScrollView的子View
    View lastChild = scrollView.getChildAt(scrollView.getChildCount() - 1);
    
    // 获取ScrollView的子View的底部位置
    int lastChildBottom = lastChild.getBottom();
    
    // 获取ScrollView的滚动位置
    int scrollY = scrollView.getScrollY();
    
    // 计算ScrollView底部位置
    int scrollViewBottom = scrollY + visibleHeight;
    
    // 判断ScrollView是否滚动到底部
    if (scrollViewBottom >= lastChildBottom) {
        // 到达底部
    }
    

    其中,scrollView.getHeight() 指的是 ScrollView 的可视高度,也就是除去上下 padding 后的高度;scrollView.getPaddingTop() 和 scrollView.getPaddingBottom() 分别获取 ScrollView 的上下 padding 值。

    计算 ScrollView 的底部位置时,将滚动的 Y 轴坐标 scrollY 加上可视高度 visibleHeight 就得到了 ScrollView 的底部位置。然后判断 ScrollView 的底部是否大于等于它的最后一个子 View 的底部位置 lastChildBottom,如果是,就表明 ScrollView 已经滚动到了底部。

    • 有padding和没有padding可以结合判断吗

    可以结合上述两种方法,对 ScrollView 是否滚动到底部进行判断:

    ScrollView scrollView = findViewById(R.id.scroll_view);
    
    // 获取 ScrollView 的可视高度
    int visibleHeight = scrollView.getHeight() - scrollView.getPaddingTop() - scrollView.getPaddingBottom();
    
    // 获取 ScrollView 的子View
    View lastChild = scrollView.getChildAt(scrollView.getChildCount() - 1);
    
    // 获取 ScrollView 可以滑动的范围
    int scrollRange = scrollView.getChildAt(0).getHeight() - scrollView.getHeight();
    
    // 获取 ScrollView 的滚动位置
    int scrollY = scrollView.getScrollY();
    
    // 判断 ScrollView 是否滚动到底部
    if (scrollY == scrollRange) {
        // 已滑动到底部
        return true;
    } else if (scrollViewBottom >= lastChildBottom) {
        // scrollTo 和 scrollTo 不是同时回调,所以添加两个逻辑都可(可根据需要决定是否需要使用两个逻辑组合)
        // 已滑动到底部
        return true;
    } else {
        // 未滑动到底部
        return false;
    }
    

    其中,scrollRange 是整个 ScrollView 可以滑动的范围,即第一个子 View 的高度减去 ScrollView 的高度。如果 scrollY 的值等于 scrollRange 则表明 ScrollView 已经到达底部。接下来,根据上下 padding 情况,可以使用第一种方法或第二种方法来判断是否到达底部。

    上述代码把 ScrollView 是否滚动到底部的判断条件划分为两个部分,先判断是否到达滑动范围的底部(即是否滑动到底部)。如果未到达滑动范围的底部,则根据上下 padding 情况使用不同的方法再次对 ScrollView 是否到达底部进行判断。

    可以通过自定义方式进行内部封装判断吗

    可以通过自定义一个继承自 ScrollView 的类,在该类中添加一个方法来判断 ScrollView 是否滚动到底部。

    这种方式的好处就是可以将判断 ScrollView 是否滚动到底部的逻辑封装在一个类中,不需要每次操作 ScrollView 都编写重复的代码。下面是一个示例:

    public class MyScrollView extends ScrollView {
        
        public MyScrollView(Context context) {
            super(context);
        }
    
        public MyScrollView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
        
        public boolean isScrolledToBottom() {
            if (getChildCount() == 0) {
                return true;
            }
    
            int scrollViewHeight = getHeight();
            int scrollY = getScrollY();
            View lastChild = getChildAt(getChildCount() - 1);
            int lastChildBottom = lastChild.getBottom() + getPaddingBottom();
    
            if (scrollY + scrollViewHeight >= lastChildBottom) {
                return true;
            } else {
                return false;
            }
        }
    }
    

    在上面的代码中,首先继承自 ScrollView,在 isScrolledToBottom() 方法中添加了 ScrollView 是否到达底部的逻辑,其中,getChildCount() 方法用来获取 ScrollView 的子 View 的数量;getScrollY()方法用来获取 ScrollView 的滚动位置;getChildAt() 方法用来获取 ScrollView 的子 View;getPaddingBottom() 方法用来获取 ScrollView 的下 padding。最后判断 ScrollView 是否到达底部。

    这样,在使用 MyScrollView 的时候,只需要调用 isScrolledToBottom() 方法就能判断 ScrollView 是否滚动到了底部。

    上面自定义考虑到了上下padding的情况吗?

    很抱歉,我之前自定义类的回答并没有考虑到上下 Padding 的情况。这里提供一个带有上下 Padding 的判断方法的自定义 ScrollView 类:

    public class CustomScrollView extends ScrollView {
        
        public CustomScrollView(Context context) {
            super(context);
        }
    
        public CustomScrollView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public CustomScrollView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        /**
         * 判断 ScrollView 的滑动位置是否到达底部
         * @return  true 表示到达底部,false 表示未到达底部
         */
        public boolean isScrolledToBottom() {
            if (getChildCount() == 0) {
                return true;
            }
    
            int scrollViewHeight = getHeight() - getPaddingTop() - getPaddingBottom();
            int scrollY = getScrollY() + getPaddingTop();
            View lastChild = getChildAt(getChildCount() - 1);
            int lastChildBottom = lastChild.getBottom() + ((MarginLayoutParams) lastChild.getLayoutParams()).bottomMargin;
    
            if (scrollY + scrollViewHeight >= lastChildBottom) {
                return true;
            }
    
            return false;
        }
    }
    

    在这个自定义 ScrollView 类中,我们重写了 isScrolledToBottom() 方法,这个方法的实现方式和之前在ScrollView中提供的方法类似,不同之处在于这里将上下 Padding 也计算进去了。

    具体而言,以上述代码为例,首先使用 getHeight() 方法获取了 ScrollView 的可显示高度,然后使用 getScrollY() 方法获取了 ScrollView 的滚动位置,接下来获取了 ScrollView 最后一个子 View 的底部位置,这里的底部位置需要加上子 View 的底部 Margin,最后将 Padding 也计算进去,就得到了 ScrollView 底部的位置。通过判断 ScrollView 最底端的位置是否小于或等于 ScrollView 的底部位置,就可以判断 ScrollView 是否滑动到了底部。

    相关文章

      网友评论

          本文标题:怎样判断 android ScrollView 是否滚到底部

          本文链接:https://www.haomeiwen.com/subject/ceskrdtx.html