如何在不调用bringToFront()的情况下将视图带到前面?

时间:2010-12-08 20:50:26

标签: android layout view z-index viewgroup

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

如果我在GridView中安排了视图并希望通过调用bringToFront()将View带到前面,那么它可能会移动到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;
      }
  }

显然从自身中删除了View!没有怜悯! ViewGroup是如此愚蠢,以至于它无法以任何其他方式管理Z-index,从而改变控制?显然,当GridView删除它的子节点然后再将其添加回来时,它会被放置在网格的末尾!

我有什么办法可以在不诉诸某些黑客的情况下在其他人之上显示视图吗?我想到的一件事是在GridView上面创建另一个View,它看起来就在我试图带来ToTront()之上,但我不喜欢这个解决方案。

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

您是否尝试过View可调焦并只调用requestFocus()?

答案 2 :(得分: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。

答案 3 :(得分:1)

从API 21您可以致电:

view.setZ(float)

答案 4 :(得分:0)

如果您将API定位到21以上,则只需将属性{{1}}添加到XML中即可。

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

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