View 的滑动

1. 使用 scrollTo/scrollBy

为了实现View的滑动,View 提供了专门的方法来实现这个功能,那就是 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();
            }
        }
    }

    /**
     * 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.
     * @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);
    }

从上边的源码可以看出,scrollBy 是调用了scrollTo 方法,他实现了基于当前位置的滑动,而 scrollTo 它则实现了基于所传参数的绝对滑动。利用 scrollTo 和 scrollBy 来实现 View 的滑动,这不是一件困难的事,但是我们要明白滑动过程中 View 内部的两个属性 mScrollX 和 mScrollY 的改变规则。这两个属性可以通过 getScrollX 和 getScrollY 方法分别获得。这里先简要概括下:在滑动过程中,mScrollX 的值总等于 View 左边缘和 View 内容左边缘在水平方向的距离,mScrollY 的值总是等于 View 上边缘和 View 内容上边缘在垂直方向的距离。mScrollX 和 mScrollY 只能改变 View 内容的位置而不能改变 View 在布局中的位置。mScrollX 和 mScrollY 的单位是像素,并且当 View 左边缘在 View 内容左边缘的右边时,mScrollX 为正值,反之为负值,换句话说,如果从右往左滑动,那么 mScrollX 为正值,反之为负值。mScrollY 同理。mScrollY 从下向上滑动,为正值,反之为负值。如图所示:



至于用法,如下所示

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //        button.scrollBy(500, 500);
                button.scrollTo(50, 50);
                Log.i("width", button.getScrollX() + "");
                Log.i("width_height", button.getScrollY() + "");
            }
        });

或许有人会问,为什么要写在点击事件里边,当然,读者也可以自己试试为什么要这么写,只能说全是因为onLayout的锅。

你可能感兴趣的:(View 的滑动)