6

Android 中显然存在一个错误,它会破坏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 上方创建另一个视图,它似乎在我试图带来的视图之上(),但我不喜欢这种解决方案。

4

5 回答 5

3

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

于 2010-12-16T09:42:57.493 回答
1

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

于 2010-12-08T21:24:04.313 回答
1

调用 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。

于 2015-08-03T02:37:07.880 回答
1

从 API 21 你可以调用:

view.setZ(float)
于 2015-10-13T12:45:11.477 回答
0

如果您的目标 API 高于 21,您可以简单地将属性添加 android:translationZ="xxx dp"到您的 XML。

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

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

于 2017-03-06T12:53:43.297 回答