判斷當(dāng)前view是否顯示

最近有一個(gè)這樣的需求,需要知道某個(gè)view的展示率,但是這個(gè)view嵌套在一個(gè)滑動(dòng)布局中,在當(dāng)前view已經(jīng)被添加到滑動(dòng)布局的前提下,該view也不一定會(huì)展示,可能會(huì)出現(xiàn)的情況如下所示:

可能存在的情況.png

那么,我們怎么判斷當(dāng)前的view是否展示了呢?

我的實(shí)現(xiàn)思路如下:

  1. 首先,在添加view的時(shí)候,判斷當(dāng)前view是否展示,如果展示,直接上報(bào)即可。如果沒有展示,而是如圖所示的情況,那就存儲(chǔ)一個(gè)sp的值,用于表示當(dāng)前的view沒有上報(bào)。
    2.在滑動(dòng)布局中,進(jìn)行滑動(dòng)監(jiān)聽。在滑動(dòng)的過程中,判斷當(dāng)前的view是否上報(bào),在沒有上報(bào)的情況下,繼續(xù)判斷view是否顯示,如果在混動(dòng)過程中view顯示了,就上報(bào)view顯示了,并存儲(chǔ)一個(gè)sp的值,用于表示當(dāng)前的view已經(jīng)上報(bào)了。

上面的語言用代碼表示為:
在添加view的邏輯中,用如下代碼:

//addView代表該view被添加到當(dāng)前布局了
  if (addView()) {
//parentView 即滑動(dòng)布局
            parentView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    parentView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
//這里是判斷當(dāng)前布局是否可見
                    if (CustomMainScrollView.checkIsVisible(mContext, parentView)) {
                        reportSkinShareCard(gamemaster_app_cardshow_new.OP_VISIBLE, false);
                    }else{
                        //設(shè)置狀態(tài)為未上報(bào)
PreferencesUtils.getInstance().putBoolean(HAS_REPORT_SHOW_SKIN_THEME_CARD, false);
                    }
                }
            });
        }

然后在滑動(dòng)布局中,監(jiān)聽滾動(dòng)事件,調(diào)用下面的代碼:

 private void reportSkinThemeCard(Context context, View skinThemeView) {
        boolean hasReport = PreferencesUtils.getInstance().getBoolean(HAS_REPORT_SHOW_SKIN_THEME_CARD, false);

        if (!hasReport && checkIsVisible(context, skinThemeView) && mSkinThemeView.getChildCount() != 0 ) {
            byte  cardStyle = AbTestLogicManager.isSkinWithImageTestValue()?gamemaster_app_cardshow_new.CARD_TYPE_SKIN_WITH_IMAGE:gamemaster_app_cardshow_new.CRAD_SKIN_WITH_TEXT;

            // todo 在這里進(jìn)行上報(bào)操作
            PreferencesUtils.getInstance().putBoolean(PreferenceConstants.HAS_REPORT_SHOW_SKIN_THEME_CARD, true);
//最后,更新狀態(tài),避免重復(fù)上報(bào)
        }
    }

在補(bǔ)充一個(gè)檢查當(dāng)前view是否顯示的方法:

public static Boolean checkIsVisible(Context context, View view) {
        int screenWidth = getScreenMetrics(context).x;
        int screenHeight = getScreenMetrics(context).y;
        Rect rect = new Rect(0, 0, screenWidth, screenHeight);
        int[] location = new int[2];
        view.getLocationInWindow(location);
        if (view.getLocalVisibleRect(rect)) {
            return true;
        } else {
            return false;
        }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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