Android检测View的可见性

摘要:
Android中我们经常会用到判断View的可见行,当然有人会说View.VISIBLE就可以了,但是有时候这个真是满足不了,有时候我们为了优化,在View滚到得不可见的时候或者由于滚到只显示了部分内容的时候不做某些操作,View.VISIBLE这个时候是满足不了的。我们可以重写onWindowVisibilityChanged方法:@OverrideprotectedvoidonWindowVisibilityChanged{super.onWindowVisibilityChanged;if{WLog.d;//开始某些任务}elseif{WLog.d;//停止某些任务}}2.getGlobalVisibleRect检测View是部分可见或者完全可见onWindowVisibilityChanged方法只能判断滚动控件中View的可见或者不可见,无法判断是完全可见或者是部分可见。

Android中我们经常会用到判断View的可见行,当然有人会说View.VISIBLE就可以了,但是有时候这个真是满足不了,有时候我们为了优化,在View滚到得不可见的时候或者由于滚到只显示了部分内容的时候不做某些操作,View.VISIBLE这个时候是满足不了的。

1. onWindowVisibilityChanged检测滚到导致View可见或者不可见

比如在 ScrollView(RecyclerView和ListView等都一样)中滚动,会对其中的view产生生命周期影响,可以参考一下:深入理解android view 生命周期
当 ScrollView 中的view滚动导致View不可见了,会调用 onWindowVisibilityChanged 方法,注意是完全不可见才会调用 onWindowVisibilityChanged,当滚到导致View部分可见的时候也会调用onWindowVisibilityChanged方法,注意是部分可见也会调用,这样就可以监听滚动控件中View的可见性。
我们可以重写onWindowVisibilityChanged方法:

@Override
    protected void onWindowVisibilityChanged(intvisibility) {
        super.onWindowVisibilityChanged(visibility);
        if (visibility ==View.VISIBLE){
            WLog.d("danxx" ,"可见");
            //开始某些任务
}
        else if(visibility == INVISIBLE || visibility ==GONE){
            WLog.d("danxx" ,"不可见");
            //停止某些任务
}
    }

2. getGlobalVisibleRect检测View是部分可见或者完全可见

onWindowVisibilityChanged方法只能判断滚动控件中View的可见或者不可见,无法判断是完全可见或者是部分可见。使用下面的方法就可以判断View是不是只是部分可见:

2.1 在自定义控件里面检测当前view是否被遮住显示不全

 /*** 
     * @return
     */
    protected booleanisCover() {
        boolean cover = false;
        Rect rect = newRect();
        cover =getGlobalVisibleRect(rect);
        if(cover) {
            if (rect.width() >= getMeasuredWidth() && rect.height() >=getMeasuredHeight()) {
                return !cover;
            }
        }
        return true;
    }

2.2 检测我们自己制定的View作为参数去判断显示情况

/*** 检测制定View是否被遮住显示不全
     * @return
     */
    protected booleanisCover(View view) {
        boolean cover = false;
        Rect rect = newRect();
        cover =view.getGlobalVisibleRect(rect);
        if(cover) {
            if (rect.width() >= view.getMeasuredWidth() && rect.height() >=view.getMeasuredHeight()) {
                return !cover;
            }
        }
        return true;
    }

免责声明:文章转载自《Android检测View的可见性》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何快速清空微信浏览器中的缓存project小技巧:快捷键下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SwitchButton 开关按钮 的多种实现方式

刚开始接触开关样式的按钮是在IOS系统上面,它的切换以及滑动十分帅气,深入人心。 所谓的开关按钮,就是只有2个状态:on和off,下图就是系统IOS 7上开关按钮效果。 起初我在android上我只会使用CheckBox去满足对应的功能。后来,查看开发文档发现,android也有了自己的原生态开关控件,并且在4.0版本中又优化加入了新的类似控件--Swi...

微信小程序-自定义下拉刷新

要实现微信小程序上拉刷新与下拉加载更多 微信给出的接口不怎么友好,最终想实现效果类似QQ手机版 ,一共3种下拉刷新状态变化,文字+图片+背景颜色 最终实现后的效果(这里提示有个不同点就是,自定义了导航条,并且下拉的时候,自定义导航条必须固定) 小程序实现下拉加载2种方式: 1. 简单粗暴,直接开启enablePullDownRefresh,开启全局下...

Thinkphp6笔记十五:模板路径自定义配置

新版框架默认只能支持PHP原生模板,如果需要使用thinkTemplate模板引擎,需要安装think-view扩展(该扩展会自动安装think-template依赖库) TP6默认还是侧重于API接口开发,因为很多插件默认都不安装 composer require topthink/think-view安装完成后到view.php中配置。不安装会报错:D...

小程序动态获取元素高度报错VM14689:1 thirdScriptError Cannot read property 'height' of null;at SelectorQuery callback function TypeError: Cannot read property 'height' of null

小程序动态获取元素高度报错 原因是因为该元素此刻是隐藏不显示的。 那么怎么判断避免这个错误呢? e g: id为c3的元素存在,id为c4的元素不存在。 wx.createSelectorQuery().select('#c3').boundingClientRect(function(rect) { console.log(rect)//...

iOS开发UI篇—Button基础

iOS开发UI篇—Button基础 一、简单说明 一般情况下,点击某个控件后,会做出相应反应的都是按钮 按钮的功能比较多,既能显示文字,又能显示图片,还能随时调整内部图片和文字的位置 二、按钮的三种状态 normal(普通状态) 默认情况(Default) 对应的枚举常量:UIControlStateNormal highlighted(高亮状态) 按钮被...

Canvas和SVG区别(小白),以及两者的基础知识点

  首先我们来说一下Canvas是什么,它有什么作用以及它的知识点。     Canvas是<HTML5>的新标签,它通常用于通过脚本(也就是JavaScript)来绘制图像。但是它本身并没有绘制能力,仅仅是一个图形的容器,必须通过脚本来绘制。它一般应用在游戏开发、数据可视化、图形编辑器等。注意:IE9以下的浏览器不支持它!     基本语法:...