2011年8月23日 星期二

scrollTo 沒反應

撰寫 Android 的專案時畢竟大多數情況都是在小尺寸螢幕上顯示…
一直以來都很依賴 ScrollView 或 HorizontalScrollView 讓用戶捲動過多的資訊…
有次要自動幫用戶捲動到重要資訊的位置時…卻發現下了 scrollTo 沒反應…

比較詭異的事情是…並非所有情況下都沒反應…
大概觀察一下發現在建立 View 的時候 scrollTo 會沒反應…太多 System.gc() 會沒反應…
在捲動的當時下 scrollTo 也不會有反應…其他 UI busy 時也有很大的機率沒反應…
來看一下這段 android.view.View 的 scrollTo source code


public void scrollTo(int x, int y) {
    if (mScrollX != x || mScrollY != y) {
        int oldX = mScrollX;
        int oldY = mScrollY;
        mScrollX = x;
        mScrollY = y;
        onScrollChanged(mScrollX, mScrollY, oldX, oldY);
        if (!awakenScrollBars()) {
            invalidate();
        }
    }
}


原來問題是出在 View Create 或捲動時 mScrollX 或 mScrollY 不正確…
mScrollX 與 mScrollY 是根據所擁有的 Child 所計算出來的…
而這個 if 進不去自然就不會如預期的捲動嘍…
解決方法是養成良好習慣…若要操作 View 的 scrollTo Method 時…
請使用 View.post 或 View.postDelay Method
如此可以讓命令進到該元件的 RunQueue 中待目前的事忙完後執行
簡單的範別例如下


int positionX = 50;
HorizontalScrollView hScrollView = new HorizontalScrollView();
hScrollView.post(new Runnable() {public void run() {hScrollView.scrollTo(positionX, 0);}});

沒有留言:

張貼留言