How to bring view in front of everything?

后端 未结 16 2188
刺人心
刺人心 2020-11-30 01:31

I have activity and a lot of widgets on it, some of them have animations and because of the animations some of the widgets are moving (translating) one over another. For exa

相关标签:
16条回答
  • 2020-11-30 01:52

    bringToFront() is the right way, but, NOTE that you must call bringToFront() and invalidate() method on highest-level view (under your root view), for e.g.:

    Your view's hierarchy is:

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

    So, when you animate back your buttons (1->6), your buttons will under (below) the ImageView. To bring it over (above) the ImageView you must call bringToFront() and invalidate() method on your LinearLayouts. Then it will work :) **NOTE: Remember to set android:clipChildren="false" for your root layout or animate-view's gradparent_layout. Let's take a look at my real code:

    .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>
    

    Some code in .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);
    

    GLuck!

    0 讨论(0)
  • 2020-11-30 01:52

    You can use BindingAdapter like this:

    @BindingAdapter("bringToFront")
    public static void bringToFront(View view, Boolean flag) {
        if (flag) {
            view.bringToFront();
        }
    }
    
    
      <ImageView
            ...
            app:bringToFront="@{true}"/>
    
    0 讨论(0)
  • 2020-11-30 01:52

    You can set visibility to false of other views.

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

    or

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

    and set

    viewN.setVisibility(View.VISIBLE);
    
    0 讨论(0)
  • 2020-11-30 01:54

    You can call bringToFront() on the view you want to get in the front

    This is an example:

        yourView.bringToFront();
    
    0 讨论(0)
  • 2020-11-30 01:55

    If you are using ConstraintLayout, just put the element after the other elements to make it on front than the others

    0 讨论(0)
  • 2020-11-30 01:55

    If you are using a LinearLayout you should call myView.bringToFront() and after you should call parentView.requestLayout() and parentView.invalidate() to force the parent to redraw with the new child order.

    0 讨论(0)
提交回复
热议问题