在 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 是否被曝光。
最后
如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。
如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。
欢迎大家一键三连支持,若需要文中资料,直接扫描文末优快云官方认证微信卡片免费领取↓↓↓(文末还有ChatGPT机器人小福利哦,大家千万不要错过)
PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题