【View基础知识】View的滑动之scrollTo、scrollBy

本系列文章部分摘自《Android开发艺术探索》,目的是提取精干知识点加上自己部分理解作为备忘笔记,如有侵权请及时联系我,再次感谢作者,如喜欢请支持购买作者正版书籍

目录

  • 目录
  • View的滑动方式
  • scrollTo/scrollBy实现的滑动
  • scrollTo/scrollBy滑动的原理


View的滑动方式

View 的滑动主要通过三种方式实现:

  • 通过View本身提供的scrollTo/scrollBy
  • 通过动画实现View的滑动
  • 通过改变View的LayoutParams使View重新布局实现滑动

scrollTo/scrollBy实现的滑动

本篇文章主要记录scrollTo/scrollBy实现的滑动

首先来看一段源码

/**
 * 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.
 * @param x the x position to scroll to
 * @param y the y position to scroll to
 */
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();
        }
    }
}

从源码我们可以看出:

  • scrollBy实际上也是调用了scrollTo
  • scrollTo使基于所传参数的绝对滑动(比如:当前坐标是(1,1)所传参数x:2,y:2,最终会滑动到(2,2))
  • scrollBy使基于当前位置的相对滑动(比如:当前坐标是(1,1)所传参数x:2,y:2,最终会滑动到(1+2,1+2))

scrollTo/scrollBy滑动的原理

上一篇中我解释了如何用Scroller来实现弹性滑动,我们要理解利用scrollTo/scrollBy来时实现滑动不是一件难事,但是我们要明白滑动过程中View内部的两个属性mScrollX和mScrollY的改变规则,分别可以通过getScrollX、getScrollY获得,需要说明几点:

  1. 在滑动过程中,mScrollX的值总是等于View的左边缘到View内容的左边缘的水平距离(View左边缘x - View内容左边缘x),mScrollY的值总是等于View的上边缘到View内容的上边缘的竖直距离(View上边缘y - View内容上边缘y),这就证明了下面第4条的结论。
  2. View的边缘是指View的的位置,有四个顶点组成,View内容边缘是指View中内容的边缘,具体如下所示。
  3. scrollTo/scrollBy只是改变了View中内容的位置,并没有改变View的实际位置,可根据下图理解。
  4. mScrollX/mScrollY单位是像素,当View的左边缘在View内容左边缘左边时,mScrollX为负数,反之则为正数;View上边缘在View内容上边缘上边时mScrollY为负数,反之则为正数。换句话说:从左向右滑动时mScrollX为负数,反之则为正数;从上向下滑动时mScrollY为负数,反之则为正数,请结合1的结论理解;
    【View基础知识】View的滑动之scrollTo、scrollBy_第1张图片

根据上面的图和我们的分析,可以知道,scrollTo/scrollBy来实现的滑动,只是使View中内容滑动,并没有滑动View的实际位置,也就是不管怎么滑动,都不会改变View的位置,这点要特别注意,比如:scrollTo/scrollBy实现滑动后,View的点击事件相应区域在什么位置?

你可能感兴趣的:(Android基础)