View的滑动

滑动实现的三种方式:

1、通过VIew自身的scrollTo/scrollBy方法实现
2、通过动画给View施加平移效果
3、通过改变View的LayoutParams使得View重新布局

ScrollTo/ScrollBy(只能针对View内容滑动)

看下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.
     * @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();
            }
        }
    }

其实他的注释已经告诉我们了,这个方法其实是通过一个onScrollChanged的回调来刷新当前View
有意思的你会发现ScrollBy其实内部也是调用了ScrollTo:

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

他们区别则是对于传入的x,y的处理。scrollBy()其实是在原坐标的基础上移动的,即相对滑动。而scrollTo则是绝对滑动
通过ScrollTo/ScrollBy来实现滑动只能实现View的内容的滑动,并不能滑动View本身.

使用动画滑动

这个就简单了,动画中有个位移动画。可以直接通过他来实现View的滑动,这个主要操作view的translationX和translationY。
需要注意的是,通过位移动画移动的只是View的影响,并没有改变View 的真实位置。这样会导致一些问题,比如说本来这个View有点击事件,移动后的View点击没有效果,反而是点击View之前的位置会相应事件,这就很怪异了。
当然Android3.0之后的属性动画没有这个问题。

改变布局参数实现滑动

这个目前看没有啥毛病,就是操作有些复杂。
比如说你要将View向左移动200px,那么你就将View的marginRight +200即可

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