美文网首页
View 的滑动

View 的滑动

作者: 黎明前见彩虹 | 来源:发表于2018-01-29 18:00 被阅读0次

    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 的滑动

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