【Android】canScrollVertically和canScrollHorizontally

学而不思则罔,思而不学则殆


简介

canScrollVertically和canScrollHorizontally是原生View中的方法提供,用来判断View能否在某个方向上滑动。

总结

总结表格

测试返回值ture返回值false
canScrollVertically(1)能够向上滑动不能向上滑动
canScrollVertically(-1)能够向下滑动不能向下滑动
canScrollHorizontally(1)能够向左滑动不能向左滑动
canScrollHorizontally(-1)能够向右滑动不能向右滑动

官方文档疑惑

    /**
     * Check if this view can be scrolled vertically in a certain direction.
     *
     * @param direction Negative to check scrolling up, positive to check scrolling down.
     * @return true if this view can be scrolled in the specified direction, false otherwise.
     */
    public boolean canScrollVertically(int direction) {
        final int offset = computeVerticalScrollOffset();
        final int range = computeVerticalScrollRange() - computeVerticalScrollExtent();
        if (range == 0) return false;
        if (direction < 0) {
            return offset > 0;
        } else {
            return offset < range - 1;
        }
    }

检查此视图是否可以在某个方向上垂直滚动,
@param direction负值检查向上滚动,正向检查向下滚动。
@return如果此视图可以在指定方向滚动,则为true,否则为false

这个跟实际测试结果相反。我把传入的direction设为负值,才是判断手指能否向下滑动,正值是判断手指能否向上滑动。不知道是不是作者对这个“滚动”的对象或者坐标系跟我理解的不同,总之,在我看来,这个注释和代码效果是完全相反的。

    /**
     * Check if this view can be scrolled horizontally in a certain direction.
     *
     * @param direction Negative to check scrolling left, positive to check scrolling right.
     * @return true if this view can be scrolled in the specified direction, false otherwise.
     */
    public boolean canScrollHorizontally(int direction) {
        final int offset = computeHorizontalScrollOffset();
        final int range = computeHorizontalScrollRange() - computeHorizontalScrollExtent();
        if (range == 0) return false;
        if (direction < 0) {
            return offset > 0;
        } else {
            return offset < range - 1;
        }
    }

检查向左滚动为负数,检查向右滚动为正数。
同理,也跟实际相反。

测试

测试canScrollVertically

自定义RecyclerView:

public class DiyRecyclerView extends RecyclerView {
    public DiyRecyclerView(@NonNull Context context) {
        super(context);
    }

    public DiyRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public DiyRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public boolean onTouchEvent(MotionEvent e) {
        Log.d("zhangyu20201011", "canScrollVertically(-1):" + canScrollVertically(-1)+" canScrollVertically(1):"+canScrollVertically(1));
        return super.onTouchEvent(e);
    }
}

在onTouchEvent方法中打印canScrollVertically的值。其中canScrollVertically表示竖直方向能否滑动。
滑动到顶部,在往下滑动的时候,打印log如下:

2020-10-11 22:44:09.242 11039-11039/com.example.bitmapdemo D/zhangyu20201011: canScrollVertically(-1):false canScrollVertically(1):true
2020-10-11 22:44:16.250 11039-11039/com.example.bitmapdemo D/zhangyu20201011: canScrollVertically(-1):false canScrollVertically(1):true
2020-10-11 22:44:16.479 11039-11039/com.example.bitmapdemo D/zhangyu20201011: canScrollVertically(-1):false canScrollVertically(1):true

中间部分滑动:

2020-10-11 22:44:41.851 11039-11039/com.example.bitmapdemo D/zhangyu20201011: canScrollVertically(-1):true canScrollVertically(1):true
2020-10-11 22:44:41.867 11039-11039/com.example.bitmapdemo D/zhangyu20201011: canScrollVertically(-1):true canScrollVertically(1):true
2020-10-11 22:44:42.199 11039-11039/com.example.bitmapdemo D/zhangyu20201011: canScrollVertically(-1):true canScrollVertically(1):true

滑动到底部,再往上滑动:

2020-10-11 22:45:08.361 11039-11039/com.example.bitmapdemo D/zhangyu20201011: canScrollVertically(-1):true canScrollVertically(1):false
2020-10-11 22:45:42.289 11039-11039/com.example.bitmapdemo D/zhangyu20201011: canScrollVertically(-1):true canScrollVertically(1):false
2020-10-11 22:45:42.468 11039-11039/com.example.bitmapdemo D/zhangyu20201011: canScrollVertically(-1):true canScrollVertically(1):false

测试canScrollHorizontally

测试代码:

public class DiyRecyclerView extends RecyclerView {
    public DiyRecyclerView(@NonNull Context context) {
        super(context);
    }

    public DiyRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public DiyRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        Log.d("zhangyu20201011", "canScrollHorizontally(-1):" + canScrollHorizontally(-1)+" canScrollHorizontally(1):"+canScrollHorizontally(1));
        return super.dispatchTouchEvent(ev);
    }
}

滑动到最左边,向右滑动,这个时候已经滑动不动了,log如下:

2020-10-11 22:54:33.937 11666-11666/com.example.bitmapdemo D/zhangyu20201011: canScrollHorizontally(-1):false canScrollHorizontally(1):true
2020-10-11 22:54:34.028 11666-11666/com.example.bitmapdemo D/zhangyu20201011: canScrollHorizontally(-1):false canScrollHorizontally(1):true
2020-10-11 22:54:34.296 11666-11666/com.example.bitmapdemo D/zhangyu20201011: canScrollHorizontally(-1):false canScrollHorizontally(1):true

中间位置:

2020-10-11 22:55:12.024 11666-11666/com.example.bitmapdemo D/zhangyu20201011: canScrollHorizontally(-1):false canScrollHorizontally(1):true
2020-10-11 22:55:12.106 11666-11666/com.example.bitmapdemo D/zhangyu20201011: canScrollHorizontally(-1):false canScrollHorizontally(1):true
2020-10-11 22:55:12.138 11666-11666/com.example.bitmapdemo D/zhangyu20201011: canScrollHorizontally(-1):false canScrollHorizontally(1):true

滑动到最右边,向左滑动:

2020-10-11 22:55:51.039 11666-11666/com.example.bitmapdemo D/zhangyu20201011: canScrollHorizontally(-1):true canScrollHorizontally(1):false
2020-10-11 22:55:51.180 11666-11666/com.example.bitmapdemo D/zhangyu20201011: canScrollHorizontally(-1):true canScrollHorizontally(1):false
2020-10-11 22:55:52.095 11666-11666/com.example.bitmapdemo D/zhangyu20201011: canScrollHorizontally(-1):true canScrollHorizontally(1):false
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Android Studio是一款官方提供的集成开发环境(IDE),用于开发Android应用程序。安装Android Studio可以通过官方网站下载安装程序,并按照安装向导的指示进行安装。在安装过程中,可以选择安装目录,建议选择一个没有中文或空格的文件夹,并避免安装在自定义目录下。 安装完Android Studio后,还需要下载Android SDK(软件开发工具包),这是为了进行Android应用程序开发所必需的。在Android Studio中,可以通过设置来指定Android SDK的下载目录。另外,还需要设置Android Studio使用的gradle版本和JDK版本。如果AS自带的JDK版本不适用,可以选择使用其他版本,如java17。 在设置好Android Studio的基本配置后,需要设置虚拟设备(AVD)的内存。这可以通过在Android Studio中进行设置来完成。同时,还可以设置Android Studio的AVD目录,用于存储虚拟设备的相关文件。 总结起来,安装Android Studio和Android SDK的步骤如下: 1. 从官方网站下载Android Studio安装程序。 2. 运行安装程序,并按照向导的指示进行安装。选择一个合适的安装目录,并避免中文或空格的文件夹名称。 3. 在安装过程中,可以选择是否安装Android SDK。如果没有安装,可以在安装完成后,通过Android Studio的SDK管理器下载所需的SDK版本。 4. 完成安装后,打开Android Studio,并设置gradle使用的JDK版本和Android SDK的下载目录。 5. 根据需要,设置虚拟设备的内存和AVD目录。 这样,就完成了Android Studio和Android SDK的安装和配置。可以开始进行Android应用程序的开发了。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值