天天看點

透析Java本質-誰建立了對象,this是什麼

Android系統手機螢幕的左上角為坐标系,同時y軸方向與笛卡爾坐标系的y軸方向想反。通過提供的api如getLeft , getTop, getBottom, getRight可以獲得控件在parent中的相對位置。同時,也可以獲得控件在螢幕中的絕對位置,詳細用法可參考

當我們編寫一些自定義的滑動控件時,會用到一些api如scrollTo(),scrollBy(),getScrollX(), getScrollY()。由于常常會對函數getScrollX(), getScrollY()傳回的值的含義産生混淆,尤其是正負關系,是以本文将使用幾幅圖來對這些函數進行講解以友善大家記憶。

注意:調用View的scrollTo()和scrollBy()是用于滑動View中的内容,而不是把某個View的位置進行改變。如果想改變莫個View在螢幕中的位置,可以使用如下的方法。

調用public void offsetLeftAndRight(int offset)用于左右移動方法或public void (int

offset)用于上下移動。

                 如:button.offsetLeftAndRignt(300)表示将button控件向左移動300個像素。

scrollTo(int x, int y) 是将View中内容滑動到相應的位置,參考的坐标系原點為parent View的左上角。

       調用scrollTo(100, 0)表示将View中的内容移動到x = 100, y = 0的位置,如下圖所示。注意,圖中黃色矩形區域表示的是一個parent View,綠色虛線矩形為parent view中的内容。一般情況下兩者的大小一緻,本文為了顯示友善,将虛線框畫小了一點。圖中的黃色區域的位置始終不變,發生位置變化的是顯示的内容。

透析Java本質-誰建立了對象,this是什麼

 同理,scrollTo(0, 100)的效果如下圖所示:

透析Java本質-誰建立了對象,this是什麼

scrollTo(100, 100)的效果圖如下:

透析Java本質-誰建立了對象,this是什麼

若函數中參數為負值,則子View的移動方向将相反。

透析Java本質-誰建立了對象,this是什麼

scrollBy(int x, int y)其實是對scrollTo的包裝,移動的是相當位置。 scrollTo(int x, int y)的源碼和scrollBy(int x, int y)源碼如下所示.

可見,mScrollX和mScrollY是View類中專門用于記錄滑動位置的變量。這兩個函數最終調用onScrollChanged()函數,感興趣者可以參考他們的源代碼。

了解了scrollTo(int x, int y)和scrollBy(int x, int y)的用法,就不難了解getScrollX() 和getScrollY()。這兩個函數的源碼如下所示: