国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

ViewPager原理分析(一)

付倫 / 2352人閱讀

摘要:當(dāng),調(diào)用上面的實(shí)現(xiàn)主要在中和舊的的比較,如果不同,重新獲取遍歷之前的,在范圍之內(nèi)的沒(méi)有的添加,在范圍之外的有的刪除遍歷之后的,在范圍之內(nèi)的沒(méi)有的添加,在范圍之外的有的刪除是一個(gè)在中由程序員調(diào)用第一步第二步第三步

當(dāng)MotionEvent.ACTION_UP,調(diào)用populate
上面的實(shí)現(xiàn)主要在ViewPager.populte(curItemIndex)中;

curItemIndex和舊的mCurItem的index比較,如果不同,重新獲取mCurItem;

遍歷mCurItem之前的Item, 在范圍之內(nèi)的沒(méi)有的添加,在范圍之外的有的刪除;

遍歷mCurItem之后的Item, 在范圍之內(nèi)的沒(méi)有的添加,在范圍之外的有的刪除;

ViewPager是一個(gè)ViewGroup, addView/removeView 在destroyItem,instantiateItem中由程序員調(diào)用;

ViewPager.java:

        //第一步
        int curIndex = -1;
        ItemInfo curItem = null;
        for (curIndex = 0; curIndex < mItems.size(); curIndex++) {
            final ItemInfo ii = mItems.get(curIndex);
            if (ii.position >= mCurItem) {
                if (ii.position == mCurItem) curItem = ii;
                break;
            }
        }

        if (curItem == null && N > 0) {
            curItem = addNewItem(mCurItem, curIndex);
        }
        ... ...
        //第二步,第三步
        if (curItem != null) {
            float extraWidthLeft = 0.f;
            int itemIndex = curIndex - 1;
            ItemInfo ii = itemIndex >= 0 ? mItems.get(itemIndex) : null;
            final int clientWidth = getClientWidth();
            final float leftWidthNeeded = clientWidth <= 0 ? 0 :
                    2.f - curItem.widthFactor + (float) getPaddingLeft() / (float) clientWidth;
            for (int pos = mCurItem - 1; pos >= 0; pos--) {
                if (extraWidthLeft >= leftWidthNeeded && pos < startPos) {
                    if (ii == null) {
                        break;
                    }
                    if (pos == ii.position && !ii.scrolling) {
                        mItems.remove(itemIndex);
                        mAdapter.destroyItem(this, pos, ii.object);
                        if (DEBUG) {
                            Log.i(TAG, "populate() - destroyItem() with pos: " + pos
                                    + " view: " + ((View) ii.object));
                        }
                        itemIndex--;
                        curIndex--;
                        ii = itemIndex >= 0 ? mItems.get(itemIndex) : null;
                    }
                } else if (ii != null && pos == ii.position) {
                    extraWidthLeft += ii.widthFactor;
                    itemIndex--;
                    ii = itemIndex >= 0 ? mItems.get(itemIndex) : null;
                } else {
                    ii = addNewItem(pos, itemIndex + 1);
                    extraWidthLeft += ii.widthFactor;
                    curIndex++;
                    ii = itemIndex >= 0 ? mItems.get(itemIndex) : null;
                }
            }

            float extraWidthRight = curItem.widthFactor;
            itemIndex = curIndex + 1;
            if (extraWidthRight < 2.f) {
                ii = itemIndex < mItems.size() ? mItems.get(itemIndex) : null;
                final float rightWidthNeeded = clientWidth <= 0 ? 0 :
                        (float) getPaddingRight() / (float) clientWidth + 2.f;
                for (int pos = mCurItem + 1; pos < N; pos++) {
                    if (extraWidthRight >= rightWidthNeeded && pos > endPos) {
                        if (ii == null) {
                            break;
                        }
                        if (pos == ii.position && !ii.scrolling) {
                            mItems.remove(itemIndex);
                            mAdapter.destroyItem(this, pos, ii.object);
                            if (DEBUG) {
                                Log.i(TAG, "populate() - destroyItem() with pos: " + pos
                                        + " view: " + ((View) ii.object));
                            }
                            ii = itemIndex < mItems.size() ? mItems.get(itemIndex) : null;
                        }
                    } else if (ii != null && pos == ii.position) {
                        extraWidthRight += ii.widthFactor;
                        itemIndex++;
                        ii = itemIndex < mItems.size() ? mItems.get(itemIndex) : null;
                    } else {
                        ii = addNewItem(pos, itemIndex);
                        itemIndex++;
                        extraWidthRight += ii.widthFactor;
                        ii = itemIndex < mItems.size() ? mItems.get(itemIndex) : null;
                    }
                }
            }

            calculatePageOffsets(curItem, curIndex, oldCurInfo);
        }

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/70779.html

相關(guān)文章

  • 反射改變TabLayout屬性

    摘要:第二種在原有基礎(chǔ)上通過(guò)繼承控件,重寫(xiě)其中幾個(gè)方法,并且通過(guò)反射來(lái)修改部分屬性,也能達(dá)到第一種方案效果。因此這里需要用反射替換成自己的滑動(dòng)監(jiān)聽(tīng),然后在的監(jiān)聽(tīng)類中的方法,改變的顏色。通過(guò)反射找到源碼中成員變量,然后設(shè)置暴力訪問(wèn)權(quán)限。 目錄介紹 01.遇到的實(shí)際需求分析 02.原生TabLayout局限 03.TabLayout源碼解析 3.1 Tab選項(xiàng)卡如何實(shí)現(xiàn) 3.2 滑動(dòng)切換T...

    GeekGhc 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<