在android中每一個(gè)view里都有這兩個(gè)方法幻捏,所以理論上所有的view都是可以滑動(dòng)的醋奠。
關(guān)于這兩者沛善,官網(wǎng)上是這樣說(shuō)的:這兩者的介紹只有一字之差哄啄,一個(gè)是“move”轧葛,一個(gè)是“set”,因此芳杏,我的理解是scrollTo是相對(duì)于view的初始位置的空幻,是不會(huì)變的。而scrollBy是相對(duì)于當(dāng)前位置的,位置一直是移動(dòng)的士袄。
這里寫(xiě)一個(gè)demo如下:
public void btnClick(View view) {
switch (view.getId()) {
case R.id.scrollerToBtn:
//scrollTo相對(duì)于view的初始位置移動(dòng),所以這里view無(wú)論點(diǎn)擊多少次赤拒,都只會(huì)相對(duì)于view的初始位置移動(dòng)一定距離。
mLayout.scrollTo(getResources().getDimensionPixelSize(R.dimen.a), getResources().getDimensionPixelSize(R.dimen.b));
break;
case R.id.scrollerByBtn:
//scrollBy相對(duì)于view的當(dāng)前位置移動(dòng)蝙茶,所以此處view是每點(diǎn)擊一次就向右下角移動(dòng)一次的隆夯。
mLayout.scrollBy(getResources().getDimensionPixelSize(R.dimen.a), getResources().getDimensionPixelSize(R.dimen.b));
break;
}
}
布局文件也就是兩個(gè)按鈕畸肆,這里需要注意下如果scrollTo()里直接寫(xiě)int型的像素值的話(huà),編輯器可能會(huì)報(bào)錯(cuò)(運(yùn)行正常)。建議寫(xiě)在dimen.xml文件里,也便于維護(hù)厦瓢。
我們?cè)賮?lái)看看view里的scrollTo/scrollBy的源碼是如何使用的浙垫。
/**
* Set the scrolled position of your view. This will cause a call to
* {@link #onScrollChanged(int, int, int, int)} and the view will be
* invalidated.
*
* @param x the x position to scroll to
* @param y the y position to scroll to
*/
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();
}
}
}
/**
* Move the scrolled position of your view. This will cause a call to
* {@link #onScrollChanged(int, int, int, int)} and the view will be
* invalidated.
*
* @param x the amount of pixels to scroll by horizontally
* @param y the amount of pixels to scroll by vertically
*/
public void scrollBy(int x, int y) {
scrollTo(mScrollX + x, mScrollY + y);
}
實(shí)際上封拧,scrollBy是內(nèi)部就是調(diào)用了scrollTo的味抖,實(shí)現(xiàn)了基于當(dāng)前位置的相對(duì)滑動(dòng),而scrollTo則是實(shí)現(xiàn)了“絕對(duì)滑動(dòng)”灰粮。 需要注意的一點(diǎn)就是mScrollX/mScrollY這兩個(gè)屬性的規(guī)則仔涩,mScrollX表示的是view的左邊緣到view的內(nèi)容的左邊緣的水平距離,類(lèi)似的粘舟,mScrollY表示的是view的上邊緣與view內(nèi)容的上邊緣的豎直方向的距離熔脂。
基于scrollTo/scrollBy的特性,我們可以很容易的利用它們來(lái)實(shí)現(xiàn)view的滑動(dòng)柑肴,解決一些常見(jiàn)的問(wèn)題霞揉,比如,登陸界面的鍵盤(pán)遮擋輸入框的問(wèn)題晰骑。但是需要注意的是适秩,使用這兩個(gè)方法進(jìn)行view的滑動(dòng),只能對(duì)view的內(nèi)容進(jìn)行滑動(dòng)硕舆,對(duì)于view本身并不能滑動(dòng)隶症。