如何发送视图回来?如何以编程方式控制z顺序?

Luk*_*kap 55 android view z-order android-layout

我有一个问题是将视图发送回来.在Android中,我们有一个方法bringToFront(),将视图放在另一个视图的顶部.就像那样,我想把视图放在上一张图片的下方.

有没有像任何方法sendToBack()bringToBack()Android中.如果是这样,任何人都可以帮助我.

注意:我不想按照在布局中放置项目的顺序来控制z顺序我想以编程方式控制z顺序.

我不想隐藏前面的视图我只是希望它们在移动的视图后面.

Tur*_*rix 63

我意识到这已经隐含在其他答案中,但没有人发布代码.我在实用程序类中保留以下内容,其中我有"帮助"函数来处理视图:

public static void sendViewToBack(final View child) {
    final ViewGroup parent = (ViewGroup)child.getParent();
    if (null != parent) {
        parent.removeView(child);
        parent.addView(child, 0);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @clocksmith感谢您的建议.由于我已经老了,我倾向于总是在比较中将空值放在左侧以防止意外赋值为null(例如,如果你忘记了"parent = null"中的第二个'='字符).我知道这不再是必要的了,因为很好的编译器警告,但它很久以前就习惯了,并且,正如他们所说的那样......老习惯很难. (4认同)
  • @James不,它确实为你移动它们(类似于`ArrayList`中的`add()`).如果你愿意,你可以尝试一下.或者通过查看源代码确认它...它在内部使用addInArray().但你在文档中不清楚这是对的.因此,如果您使用此功能,您可能应该在未来的API更新中密切注意这一点,以防他们决定更改此(未记录的)行为.好点子. (3认同)

Pep*_*ijn 39

没有sendToBack()方法.但是如果你调用bringToFront()较低位置的视图,你会得到几乎相同的效果.


Zso*_*agy 32

Afaik没有内置的解决方案.我猜你试图修改FrameLayout中的z顺序,或类似的东西.

但是,我认为您可以修改布局中包含的子元素的顺序.RemoveChild ...()和addView()方法可以获取位置值,因此您很可能会交换子元素,这将修改z顺序.然而,这似乎有点hacky解决方案.

或者考虑修改子视图的可见性属性,您可能会得到类似的行为,而且我认为这样会更清晰.

编辑:

有了新的Android版本,L Developer Preview似乎最终我们能够轻松更改视图的Z顺序.'Elevation'和'TranslationZ'属性为救援:https://developer.android.com/preview/material/views-shadows.html


noo*_*oob 19

调用bringToFront()要在前面获取的视图,然后invalidate()在所有视图上调用该方法,包括前面所需的视图.对所有侦听器重复相同的操作.

因此,当另一个视图的侦听器被调用时,前一个视图将变为无效并且将在后台.


Al-*_*ani 9

这是我用来向后面发送View的方法(与bringToFront相反,类似sendToBack):

    private void moveToBack(View myCurrentView) 
    {
        ViewGroup myViewGroup = ((ViewGroup) myCurrentView.getParent());
        int index = myViewGroup.indexOfChild(myCurrentView);
        for(int i = 0; i<index; i++)
        {
            myViewGroup.bringChildToFront(myViewGroup.getChildAt(i));
        }
    }
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!