实现View滑动的三种方式:
1.通过动画给View增加平移滑动的效果
2.通过改变View的LayoutParams使得View重新布局
3.通过View自身提供的ScrollTo/scrollBy方法实现滑动
一.通过动画给View增加平移滑动的效果
使用动画移动View,主要是操作View的translationX和translationY属性,既可以采用传统的View动画,也可以采用属性动画
ObjectAnimator.ofFloat(targetView,"translationX",0,100).setDuration(100).start();
二.通过改变View的LayoutParams使得View重新布局
通过改变布局属性来移动View,即改变LayoutParams。
三.通过View自身提供的ScrollTo/scrollBy方法实现滑动
在实际的开发中我们真正地使用scrollTo()和scrollBy()来实现View的滑动的时候并不多。因为这两个方法产生的滑动是不连贯的,跳跃的,闪烁的,最终的效果也不够平滑。所以,我们多采用系统提供的工具类Scroller来实现View的滚动效果。
1.认识mScrollX和mScrollY
获取mScrollX的值,mScrollY的值:
/**
mScrollX和mScrollY表示:View的内容(content)相对于View本身在水平或垂直方向的偏移量.
**/
public final int getScrollX() {
return mScrollX;
}
public final int getScrollY() {
return mScrollY;
}
mScrollX和mScrollY的变化规律:
(1)、mScrollX的值总是等于View左边缘和View内容左边缘在水平方向的距离(mScrollX=X1-X2,,其中X1,表示View的左边缘,其中X2,表示View内容的左边缘),当View内容的左边缘位于View的左边缘的左边时,mScrollX大于零,即mScrollX为正值,反之为负值;(图中绿色的代表内容区域)
(2)、mScrollY的值总是等于View上边缘和View内容上边缘在竖直方向的距离(mScrollY=Y1-Y2,,其中Y1,表示View的上边缘,其中Y2,表示View内容的上边缘),当View内容的上边缘位于View的上边缘的上边时,mScrollY大于零,即mScrollY为正值,反之为负值;
/**
* 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);
}
scrollTo(int x, int y)
scrollTo()是实现View滚动的核心,调用该方法使得View相对于其初始位置滚动某段距离。在该方法内部将输入参数x,y分别赋值给用于表示View在X方向滚动距离的mScrollX和表示View在Y方向滚动距离的mScrollY,然后调用onScrollChanged()并且刷新重绘View。在后续的操作中调用view.getScrollX()或view.getScrollY()可以很容易地得到mScrollX和mScrollY
scrollBy(int x, int y)
在现有的基础上继续移动视图的内容.
结论:
1.mScrollX和mScrollY分别表示View在X、Y方向的滚动距离
2.scrollTo( )表示View相对于其初始位置滚动某段距离。
由于View的初始位置是不变的,所以如果利用相同输入参数多次调用scrollTo()方法,View只会出现一次滚动的效果而不是多次。
3.scrollBy( )表示在mScrollX和mScrollY的基础上继续滚动。
参考: