如今,已經對scrollTo()和scrollBy()這兩個方法有了基本的瞭解,咱們再看看它們的用法。post
在這個示例中對TextView分別調用scrollTo( )和scrollBy( ),代碼以下:code
當咱們調用scrollBy()時,TextView的中的文本逐漸往其左側滾動,當執行scrollTo()時TextView的中的文本會滾動到其右側。在這是否是又印證了咱們剛纔的描述呢:執行scrollTo()和scrollBy()後View的內容發生了滾動,可是View自己是沒有發生移動的。關於這點已經獲得了驗證,可是View的內容滾動的方向怎麼和咱們預想的不同呢?日常咱們不是說座標是左負右正,上負下正麼,爲何這裏執行mTextView.scrollBy(30,0)時TextView的文本倒是往X的負軸移動呢?
其實,許多人都是有相似的疑問,如今咱們一塊兒來探究其產生的緣由。blog
在scrollTo()的源碼中咱們看到,該方法最後會調用postInvalidateOnAnimation()對View進行重繪從而執行到invalidate()。在此以Android 6.0 API Level 23爲例,對其進行剖析:ip
看到第4行代碼的時候,是否是就恍然大悟了呢?get
在進行重繪的時候在會利用l - scrollX, t - scrollY, r - scrollX, b - scrollY計算出新的l,t,r,b。源碼
若是在調用scrollTo()和scrollBy()時傳入的x,y爲正值,那麼新的l,t,r,b均會變小,從而致使View的內容向左且向上滾動。io
若是在調用scrollTo()和scrollBy()時傳入的x,y爲負值,那麼新的l,t,r,b均會變大,從而致使View的內容向右且向下滾動。
剛纔咱們經過scrollTo()和scrollBy()做用於某個View,若是要想讓多個View同時發生滾動,能夠怎麼辦呢?很簡單,只須要把這些View放到同一個ViewGroup中而後再調用這兩個方法便可,例如mLinearLayout.scrollBy(50, 0)、mLinearLayout.scrollTo(100, 20)date