一直以來都很依賴 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);}});
沒有留言:
張貼留言