这一节我想记录的是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();
}
}
}
/**
* 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 实现的
mScrollX:代表的是 View内容左边缘的距离到View左边缘在水平方向的距离
mScrollY: 代表的是View内容上边缘的距离到View上边缘在垂直方向的距离 (这两个值都是以View内容的上边缘和左边缘为基准的)
从这两个值的定义来看,scrollTo和scrollBy只能改变View内容的位置而不能改变View在布局中的位置。
也可以这么理解:
如果偏移位置发生了改变,就会给mScrollX和mScrollY赋新值,改变当前位置。
scrollTo(int x,int y)中的x,y 不是代表坐标而是代表了偏移量
例如: 我要移动view到坐标点(100,100),那么我的偏移量就是(0,,0) - (100,100) = (-100 ,-100) ,我就要执行view.scrollTo(-100,-100),达到这个效果。
二.使用动画
因为android 3.0以下的都不用了 所以这里只介绍属性动画如何实现View 的移动.
ObjectAnimator.ofFloat(targetView,"translationX",0,100).setDuration(100).start(); 这行代码就能够让View滑动 (动画在下一节中会说到)
三.改变布局参数(即改变布局参数)
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) updateCowBtn.getLayoutParams();
params.leftMargin +=10;
updateCowBtn.requestLayout();
通过改变LayoutParams的方式去实现View的滑动同样是一种灵活的方式,需要根据不同的情况去处理
三种不同的滑动的方式
scrollTo/scrollBy : 操作简单,适合对View内容的滑动
动画:操作简单,主要使用于没有交互的View和实现复杂的动画
改变布局参数:操作有点复杂,使用于有交互的View