scrollTo/scrollBy 使用詳解

在android中每一個(gè)view里都有這兩個(gè)方法,所以理論上所有的view都是可以滑動(dòng)的。

關(guān)于這兩者,官網(wǎng)上是這樣說的:

這兩者的介紹只有一字之差,一個(gè)是“move”,一個(gè)是“set”,因此,我的理解是scrollTo是相對于view的初始位置的,是不會(huì)變的。而scrollBy是相對于當(dāng)前位置的,位置一直是移動(dòng)的。

這里寫一個(gè)demo如下:

   public void btnClick(View view) {
    switch (view.getId()) {
        case R.id.scrollerToBtn:
            //scrollTo相對于view的初始位置移動(dòng),所以這里view無論點(diǎn)擊多少次,都只會(huì)相對于view的初始位置移動(dòng)一定距離。
            mLayout.scrollTo(getResources().getDimensionPixelSize(R.dimen.a), getResources().getDimensionPixelSize(R.dimen.b));
            break;
        case R.id.scrollerByBtn:
            //scrollBy相對于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()里直接寫int型的像素值的話,編輯器可能會(huì)報(bào)錯(cuò)(運(yùn)行正常)。建議寫在dimen.xml文件里,也便于維護(hù)。

我們再來看看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)前位置的相對滑動(dòng),而scrollTo則是實(shí)現(xiàn)了“絕對滑動(dòng)”。 需要注意的一點(diǎn)就是mScrollX/mScrollY這兩個(gè)屬性的規(guī)則,mScrollX表示的是view的左邊緣到view的內(nèi)容的左邊緣的水平距離,類似的,mScrollY表示的是view的上邊緣與view內(nèi)容的上邊緣的豎直方向的距離。

基于scrollTo/scrollBy的特性,我們可以很容易的利用它們來實(shí)現(xiàn)view的滑動(dòng),解決一些常見的問題,比如,登陸界面的鍵盤遮擋輸入框的問題。但是需要注意的是,使用這兩個(gè)方法進(jìn)行view的滑動(dòng),只能對view的內(nèi)容進(jìn)行滑動(dòng),對于view本身并不能滑動(dòng)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 什么是View View 是 Android 中所有控件的基類。 View的位置參數(shù) View 的位置由它的四個(gè)頂...
    acc8226閱讀 1,373評論 0 7
  • 第3章 View的事件體系 [TOC] 3.1 View基礎(chǔ)知識(shí) 1. View的位置參數(shù) 首先來認(rèn)識(shí)一下View...
    反復(fù)橫跳的龍?zhí)?/span>閱讀 1,131評論 0 5
  • 目前移動(dòng)設(shè)備流行,我們要在如此小的屏幕上盡可能給用戶展現(xiàn)更多的內(nèi)容,就需要在應(yīng)用上通過滑動(dòng)來顯示和隱藏部分內(nèi)容,V...
    shenhuniurou閱讀 1,013評論 2 1
  • “韓國電影有那么好嗎?” 千萬不要把韓國電影和韓國電視劇聯(lián)想到一塊,雖然棒子的電視劇也不乏精品,但其矯揉造作之感實(shí)...
    曲有誤周郎顧87閱讀 2,153評論 1 3
  • 【聲明:】本文是作者(蘑菇v5)原創(chuàng),版權(quán)歸作者 蘑菇v5所有,侵權(quán)必究。本文首發(fā)在簡書。如若轉(zhuǎn)發(fā),請注明作者和來...
    蘑菇v5閱讀 307評論 0 0

友情鏈接更多精彩內(nèi)容