如何在不调用bringToFront()的情况下将视图置于前台?

6

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;
      }
  }

看起来它< strong>毫不留情地从自己中移除了视图!一个ViewGroup难道就不能以其他方式管理Z索引,而只能在控件之间进行调整吗?很显然,当GridView移除其子项并将其重新添加时,它会被放置在网格的末尾!

是否有任何方法可以显示一个视图在其他视图之上,而不必诉诸于一些黑客技巧?我想到的一个办法是创建一个位于GridView上方的另一个视图,它将出现在我尝试bringToFront()的视图之上,但我不喜欢这个解决方案。

5个回答

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

1
从API 21开始,你可以调用:

view.setZ(float)

1
你尝试过将 View 设为可聚焦并调用 requestFocus() 吗?

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。

0

如果您的API版本高于21,您可以在XML中简单地添加属性android:translationZ="xxx dp"

请注意,如果您在像cardview这样的视图中添加了高度,您将进入Z轴。如果您想使用此方法使视图到前景,您只需要使它比您设置的高度更高即可。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接