繁体   English   中英

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

[英]How to bring a view to front without calling bringToFront()?

Android中显然有一个错误 ,它破坏了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;
      }
  }

它显然从自身中删除了视图! 无情地! ViewGroup是如此愚蠢,以至于无法以任何其他方式管理Z-index,从而改变控制方式? 显然,当GridView删除它的子进程然后再将其添加回来时,它会被放置在Grid的末尾!

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

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

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

从API 21您可以致电:

view.setZ(float)

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

如果您将API定位到21以上,则只需将属性android:translationZ="xxx dp"到XML即可。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM