當(dāng)我在使用scollview時(shí)發(fā)現(xiàn)一個(gè)有趣的現(xiàn)象,在按鈕點(diǎn)擊的事件中,我們進(jìn)行對(duì)與scollview的位置設(shè)置scollTo方法是完全ok的,但是當(dāng)我們想要在初始化過程中就進(jìn)行對(duì)scollview滑動(dòng)到的位置進(jìn)行設(shè)定時(shí),就無(wú)效了。
網(wǎng)上找了一些資料,都說(shuō)是用handler.postDelayed方法,進(jìn)行一個(gè)延遲操作,試過了之后,并沒有什么用,
由此對(duì)scollview進(jìn)行研究:
1.scrollTo() 是直接指定滾動(dòng)條的位置, 但是由于這個(gè)動(dòng)作不是單純關(guān)于 ScrollView 而已, 還要根據(jù) ScrollView 里面包含的View 的實(shí)際信息. 所以這動(dòng)作必須在頁(yè)面加載完成以后才能執(zhí)行.
2 那么如何判斷頁(yè)面加載完成呢,在activity中有這樣一個(gè)方法:
@Overridepublic void onWindowFocusChanged(boolean hasFocus) {// TODO Auto-generated method stubsuper.onWindowFocusChanged(hasFocus);if (hasFocus) {//do something 當(dāng)activity 得到或者失去焦點(diǎn)時(shí),會(huì)執(zhí)行的方法,得到焦點(diǎn)返回 true,反之}}3.activity中頁(yè)面初始化渲染完成之后,進(jìn)行scollview位置的設(shè)定:
mScrollView.post(new Runnable() { @Override public void run() { mScrollView.scrollTo(0, 1000); // 0 代表x軸移動(dòng)的距離, 1000表示y軸移動(dòng)的距離 } });4下面進(jìn)行源碼剖析:
scollview源碼:
/** * {@inheritDoc} * * <p>This version also clamps the scrolling to the bounds of our child. */ @Override public void scrollTo(int x, int y) { // we rely on the fact the View.scrollBy calls scrollTo. if (getChildCount() > 0) { View child = getChildAt(0); x = clamp(x, getWidth() - mPaddingRight - mPaddingLeft, child.getWidth()); y = clamp(y, getHeight() - mPaddingBottom - mPaddingTop, child.getHeight()); if (x != mScrollX || y != mScrollY) { super.scrollTo(x, y); } } }它的父類View:
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(); } } }由此可見:
if (mScrollX != x || mScrollY != y) 這個(gè)判斷語(yǔ)句有沒有通過是關(guān)鍵所在. 這也間接說(shuō)明了, 在Activity 沒初始化完成, ScrollView 對(duì)象獲取的一些信息是不準(zhǔn)確的, 直接導(dǎo)致了scrollTo() 方法無(wú)效.
5.于是我們得出結(jié)論,要想在初始化中設(shè)置horizontalscollview的位置,需要在activity頁(yè)面渲染完成之后,進(jìn)行設(shè)置,也就是在onWindowFocusChanged 方法中設(shè)置偏移位置,則生效。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注