我上面有活动和许多小部件,其中一些具有动画,并且由于动画的原因,一些小部件正在一个(另一个)之间移动(翻译)。例如,文本视图在某些按钮上移动。。。
现在的问题是,我希望按钮始终位于正面。当textview移动时,我想移到按钮后面。
我无法做到这一点,我尝试了我所知道的一切,并且“ bringToFront()”绝对无法正常工作。
注意我不想通过将元素放置到布局的顺序来控制z顺序,因为我根本不能:),布局很复杂,我不能将所有按钮都放在布局的开头
我上面有活动和许多小部件,其中一些具有动画,并且由于动画的原因,一些小部件正在一个(另一个)之间移动(翻译)。例如,文本视图在某些按钮上移动。。。
现在的问题是,我希望按钮始终位于正面。当textview移动时,我想移到按钮后面。
我无法做到这一点,我尝试了我所知道的一切,并且“ bringToFront()”绝对无法正常工作。
注意我不想通过将元素放置到布局的顺序来控制z顺序,因为我根本不能:),布局很复杂,我不能将所有按钮都放在布局的开头
Answers:
您可以在想要进入前面的视图上调用BringToFront()
这是一个例子:
yourView.bringToFront();
A / B / C
并想带到A
最前面,所以运行后,a.bringToFront()
我最终得到了这样的布局B / C / A
。
LinearLayout
不能与一起使用bringToFront
。我最终使用RelativeLayout
。请参阅我对问题本身的评论。
ViewCompat.setTranslationZ(view, 1)
另一方面,效果很好。
我一直在寻找堆栈溢出的问题,以找到一个好的答案,当我找不到一个答案时,我就去研究文档。
似乎没有人偶然发现这个简单的答案:
ViewCompat.setTranslationZ(view, translationZ);
默认翻译z为0.0
setZ()
呢 如果我没记错的话,视图的Z位置毕竟是其高程加上其平移Z。
ViewCompat.setZ(view, yourValueInPixels);
view.setZ()
仅适用于API 21和更高版本。
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!
ConstraintLayout
,其中包含RelativeLayout
和RelativeLayout
,两者的大小均与其根ConstraintLayout
(match_parent
)相同。第一个RelativeLayout
具有a Button
,并且也落后于(z阶)第二个RelativeLayout
。我可以使Button
在第一RelativeLayout
出现,就像它是一切的顶部,这样它的可见光和点击,使用View::bringToFront()
?
在xml中使用此代码
android:translationZ="90dp"
90dp
来的?
尝试一下FrameLayout
,它使您可以将视图置于另一视图之上。您可以创建两个LinearLayouts
:一个具有背景视图,一个具有前景视图,然后使用进行组合FrameLayout
。希望这可以帮助。
如果使用ConstraintLayout
,只需将元素放在其他元素之后,使其比其他元素靠前
您可以尝试使用bringChildToFront
,也可以在Android Developers页面中检查此文档是否对您有所帮助。
可以通过另一种方式节省时间。只需初始化一个具有所需布局的新对话框并显示它即可。我需要它来显示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层上的所有内容。但是无论如何,这是一个丑陋的解决方法。
我也遇到过同样的问题。以下解决方案为我工作。
FrameLayout glFrame=(FrameLayout) findViewById(R.id.animatedView);
glFrame.addView(yourView);
glFrame.bringToFront();
glFrame.invalidate();
第二种解决方案是通过使用xml将此属性添加到视图xml中
android:translationZ=""
您可以像这样使用BindingAdapter:
@BindingAdapter("bringToFront")
public static void bringToFront(View view, Boolean flag) {
if (flag) {
view.bringToFront();
}
}
<ImageView
...
app:bringToFront="@{true}"/>
您需要使用framelayout。更好的方法是在不需要遮挡时使视图不可见。另外,您需要为每个视图设置位置,以便它们将根据相应的位置移动
按照您要显示的顺序排列它们。假设您想在视图2的顶部显示视图1。然后编写视图2的代码,然后编写视图1的代码。如果您不能执行此排序,则调用BringToFront()到要放在前面的布局的根视图。
RelativeLayout
将XML的最后一个“顶部”视图与一起使用。参见stackoverflow.com/a/31340762/1121497