【问题标题】:How can you tell if a View is visible on screen in Android?如何判断一个 View 在 Android 屏幕上是否可见?
【发布时间】:2012-12-11 22:40:23
【问题描述】:

我想检查 ScrollView 中的 View 当前是否在 Android 中可见。我没有检查它是否集中在屏幕上,但它当前是否显示在屏幕上。 View 中是否有方法可以告诉我视图当前是否可见?

【问题讨论】:

标签: android android-view android-scrollview visible


【解决方案1】:

此代码适用于我:

public static boolean isVisible(final View view) {
    if (view == null) {
        return false;
    }
    if (!view.isShown()) {
        return false;
    }
    final Rect actualPosition = new Rect();
    view.getGlobalVisibleRect(actualPosition);
    final Rect screen = new Rect(0, 0, getScreenWidth(), getScreenHeight());
    return actualPosition.intersect(screen);
}

【讨论】:

  • 注意获取屏幕宽高使用:Resources.getSystem().getDisplayMetrics().widthPixelsResources.getSystem().getDisplayMetrics().heightPixels
  • 它就像一个魅力,在上下文改变之后,在 recyclerviews 中,在 viewpagers 中,无处不在。难以置信!
  • 我相信这应该是公认的答案。效果很好!
  • 真正有价值的答案,与 getGlobalVisibleRect 本身不同,效果很好。
  • 如果您只想检查相交,请不要​​使用“相交”。改用“相交”。如果您想记录交叉点,请仅使用“intersect”
【解决方案2】:
int[] location = new int[2];
view.getLocationOnScreen(location);

Rect rect = new Rect();
view.getGlobalVisibleRect(rect);

现在使用这个位置或矩形来检查它是否在你的可见范围内。如果只是整个屏幕,请检查getResources().getDisplayMetrics()

正如 Antek 在下面的 cmets 中指出的那样,视图可能仍然消失或不可见,此处的返回值说明了上次绘制的位置。因此,将上述与边界相关的条件与view.isShown()view.getVisibility() == VISIBLE 结合起来应该可以解决这个问题。

【讨论】:

  • 这在切换可见性时不起作用 - 如果您的视图最初是可见的,那么它将保留其可见的矩形尺寸。
  • 您当然也可以添加对视图可见性的检查
  • 什么意思?视图现在有visibility = GONE(我刚刚切换它,它有visibility = VISIBLE),但可见矩形保持在创建视图时的状态。无需检查,因为我自己将其设置在代码中的一个位置。
  • 我的意思是根据意图,您可以添加对 view.getVisibility() == VISIBLE 的检查以及屏幕上返回的位置。对于实际上添加它的问题,我将编辑答案。谢谢
  • @Antek 如果你正在解决这个问题,测试一下会很有趣 - 当视图被绘制时会发生什么,然后让 GONE 然后再也没有绘制?我想象 GONE 会更新位置,但如果它不值得检查我们是否会继续使用陈旧的位置。谢谢!
【解决方案3】:

zegee29's 的回答很有帮助。虽然我也想建议使用view.getGlobalVisibleRect(actualPosition) 的结果,因为在某些情况下Rect.intersects() 在项目根本不可见时返回true,所以生成的代码是:

fun View.isVisible(): Boolean {
    if (!isShown) {
        return false
    }
    val actualPosition = Rect()
    val isGlobalVisible = getGlobalVisibleRect(actualPosition)
    val screenWidth = Resources.getSystem().displayMetrics.widthPixels
    val screenHeight = Resources.getSystem().displayMetrics.heightPixels
    val screen = Rect(0, 0, screenWidth, screenHeight)
    return isGlobalVisible && Rect.intersects(actualPosition, screen)
}

或者你可能只是getGlobalVisibleRect(actualPosition)的结果

【讨论】:

    【解决方案4】:

    试试

    if(view.isShown()) {
        // Visible
    } else { 
        // Invisible
    }
    

    【讨论】:

    • 这将是真的,例如,如果有覆盖 View 不可靠,也不是正确答案
    • 这是不正确的。 isShown() 返回视图的可见性属性。
    • 为什么这有几个赞成票?找错人了!
    【解决方案5】:

    public boolean checkVisiblity(View view){

    如果(view.isShown()) 返回真; 别的 返回错误;

    }

    【讨论】:

      【解决方案6】:

      函数 View.getVisibility() 可以有以下值:

      • View.VISIBLE (0):视图可见。

      • View.INVISIBLE (1):视图不可见,但仍会占用空间用于布局。

      • View.GONE (2):视图消失了。完全隐藏,好像没有添加视图一样

      您可以查看以下链接了解更多信息。 How can I check if a view is visible or not in Android?

      【讨论】:

      • 为什么不相信原始答案? stackoverflow.com/a/3791698/562935
      • @tidbeck 这个答案是完全错误的!他想知道现在屏幕上的视图是否可见!如果你不改变它,可见性属性总是返回可见的。该属性与滚动无关,只能由程序员修改。
      • 顺便说一下,可见、不可见和消失的常量分别是 0,4 和 8。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      相关资源
      最近更新 更多