滑动实现的三种方式:
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即可