view的scrollTo和scrollBy,MotionEvent的getX、getRawX和getScrollX方法的区别

一.scrollTo和scrollBy区别

首先这两个方法都是View中方法,用来实现view的滑动的,但是它不滑动view本身,只滑动view的内容 。

其中x、y表示你要滑动到的x 、y坐标;虽然scrollBy()方法内部也是调用了scrollTo()方法,但是两个方法实现方式有所不同,看源码:

    /**
     * Set the scrolled position of your view. This will cause a call to
     * {@link #onScrollChanged(int, int, int, int)} and the view will be
     * invalidated.
     * 设置视图的滚动位置。这将导致调用
     * {@link #onScrollChanged(int, int, int, int)}和视图重绘。
     * @param x the x position to scroll to   表示要滚动到的X位置
     * @param y the y position to scroll to   表示要滚动到的y位置
     */
    public void scrollTo(int x, int y) {
        if (mScrollX != x || mScrollY != y) {
            int oldX = mScrollX;
            int oldY = mScrollY;
            mScrollX = x;
            mScrollY = y;
            invalidateParentCaches();
            onScrollChanged(mScrollX, mScrollY, oldX, oldY);
            if (!awakenScrollBars()) {
                postInvalidateOnAnimation();
            }
        }
    }

    /**
     * Move the scrolled position of your view. This will cause a call to
     * {@link #onScrollChanged(int, int, int, int)} and the view will be
     * invalidated.
     * 移动视图的滚动位置。这将导致调用
	 * {@link #onScrollChanged(int, int, int, int)}和视图将被重绘。
     * @param x the amount of pixels to scroll by horizontally 要水平滚动的偏移量
     * @param y the amount of pixels to scroll by vertically 表示要垂直滚动的偏移量
     */
    public void scrollBy(int x, int y) {
        scrollTo(mScrollX + x, mScrollY + y);
    }

由源码可以知道:

  1. View#scrollTo(int x,int y)表示设置视图滚动到(x,y)坐标位置,
    View#scrollBy(int x, int y)表示在水平方向和垂直方向的偏移量。

  2. scrollTo和scrollBy方法,每次坐标改变(也就是mScrollx和mScrolly与传入x和y有一个不一致),都会回调onScrollChanged(int, int, int, int),并且调用postInvalidateOnAnimation()重新绘制视图。

二.getX、getRawX和getScrollX区别

1.getX()和getRawX()区别

getX():获取点击事件相对控件左边的x轴坐标,即点击事件距离控件左边的距离
getY():获取点击事件相对控件顶边的y轴坐标,即点击事件距离控件顶边的距离
getRawX():获取点击事件相对整个屏幕左边的x轴坐标,即点击事件距离整个屏幕左边的距离
getRawY():获取点击事件相对整个屏幕顶边的y轴坐标,即点击事件距离整个屏幕顶边的距离

请添加图片描述

2.getScrollX()和getScrollY()与getX()和getY()区别

2.1.getScrollX()和getScrollY()含义

getScrollX()和getScrollY()获取的就是scrollTo(int x,int y)方法中的mScrollX、mScrollY的值。
mScrollX:表示离View起始位置的X水平方向的偏移量
mScrollY:表示离View起始位置的Y垂直方向的偏移量
请添加图片描述

2.2.getScrollX()和getScrollY()与getX()和getY()的区别

例子:如下视频向下滑动,观察getScrollY()、getY()。

RV下滑刷新


下面两张图分别是getY()、getScrollY()打印结果:
在这里插入图片描述
在这里插入图片描述
可以看到,下滑过程中getY()值开始正增长, getScrollY()则相反为负增长。

可以得出结论:
getScrollY()为正时,即view往上偏移了;为 0 时,位置未发生了变化;为负即view往下偏移了;
getScrollX()为正时,即View往左偏移了;其他类似;
getX()为正时,手指相对View左边向右滑动的距离;
getY()为正时,手指相对View顶部向下滑动的距离;

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值