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:

tu wpisz opis obrazu

Żół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
10
Marchy 26 wrzesień 2012, 02:58

2 odpowiedzi

Najlepsza odpowiedź

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>

Floating buttons

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:

Floating Undo Bar

14
CommonsWare 26 wrzesień 2012, 03:03

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ź!

2
Rolf ツ 26 wrzesień 2012, 03:05