layout():改变了left,top,right,bottom,并在setFrame()中调用---invalidate()---onSizeChanged(newWidth, newHeight, oldWidth, oldHeight);---invalidate()---r.set--- p.invalidateChild(this, r);
offsetLeftAndRight():正数向右移动,负数向左移动
offsetTopAndBottom():正数向下移动,负数向上移动
5.offsetTopAndBottom(20)
正数向下移动,负数向上移动
1.tv.scrollBy(20, 0);
向左移动20px,tv.getScrollX()=20;
2.tv.scrollBy(-20, 0);
向右移动20px,tv.getScrollX()=-20;
3.tv.scrollBy(0, 20);
向上移动20px,tv.getScrollY()=20;
4.tv.scrollBy(0,-20);
向下移动20px,tv.getScrollY()=-20;
3.改变布局的实际参数来达到瞬间移动(LayoutParams,view的上下左右的参数也发生了改变)
scroller设置距离的计算与时间,并在computeScroll中判断计算是否结束,没结束就通过scrollTo来实现位移
// 调用此方法设置滚动的相对偏移 public void smoothScrollBy(int dx, int dy) { // 设置mScroller的滚动偏移量 // mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx, dy); mScroller.startScroll(0, 0, dx, dy); invalidate();// 这里必须调用invalidate()才能保证computeScroll()会被调用,否则不一定会刷新界面,看不到滚动效果 } @Override public void computeScroll() { // 先判断mScroller滚动是否完成 if (mScroller.computeScrollOffset()) { // 这里调用View的scrollTo()完成实际的滚动 scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); // 必须调用该方法,否则不一定能看到滚动效果 postInvalidate(); } super.computeScroll(); }
2.通过ValueAnimator的计算效果,在回调方法onAnimationUpdate中配合上面三种的任何一种实现平滑移动
用手 拖动的时候是通过offsetLeftAndRight来实现位移的,当手指释放后是通过mScroller.startScroll来计算,并在computeScroll()中调用mDragHelper.continueSettling(true)来实现移动的,而continueSettling中也是通过offsetLeftAndRight来实现移动的