如何将视野摆在一切面前?


130

我上面有活动和许多小部件,其中一些具有动画,并且由于动画的原因,一些小部件正在一个(另一个)之间移动(翻译)。例如,文本视图在某些按钮上移动。。。

现在的问题是,我希望按钮始终位于正面。当textview移动时,我想移到按钮后面。

我无法做到这一点,我尝试了我所知道的一切,并且“ bringToFront()”绝对无法正常工作。

注意我不想通过将元素放置到布局的顺序来控制z顺序,因为我根本不能:),布局很复杂,我不能将所有按钮都放在布局的开头


3
RelativeLayout将XML的最后一个“顶部”视图与一起使用。参见stackoverflow.com/a/31340762/1121497
Ferran Maylinch

谁能告诉'bringToFront'xml中的相应代码
Shirish Herwade

尝试在XML中使用仰角bottomView = elevation:1dp和topView = elevation:2dp ViewCompat.setElevation(View,int)
Tlacaelel Ramon Luis

Answers:


144

您可以在想要进入前面的视图上调用BringToFront()

这是一个例子:

    yourView.bringToFront();

4
出乎意料的结果:我在垂直线性布局中使用了该视图,并带到最前面的视图出现在底部...例如,我不得不A / B / C并想带到A最前面,所以运行后,a.bringToFront()我最终得到了这样的布局B / C / A
Ferran Maylinch

2
因此我发现LinearLayout不能与一起使用bringToFront。我最终使用RelativeLayout。请参阅我对问题本身的评论。
Ferran Maylinch

1
谁能告诉'bringToFront'xml中的相应代码
Shirish Herwade

无论出于何种原因,这都会导致我将要移动到最前面的元素重新定位。ViewCompat.setTranslationZ(view, 1)另一方面,效果很好。
比姆德

1
如果我在活动清单中使用清单清单android:theme =“ @ android:style / Theme.Light.NoTitleBar”,而不是yourView.bringToFront(); 工作完美,但我使用了android:theme =“ @ android:style / Theme.AppCompat.Light.NoActionBar” yourView.bringToFront(); 不起作用。关于那个的任何线索。
拉胡尔

41

我一直在寻找堆栈溢出的问题,以找到一个好的答案,当我找不到一个答案时,我就去研究文档。

似乎没有人偶然发现这个简单的答案:

ViewCompat.setTranslationZ(view, translationZ);

默认翻译z为0.0


那是元素在Z轴上的位置(以px为单位),也称为高程。setTranslationX将沿X轴(左/右)移动视图,setTranslationY沿Y轴(上/底部)移动。Z轴是第3轴。
xdevs23,2016年

setZ()呢 如果我没记错的话,视图的Z位置毕竟是其高程加上其平移Z。
Gensoukyou1337 '16

2
@ Gensoukyou1337,然后 ViewCompat.setZ(view, yourValueInPixels); view.setZ()仅适用于API 21和更高版本。
约翰尼五世

1
在Android Studio中检查了Java 8代码-它仅检查SDK_INT> = 21,因此对于<21 api而言,它无效。
瓦迪姆(Vadim)'18

32

甚至更简单的解决方案是编辑活动的XML。用

android:translationZ=""

3
仅在Android API 21或更高版本中有用。
isakbob

25

bringToFront()是正确的方法,但是请注意,必须在最高级别的视图(在根视图下)调用bringToFront()invalidate()方法,例如:

您视图的层次结构为:

-RelativeLayout
|--LinearLayout1
|------Button1
|------Button2
|------Button3
|--ImageView
|--LinearLayout2
|------Button4
|------Button5
|------Button6

因此,当您对按钮进行动画处理(1-> 6)时,您的按钮将位于下方(下方)ImageView。要将其带到上方,ImageView您必须在上调用bringToFront()invalidate()方法LinearLayout。然后它将起作用:) **注意:请记住android:clipChildren="false"为您的根布局或动画视图的gradparent_layout设置。让我们看一下我的真实代码:

.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:hw="http://schemas.android.com/apk/res-auto"
    android:id="@+id/layout_parent"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/common_theme_color"
    android:orientation="vertical" >

    <com.binh.helloworld.customviews.HWActionBar
        android:id="@+id/action_bar"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dimen_actionbar_height"
        android:layout_alignParentTop="true"
        hw:titleText="@string/app_name" >
    </com.binh.helloworld.customviews.HWActionBar>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/action_bar"
        android:clipChildren="false" >

        <LinearLayout
            android:id="@+id/layout_top"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:gravity="center_horizontal"
            android:orientation="horizontal" >
        </LinearLayout>

        <ImageView
            android:id="@+id/imgv_main"
            android:layout_width="@dimen/common_imgv_height"
            android:layout_height="@dimen/common_imgv_height"
            android:layout_centerInParent="true"
            android:contentDescription="@string/app_name"
            android:src="@drawable/ic_launcher" />

        <LinearLayout
            android:id="@+id/layout_bottom"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:gravity="center_horizontal"
            android:orientation="horizontal" >
        </LinearLayout>
    </RelativeLayout>

</RelativeLayout>

.java中的一些代码

private LinearLayout layoutTop, layoutBottom;
...
layoutTop = (LinearLayout) rootView.findViewById(R.id.layout_top);
layoutBottom = (LinearLayout) rootView.findViewById(R.id.layout_bottom);
...
//when animate back
//dragedView is my layoutTop's child view (i added programmatically) (like buttons in above example) 
dragedView.setVisibility(View.GONE);
layoutTop.bringToFront();
layoutTop.invalidate();
dragedView.startAnimation(animation); // TranslateAnimation
dragedView.setVisibility(View.VISIBLE);

uck!


如果您只想将按钮6放在imageview上方而不是其他按钮上怎么办?
亚当·卡兹

@AdamKatz:我认为您必须将它们重新组织成另一个拳头。然后,以您的方式携带它。
贾斯汀

谢谢,我试图将回收器视图中的一项仅放在视图上方,而将其他项放在其下方,很卡住!
亚当·卡兹

我用相同的。它可以隐藏工具栏,但可以很好地解决单个问题。
user2980181

这可以在多个级别上使用吗?假设我有一个ConstraintLayout,其中包含RelativeLayoutRelativeLayout,两者的大小均与其根ConstraintLayoutmatch_parent)相同。第一个RelativeLayout具有a Button,并且也落后于(z阶)第二个RelativeLayout。我可以使Button在第一RelativeLayout出现,就像它是一切的顶部,这样它的可见光和点击,使用View::bringToFront()
oaskamay


18

尝试一下FrameLayout,它使您可以将视图置于另一视图之上。您可以创建两个LinearLayouts:一个具有背景视图,一个具有前景视图,然后使用进行组合FrameLayout。希望这可以帮助。


1
我们如何像对话一样将其置于顶部?
Gaurav Arora

@Infinity,您可以为此创建一个FragmentDialog,或者仅将Theme.Dialog用于您的Activity。
Egor 2012年

我不能使用FragmentDialog,因为它与API 10不兼容。其次,我已经在我的应用程序中使用了主题。还有其他办法吗?就像您说的那样,我已经使用了FrameLayout!
Gaurav Arora

@Infinity,您可以使用兼容性库版本FragmentDialog的,这可从API 4
叶戈尔



3

可以通过另一种方式节省时间。只需初始化一个具有所需布局的新对话框并显示它即可。我需要它来显示DialogFragment上的loadingView,这是我成功的唯一方法。

Dialog topDialog = new Dialog(this, android.R.style.Theme_Translucent_NoTitleBar);
topDialog.setContentView(R.layout.dialog_top);
topDialog.show();

在我的某些情况下,BringToFront()可能无法正常工作。但是dialog_top布局的内​​容必须覆盖ui层上的所有内容。但是无论如何,这是一个丑陋的解决方法。


3

我也遇到过同样的问题。以下解决方案为我工作。

 FrameLayout glFrame=(FrameLayout) findViewById(R.id.animatedView);
        glFrame.addView(yourView);
        glFrame.bringToFront();
        glFrame.invalidate();

第二种解决方案是通过使用xml将此属性添加到视图xml中

android:translationZ=""

2

您可以像这样使用BindingAdapter:

@BindingAdapter("bringToFront")
public static void bringToFront(View view, Boolean flag) {
    if (flag) {
        view.bringToFront();
    }
}


  <ImageView
        ...
        app:bringToFront="@{true}"/>


0

如果您使用的是a LinearLayout,则应致电myView.bringToFront(),然后致电,parentView.requestLayout()parentView.invalidate()迫使父公司以新的子订单重绘。



0

由于堆栈用户这个解释中,我得到了这个工作,即使在Android 4.1.1

((View)myView.getParent()).requestLayout();
myView.bringToFront();

例如,在动态使用中,

public void onMyClick(View v)
     {
     ((View)v.getParent()).requestLayout();
     v.bringToFront();
     }

还有巴姆!


-2

按照您要显示的顺序排列它们。假设您想在视图2的顶部显示视图1。然后编写视图2的代码,然后编写视图1的代码。如果您不能执行此排序,则调用BringToFront()到要放在前面的布局的根视图。


-32

您可以将其他视图的可见性设置为false。

view1.setVisibility(View.GONE);
view2.setVisibility(View.GONE);
...

要么

view1.setVisibility(View.INVISIBLE);
view2.setVisibility(View.INVISIBLE);
...

并设置

viewN.setVisibility(View.VISIBLE);

4
我需要所有这些东西都可见,这不是问题,问题是z顺序。如果生存力是问题,那就容易解决。。。
2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.