私にはアクティビティがあり、その上に多くのウィジェットがあります。それらの一部にはアニメーションがあり、アニメーションのために一部のウィジェットが次々に移動(翻訳)しています。たとえば、テキストビューはいくつかのボタンの上を移動しています。 。 。
今、私はボタンが常に前面にあることを望んでいます。そして、textviewが動いているとき、私はボタンの後ろに動きたいです。
私はこれを達成することができません。私は知っているすべてを試しましたが、「bringToFront()」definitellyは機能しません。
注:レイアウトに要素を配置する順序でzオーダーを制御したくないので、単にできません:)、レイアウトが複雑で、すべてのボタンをレイアウトの開始位置に配置することはできません
前面に表示するビューでbringToFront()を呼び出すことができます
これは一例です:
yourView.bringToFront();
良い答えを見つけるためにスタックオーバーフローを調べてきましたが、見つからない場合はドキュメントを調べました。
誰もまだこの簡単な答えにつまずいたようではありません:
ViewCompat.setTranslationZ(view, translationZ);
デフォルトの翻訳zは0.0
bringToFront()
は正しい方法ですが、たとえば、次のように、(ルートビューの下の)最上位ビューでbringToFront()
およびinvalidate()
メソッドを呼び出す必要があることに注意してください。
ビューの階層は次のとおりです。
-RelativeLayout
|--LinearLayout1
|------Button1
|------Button2
|------Button3
|--ImageView
|--LinearLayout2
|------Button4
|------Button5
|------Button6
そのため、ボタンをアニメーション表示すると(1-> 6)、ボタンはImageView
の下(下)に表示されます。 ImageView
の上に(上に)移動するには、LinearLayout
sでbringToFront()
およびinvalidate()
メソッドを呼び出す必要があります。その後、動作します:) **注:ルートレイアウトまたはアニメーションビューのgradparent_layoutにAndroid:clipChildren="false"
を設定することを忘れないでください。私の実際のコードを見てみましょう:
.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);
ほら!
さらに簡単な解決策は、アクティビティのXMLを編集することです。つかいます
Android:translationZ=""
FrameLayout
を試してください。ビューを上下に並べることができます。 2つのLinearLayouts
を作成できます。1つは背景ビューで、もう1つは前景ビューで、FrameLayout
を使用して結合します。お役に立てれば。
このコードをxmlで
Android:translationZ="90dp"
bringChildToFront
を使用してみてください。 documentation が Android Developersページ で役立つかどうかを確認できます。
私は同じ問題に直面しています。次の解決策は私のために働いています。
FrameLayout glFrame=(FrameLayout) findViewById(R.id.animatedView);
glFrame.addView(yourView);
glFrame.bringToFront();
glFrame.invalidate();
2番目の解決策は、xmlを使用してこの属性をビューxmlに追加することです
Android:translationZ=""
日を節約する別の方法があります。目的のレイアウトで新しいダイアログを初期化し、表示するだけです。 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レイヤー上のすべてをオーバーライドする必要があります。しかし、とにかく、これはworkい回避策です。
ConstraintLayout
を使用している場合は、他の要素の後に要素を配置して、他の要素よりも前面に配置します。
Framelayoutを使用する必要があります。そして、これを行うためのより良い方法は、必要でないときにビューを非表示にすることです。また、それぞれのビューの位置を設定する必要があります。そのため、対応する位置に応じて移動します
LinearLayout
を使用している場合は、myView.bringToFront()
を呼び出し、parentView.requestLayout()
およびparentView.invalidate()
を呼び出してから、新しい子の順序で親を強制的に再描画する必要があります。