【问题标题】:How to bring a view to front without calling bringToFront()?如何在不调用bringToFront() 的情况下将视图置于前面?
【发布时间】:2010-12-08 20:50:25
【问题描述】:

Android 中显然有一个 bug 会破坏 View.bringToFront

如果我将视图排列在 GridView 中,并希望通过调用 bringToFront() 将视图置于前面,它可能会移动到 GridView 的右下角。

那里发生了一些可疑的事情,所以我不能使用bringToFront()。当我不调用它时,一切正常。但是视图重叠 - 如果我使用缩放动画来放大视图,它会被底部和右侧的视图部分遮挡。

我查看了 BringToFront 的源代码,它调用了 parent.bringChildToFront(...)

就是这个方法

public void bringChildToFront(View child) {
     int index = indexOfChild(child);
      if (index >= 0) {
          removeFromArray(index);
          addInArray(child, mChildrenCount);
          child.mParent = this;
      }
  }

它显然 从自身中删除了视图!毫不留情! ViewGroup 是否如此愚蠢以至于它无法以任何其他方式来管理 Z-indexes 洗牌控制?很明显,当 GridView 删除它的子元素然后再次添加它时,它会被放置在 Grid 的末尾!

我有什么办法可以在不借助黑客手段的情况下在其他视图之上显示视图?我想到的一件事是在 GridView 之上创建另一个 View,它似乎在我试图带来 ToFront() 的那个之上,但我不喜欢这个解决方案。

【问题讨论】:

    标签: android layout view z-index viewgroup


    【解决方案1】:

    显然我错过了 GridView 中的 android:clipChildren="false" 属性。它解决了我的问题。

    【讨论】:

      【解决方案2】:

      您是否尝试过使 View 成为焦点并仅调用 requestFocus()?

      【讨论】:

        【解决方案3】:

        调用 bringToFront() 会更改 GridView 中的排序。尝试使用您要设置动画的视图的图像创建一个 ImageView,并改为对其进行动画处理。

        Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        view.draw(canvas);
        final ImageView imageView = new ImageView(getActivity());
        imageView.setImageBitmap(bitmap);
        ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(view.getWidth() , view.getHeight());
        imageView.setLayoutParams(params);
        rootview.addView(imageView);
        

        为您的动画添加一个动画侦听器,并在动画结束时移除 ImageView。

        【讨论】:

          【解决方案4】:

          您可以从 API 21 调用:

          view.setZ(float)
          

          【讨论】:

            【解决方案5】:

            如果您的目标 API 高于 21,您只需将属性 android:translationZ="xxx dp" 添加到您的 XML。

            请注意,如果您在 cardview 等视图中添加高程,您将进入 Z 轴。如果您希望使用这种方式将视图置于前景,您只需使其高于您设置的高度即可。

            示例:cardview 中的 6 dp 高程将需要您想要前景的视图的属性 translationZ 中的 7dp。

            【讨论】:

              猜你喜欢
              • 2023-03-03
              • 1970-01-01
              • 2011-10-07
              • 2015-07-31
              • 2016-09-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多