我們都知道 View#scrollTo/scrollBy() 方法是用于 View 內(nèi)容的滑動的葱弟。那么這兩個方法有什么區(qū)別呢皮迟?
下面通過源碼來總結(jié)這兩個區(qū)別在哪里:
public void scrollTo(int x, int y) {
if (mScrollX != x || mScrollY != y) {
int oldX = mScrollX;
int oldY = mScrollY;
mScrollX = x;
mScrollY = y;
invalidateParentCaches();
onScrollChanged(mScrollX, mScrollY, oldX, oldY);
if (!awakenScrollBars()) {
postInvalidateOnAnimation();
}
}
}
public void scrollBy(int x, int y) {
scrollTo(mScrollX + x, mScrollY + y);
}
上面是兩個方法的源碼夭织,可以清楚地看到 scrollBy 實(shí)際是調(diào)用 scrollTo 方法常拓。那么 scrollTo 做了什么事耀找?
根據(jù)傳入的 x 和 y 值,賦值給當(dāng)前的 mScrollX 和 mScrollY 兩個值饲常,這兩個值是什么意思呢?它們分別表示當(dāng)前 View 內(nèi)容需要滑動的絕對位置狼讨。
下面舉例分析:
假設(shè)當(dāng)前 View 的位置是在(60,70)的位置上贝淤,如果調(diào)用 scrollTo(-50,-50),那么當(dāng)前 View 的內(nèi)容直接滑動到(50,50)的位置上政供,結(jié)果 View 內(nèi)容的位置為 (50,50)播聪。
scrollBy 內(nèi)部就是在當(dāng)前 View 內(nèi)容的位置的基礎(chǔ)上再滑動 x 和 y 像素的距離,假設(shè)當(dāng)前 View 內(nèi)容的位置為(60,70)布隔,然后調(diào)用 scrollBy(-50离陶,-50) 之后,View 內(nèi)容會在水平向右滑動50px衅檀,豎直向下滑動 50px招刨,結(jié)果 View 內(nèi)容的位置為(110,120)。
結(jié)論: scrollTo 方法是實(shí)現(xiàn) View 內(nèi)容的絕對滑動哀军,而 scrollBy 是實(shí)現(xiàn) View 內(nèi)容的相對滑動沉眶。
在上面有一點(diǎn)需要注意的是,我一直在強(qiáng)調(diào) View 內(nèi)容的滑動杉适,而不是 View 的滑動谎倔,因?yàn)?scroll 就是實(shí)現(xiàn)的是 View 內(nèi)容的滑動,View 本身的位置和頂點(diǎn)坐標(biāo)并不會發(fā)生改變猿推,這是需要注意的一點(diǎn)片习;
當(dāng) View 的內(nèi)容的左邊緣在 View 的左邊緣的左邊時(shí),那么 scollX > 0蹬叭,否則則相反藕咏;
當(dāng) View 的內(nèi)容的頂部邊緣在 View 的頂部邊緣上邊時(shí),那么 scolY > 0秽五,否則則相反孽查;