以下三種爲最基本設置控件瞬移的方法
1.通過直接更改view的left,top,right,bottom的方法(瞬間改變)
layout():改變了left,top,right,bottom,並在setFrame()中調用---invalidate()---onSizeChanged(newWidth, newHeight, oldWidth, oldHeight);---invalidate()---r.set--- p.invalidateChild(this, r);
offsetLeftAndRight():正數向右移動,負數向左移動
offsetTopAndBottom():正數向下移動,負數向上移動
5.offsetTopAndBottom(20)
正數向下移動,負數向上移動
2.scroll方法瞬間移動(是控制子view的移動,left,top,right,bottom不變)
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的上下左右的參數也發生了改變)
以下兩種爲最基本設置控件平滑移動的方法:
1.scroller配合scrollTo來控制內部view的平滑移動(scroller實際上只是賦予了計算效果,可配合上面三種任何一種的移動)
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來實現移動的