Mam na niej aktywność i wiele widżetów, niektóre z nich mają animacje, a z powodu animacji niektóre widżety przesuwają się (tłumaczą) jeden nad drugim. Na przykład widok tekstu przesuwa się po niektórych przyciskach. . .
Chodzi o to, że chcę, aby guziki były zawsze z przodu. A kiedy widok tekstu się porusza, chcę przejść za przyciski.
Nie mogę tego osiągnąć. Próbowałem wszystkiego, co wiem, a metoda „bringToFront ()” zdecydowanie nie działa.
uwaga Nie chcę kontrolować kolejności z kolejności umieszczania elementu na layoucie, bo po prostu nie mogę :), układ jest złożony i nie mogę umieścić wszystkich przycisków na początku układu
RelativeLayout
z widokiem „z góry” występującym jako ostatni w XML. Zobacz stackoverflow.com/a/31340762/1121497Odpowiedzi:
Możesz wywołać bringToFront () w widoku, który chcesz uzyskać z przodu
To jest przykład:
yourView.bringToFront();
źródło
A / B / C
i chciałem wyprowadzićA
na wierzch, więc po uruchomieniua.bringToFront()
skończyłem z układem podobnymB / C / A
.LinearLayout
nie można go używać zbringToFront
. Skończyło się na użyciuRelativeLayout
. Zobacz mój komentarz do samego pytania.ViewCompat.setTranslationZ(view, 1)
działa doskonale z drugiej strony.Przeglądałem przepełnienie stosu, aby znaleźć dobrą odpowiedź, a kiedy nie mogłem jej znaleźć, przejrzałem dokumenty.
Wydaje się, że nikt jeszcze nie natknął się na tę prostą odpowiedź:
ViewCompat.setTranslationZ(view, translationZ);
domyślne tłumaczenie z to 0.0
źródło
setZ()
? O ile dobrze pamiętam, pozycja Z widoku to w końcu jego elewacja plus jego translacja Z.ViewCompat.setZ(view, yourValueInPixels);
view.setZ()
działa wtedy tylko na API 21 i nowszych.Jeszcze prostszym rozwiązaniem jest edycja XML działania. Posługiwać się
android:translationZ=""
źródło
Za pomocą tego kodu w XML
android:translationZ="90dp"
źródło
90dp
?bringToFront()
jest właściwą drogą, ale PAMIĘTAJ, że musisz wywołaćbringToFront()
i wykonaćinvalidate()
metodę w widoku najwyższego poziomu (w widoku głównym), np .:Twoja hierarchia widoku to:
-RelativeLayout |--LinearLayout1 |------Button1 |------Button2 |------Button3 |--ImageView |--LinearLayout2 |------Button4 |------Button5 |------Button6
Tak więc, gdy animujesz z powrotem swoje przyciski (1-> 6), twoje przyciski będą pod (poniżej)
ImageView
. Aby to zmienić (powyżej)ImageView
, musisz wywołaćbringToFront()
iinvalidate()
metodę na swoimLinearLayout
s. Wtedy to zadziała :) ** UWAGA: Pamiętaj, aby ustawićandroid:clipChildren="false"
dla układu głównego lub gradparent_layout animate-view. Rzućmy okiem na mój prawdziwy kod:.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>
Trochę kodu w .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!
źródło
ConstraintLayout
który zawiera aRelativeLayout
, a innyRelativeLayout
, oba mają ten sam rozmiar co jego rootConstraintLayout
(match_parent
). PierwszaRelativeLayout
ma aButton
, a także jest za (w kolejności z) drugąRelativeLayout
. Czy mogę sprawić, abyButton
pierwszyRelativeLayout
wyglądał tak, jakby znajdował się nad wszystkim, tak, aby był widoczny i klikalny, używającView::bringToFront()
?Spróbuj
FrameLayout
, daje możliwość umieszczenia widoków jeden na drugim. Możesz utworzyć dwaLinearLayouts
: jeden z widokami w tle i jeden z widokami pierwszego planu i połączyć je za pomocąFrameLayout
. Mam nadzieję że to pomoże.źródło
Jeśli używasz
ConstraintLayout
, po prostu umieść element po innych elementach, aby był z przodu niż pozostałeźródło
Możesz spróbować użyć
bringChildToFront
, możesz sprawdzić, czy ta dokumentacja jest pomocna na stronie Android Developers .źródło
stanąłem przed tym samym problemem. poniższe rozwiązanie zadziałało dla mnie.
FrameLayout glFrame=(FrameLayout) findViewById(R.id.animatedView); glFrame.addView(yourView); glFrame.bringToFront(); glFrame.invalidate();
Drugim rozwiązaniem jest użycie kodu XML i dodanie tego atrybutu do pliku XML widoku
android:translationZ=""
źródło
Może być inny sposób na uratowanie dnia. Po prostu zainicjuj nowe okno dialogowe z żądanym układem i po prostu je pokaż. Potrzebuję go do wyświetlania loadingView przez DialogFragment i był to jedyny sposób, w jaki mi się udało.
Dialog topDialog = new Dialog(this, android.R.style.Theme_Translucent_NoTitleBar); topDialog.setContentView(R.layout.dialog_top); topDialog.show();
bringToFront () może nie działać w niektórych przypadkach, takich jak mój. Ale zawartość układu dialog_top musi przesłonić wszystko w warstwie interfejsu użytkownika. Ale w każdym razie jest to brzydkie obejście.
źródło
Możesz użyć BindingAdapter w następujący sposób:
@BindingAdapter("bringToFront") public static void bringToFront(View view, Boolean flag) { if (flag) { view.bringToFront(); } } <ImageView ... app:bringToFront="@{true}"/>
źródło
Musisz użyć framelayout. A lepszym sposobem na to jest uczynienie widoku niewidocznym, gdy nie jest to potrzebne. Musisz także ustawić pozycję dla każdego widoku, aby poruszały się zgodnie z odpowiednią pozycją
źródło
Jeśli używasz a
LinearLayout
, powinieneś zadzwonić,myView.bringToFront()
a potem zadzwonićparentView.requestLayout()
iparentView.invalidate()
zmusić rodzica do przerysowania z nowym zamówieniem podrzędnym.źródło
Dzięki użytkownikowi Stack nad tym wyjaśnieniem, mam to działające nawet na Androidzie 4.1.1
((View)myView.getParent()).requestLayout(); myView.bringToFront();
Na przykład podczas mojego dynamicznego użytkowania tak
public void onMyClick(View v) { ((View)v.getParent()).requestLayout(); v.bringToFront(); }
I Bamm!
źródło
Ułóż je w kolejności, w jakiej chcesz je pokazać. Załóżmy, że chcesz wyświetlić widok 1 na widoku 2. Następnie napisz kod widoku 2, a następnie napisz kod widoku 1. Jeśli nie możesz wykonać tej kolejności, wywołaj bringToFront () do głównego widoku układu, który chcesz umieścić na wierzchu.
źródło
Widoczność innych widoków można ustawić na wartość false.
view1.setVisibility(View.GONE); view2.setVisibility(View.GONE); ...
lub
view1.setVisibility(View.INVISIBLE); view2.setVisibility(View.INVISIBLE); ...
i nastaw
viewN.setVisibility(View.VISIBLE);
źródło