android 佈局滑動中scrollTo 和 scrollBy 方法使用說明

首先,看源碼:框架

public void scrollTo(int x, int y) {
      if (mScrollX != x || mScrollY != y) {
          int oldX = mScrollX;
          int oldY = mScrollY;
          mScrollX = x;
          mScrollY = y;
          onScrollChanged(mScrollX, mScrollY, oldX, oldY);
          if (!awakenScrollBars()) {
              invalidate();
          }
      }
  }
public void scrollBy(int x, int y) {
        scrollTo(mScrollX + x, mScrollY + y);
    }

從源碼中能夠看到,scrollBy()的內部實際上是調用了scrollTo()。在scrollTo()中,調用了onScrollChanged()和invalidate()。onScrollChanged()的做用就是告訴系統(能夠理解爲Android框架),這個View的scrollTo()或scrollBy()曾經被調用過;而invalidate()是告訴系統,這個View須要被從新繪製。code

mScrollX:表示離視圖起始位置的x水平方向的偏移量
mScrollY:表示離視圖起始位置的y垂直方向的偏移量

分別經過getScrollX() 和getScrollY()方法得到。 注意:mScrollX和mScrollY指的並非座標,而是偏移量。get

scrollTo(int x,int y):

若是偏移位置發生了改變,就會給mScrollX和mScrollY賦新值,改變當前位置。 #####注意:x,y表明的不是座標點,而是偏移量。 例如: 我要移動view到座標點(100,100),那麼個人偏移量就是:原位置座標-目標位置座標=偏移量 (0,,0) - (100,100) = (-100 ,-100) ,我就要執行view.scrollTo(-100,-100),達到這個效果。源碼

scrollBy(int x,int y):

從源碼中看出,它其實是調用了scrollTo(mScrollX + x, mScrollY + y); mScrollX + x和mScrollY + y,即表示在原先偏移的基礎上在發生偏移,通俗的說就是相對咱們當前位置偏移。 因爲sctrollTo只是移動了內容content,因此是父類VIEW裏面的全部子控件在移動,而父容器ViewGroup並無移動,也就是說位置它還佔用着,移動子控件的時候,子控件只能在容器裏面移動,若是子控件移動到了超出的地方(父控件的範圍),那麼超出的位置就不會顯示了。容器

相關文章
相關標籤/搜索