Czy możliwe jest unoszenie elementów nad innymi elementami w Androidzie, aby NIE wpływały na układ ich kontenera?
Efekt, który chcę osiągnąć, to pływający element przypominający bańkę mowy:
Żółte pole powyżej to element, który chcę unosić nad innymi elementami, ale jak widać, popycha on swój pojemnik w dół, tworząc czarną przestrzeń pod zielonym paskiem, zamiast unosić się nad szarym obszarem pod nim.
RelativeLayout może odpowiednio ustawić element, ale nie mogę znaleźć sposobu, aby element pozycjonowany nie rozszerzał granic swojego kontenera. Czy to w ogóle możliwe na Androidzie?
ANALOGIE
- w świecie sieciowym odpowiednikiem jest element, który ma „position: absolute” i dlatego nie jest liczony jako część „flow” (tj.: layout)
- w świecie WPF odpowiednikiem byłby element umieszczony wewnątrz Canvas. Płótno ma swoje własne granice, które zajmują miejsce w układzie, ale jego elementy potomne mogą leżeć poza jego granicami i nie wpływać na układ
- w świecie iOS każdy widok jest pozycjonowany jako kanwa (ponieważ nie ma menedżerów układu), więc to zachowanie jest osiągane przez proste przesunięcie właściwości x i y ramki elementu
2 odpowiedzi
RelativeLayout może odpowiednio ustawić element, ale nie mogę znaleźć sposobu, aby element pozycjonowany nie rozszerzał granic swojego kontenera.
Wtedy masz zły pojemnik.
Na przykład:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/big"
android:textSize="120dip"
android:textStyle="bold"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="@string/small"/>
</RelativeLayout>
Tutaj mały przycisk unosi się nad dużym przyciskiem. Mały przycisk nie „rozszerza granic swojego kontenera”, po prostu dlatego, że kontener to cały widok treści.
Ustawiasz kontener RelativeLayout
(lub FrameLayout
) tak, aby zawierał możliwy obszar, nad którym Twoje dziecko może się unosić. To, czy będzie to cały ekran, czy tylko podzbiór, zależy od Ciebie. I odwrotnie, jeśli Twoje dziecko wpływa na granicę swojego kontenera, używasz niewłaściwego kontenera lub musisz skonfigurować kontener specjalnie do tej roli.
W innym przykładzie Roman Nurik pokazuje, jak zaimplementować pływający „pasek cofania”, podobny do Gmaila:
Spójrz na układy względne w Androidzie: na przykład, jeśli nie określisz pozycji we wszystkich widokach w układzie względnym, będą one unosić się nad sobą.
http://developer.android.com/guide/topics/ui/layout/relative.html
Przykład:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/update"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:background="#444444"
android:text="Update"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/lost_of_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/some_button"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:text="text view with lots of text"
android:textAppearance="?android:attr/textAppearanceMedium" />
<Button
android:id="@+id/some_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:text="Some Button" />
</RelativeLayout>
Edycja: CommonsWare było szybsze ;) spójrz na jego piękną odpowiedź!
Podobne pytania
Nowe pytania
android
Android to mobilny system operacyjny Google, używany do programowania lub tworzenia urządzeń cyfrowych (smartfony, tablety, samochody, telewizory, Wear, Glass, IoT). W przypadku tematów związanych z Androidem użyj tagów specyficznych dla Androida, takich jak android-intent, android-activity, android-adapter itp. W przypadku pytań innych niż programowanie lub programowanie, ale związanych ze strukturą Androida, użyj tego linku: https: // android.stackexchange.com.