Android判断View是否曝光

在 Android 中,要判断一个 View 是否被曝光,通常可以通过以下几种方式实现:

  • 使用 View 的 getGlobalVisibleRect() 方法来获取该 View 相对于屏幕的可见矩形区域,然后根据这个可见矩形区域和屏幕的大小来判断该 View 是否完全或部分被曝光。
  • 使用 View 的 getWindowVisibleDisplayFrame() 方法来获取当前窗口的可见矩形区域,然后根据该可见矩形区域和该 View 的位置和大小来判断该 View 是否完全或部分被曝光。
  • 使用 ViewTreeObserver 来监听 View 的变化,例如监听 View 的位置、大小、可见性等变化,然后根据这些变化来判断该 View 是否被曝光。
  • 使用第三方库,例如 Moat、Integral Ad Science 等,来实现 View 的曝光监测。这些库通常会提供 API 让开发者来设置需要监测的 View,然后在相应的回调中通知开发者该 View 是否被曝光。

需要注意的是,对于一些复杂的 View,例如 RecyclerView、ViewPager 等,需要特别处理才能准确判断其曝光情况。

使用getGlobalVisibleRect()来判断一个view是否曝光

使用 View 的 getGlobalVisibleRect() 方法是一种常用的判断一个 View 是否曝光的方式。该方法可以获取一个 View 相对于屏幕的可见矩形区域,然后可以根据该可见矩形区域和屏幕的大小来判断该 View 是否完全或部分被曝光。

具体实现可以参考下面的代码:
// 判断一个 View 是否曝光
public static boolean isViewExposed(View view) {
    if (view == null || view.getWidth() == 0 || view.getHeight() == 0) {
        // View 为 null 或者宽高为 0,不曝光
        return false;
    }

    Rect rect = new Rect();
    boolean isVisible = view.getGlobalVisibleRect(rect);
    if (isVisible) {
        // 获取屏幕的宽度和高度
        int screenWidth = view.getResources().getDisplayMetrics().widthPixels;
        int screenHeight = view.getResources().getDisplayMetrics().heightPixels;
        // 计算可见矩形区域和屏幕的相交部分
        rect.intersect(0, 0, screenWidth, screenHeight);
        // 判断相交部分是否等于 View 的面积,如果是,则表示该 View 完全曝光
        int visibleArea = rect.width() * rect.height();
        int totalArea = view.getWidth() * view.getHeight();
        return visibleArea >= totalArea;
    } else {
        // 不可见,不曝光
        return false;
    }
}

在调用该方法时,传入需要判断曝光的 View 对象即可。如果返回值为 true,则表示该 View 已经完全曝光;如果返回值为 false,则表示该 View 没有完全曝光。需要注意的是,该方法只能判断一个 View 是否曝光,不能判断多个 View 的曝光情况。如果需要判断多个 View 的曝光情况,可以考虑使用第三方库来实现。

  • 在上面我们看到rect.intersect,这是什么意思?

在 Android 中,Rect 类是用来表示矩形的一个基本类,包含了矩形左上角和右下角的坐标。Rect 类提供了很多方法来操作矩形,其中就包括 intersect() 方法。
Rect 的 intersect() 方法用于计算当前矩形和指定矩形的交集,并将结果存储在当前矩形中。具体来说,如果当前矩形和指定矩形有交集,则计算出交集的矩形,并将结果存储在当前矩形中;如果当前矩形和指定矩形没有交集,则当前矩形会被设置为空矩形。
在上面的代码中,rect.intersect(0, 0, screenWidth, screenHeight) 的作用就是将 rect 矩形和屏幕的矩形进行交集计算,并将结果存储在 rect 中。这样,rect 就成为了当前 View 的可见矩形区域和屏幕的相交部分,用于后续的曝光判断。

  • view.getGlobalVisibleRect(rect) 有什么作用?

在 Android 中,View 的 getGlobalVisibleRect(Rect rect) 方法可以获取当前 View 相对于屏幕的可见矩形区域,并将结果存储在传入的 rect 对象中。具体来说,该方法会将当前 View 相对于屏幕的坐标系转换为屏幕坐标系,并计算出当前 View 在屏幕上可见的矩形区域,然后将计算结果存储在传入的 rect 对象中。
getGlobalVisibleRect() 方法的作用是获取当前 View 在屏幕上的可见区域,用于判断该 View 是否被曝光。如果该 View 的可见区域和屏幕大小相等,那么该 View 就完全曝光;如果该 View 的可见区域和屏幕大小不相等,那么该 View 就部分曝光。
在上面的代码中,view.getGlobalVisibleRect(rect) 的作用是获取当前 View 相对于屏幕的可见矩形区域,并将计算结果存储在 rect 对象中。接下来,根据该可见矩形区域和屏幕大小的比较来判断该 View 是否被曝光。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容