如何在一切事物上带来观点?

我有活动和很多小部件,其中一些小部件有animation,并且由于animation,一些小部件正在彼此移动(翻译)。 例如,文本视图正在移动一些button。 。 。

现在的事情是我想让button永远在前面。 而当textview正在移动,我想移动button后面。

我无法做到这一点,我尝试了我所知道的一切,而“bringToFront()”definitelly不起作用。

注意我不想通过放置元素到布局的顺序来控制z顺序,因为我根本不能:),布局是复杂的,我不能把所有的button放在布局的乞求

你可以在你想要的视图上调用bringToFront()

这是一个例子:

  yourView.bringToFront(); 

我一直在通过堆栈溢出来寻找一个很好的答案,当我找不到一个我去看通过文档。

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

 ViewCompat.setTranslationZ(view, translationZ); 

默认翻译z是0.0

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

您的视图的层次结构是:

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

所以,当你animation返回你的button(1-> 6)时,你的button将在ImageView下方(下方)。 为了把它放在ImageView上面,你必须在你的LinearLayout上调用bringToFront()invalidate()方法。 然后,它将工作:) **注意:记得设置android:clipChildren="false"为您的根布局或animation视图的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); 

格鲁克!

尝试FrameLayout ,它使您可以将视图放在另一个之上。 您可以创build两个LinearLayouts :一个具有背景视图,另一个具有前景视图,并使用FrameLayout将其组合在一起。 希望这可以帮助。

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

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

在某些情况下,bringToFront()可能不起作用。 但dialog_top布局的内​​容必须覆盖ui层上的任何内容。 但无论如何,这是一个丑陋的解决方法。

更简单的解决scheme是编辑活动的XML。 使用

 android:translationZ="" 

你需要使用framelayout。 而更好的方法是在不需要的时候使视图不可见。 还需要为每个视图设置位置,以便它们根据相应的位置移动

我面临同样的问题。 下面的解决scheme已经为我工作。

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

如果您使用的是LinearLayout ,则应该调用myView.bringToFront() ,然后调用parentView.requestLayout()parentView.invalidate()来强制父级重新绘制新的子级次序。

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

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

要么

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

并设置

 viewN.setVisibility(View.VISIBLE);