天天看點

Android View Scroller問答

android中的scroll一般是調用view.scrollto()函數實作的,另外有一個view.scrollby()其實作也是view.scrollto()。關于view.scrollto(),下面有一些問題來探究一下,本文所檢視的代碼是android4.2.2的源代碼。

問:view.scrollto()的原理是什麼?

答:在android.view.view.java中有兩個變量mscrollx和mscrolly,兩個變量的定義如下:

在view的繪制過程中,會根據這兩個值對裡面的内容進行偏移。view.draw()中的代碼片段如下:

在view.scrollto()的作用就是就是改變這兩個變量,進而引起view的content位置發生變化。

問:scroll是否引起layout的改變?

答:scroll隻是改變view.mscrollx和view.mscrolly,并且在draw()函數中,根據這兩個偏移量進行繪制。是以隻是影響draw(),不會引起layout的改變。

問:如果scroll隻是在繪制的時候進行偏移,那麼對touch事件的派發是否産生影響,view事件的響應是在scroll前的位置還是scroll後的位置?

答:事件的分派是在viewgroup.dispatchtouchevent()中,檢視源碼,發現在尋找響應事件的子view時,會算上mscrollx和mscrolly的偏移。是以scroll是會對事件派發産生影響的。view事件的響應是在scroll後的位置。關鍵代碼如下:

問:scroller的作用是什麼?

答:scroller的作用是幫助scroll更加順滑的。如果我們不是想在一段時間内,有a點順滑的scroll到b點。這樣我們就要計算每次draw應該偏移多少,才能達到順滑的效果。scroller就是用來幫助計算的。具體的計算方式是在scroller.computescrolloffset()函數中。代碼如下:

問:scroll和valueanimator的差別是什麼?

答:valueanimator的本質是在一段時間内,按照一定的規律去改變一個值。而scroll就是改變mscrollx和mscrolly的值。是以理論上也可以用valueanimator來改變mscrollx和mscrolly,進而達到scroll的目的。

問:scroll和animation的差別是什麼?

答:animation也是通過在draw函數裡面實作的,但是animation隻是改變了繪制的位置,并沒有影響到事件的響應。是以當一個view從a點通過animation動畫移動到b點,view的事件繼續在a點才能響應。

繼續閱讀