23

Używam framelayout na dole aktywności, aby pokazać efekty cienia na fragmencie, dodaję android: elewacja. Ale efekty cienia pojawiają się tylko na dole, a nie na wierzchu, czy ktoś mógłby mi doradzić?Android: elewacja ma tylko efekty cieniowania na dolnej stronie, jak sprawić, by efekty cienia pokazywały się na wierzchu?

<FrameLayout 
    android:id="@+id/bottom_container" 
    android:background="#00737f" 
    android:layout_width="match_parent" 
    android:layout_height="50dp" 
    android:layout_gravity="bottom" 
    android:elevation="4dp" 
    android:layout_alignParentBottom="true" 
    android:layout_marginBottom="50dp"/> 

Odpowiedz

17

Istnieje sztuczka, która może być używana do wyświetlania cienia nad widokiem.

Zasadniczo musimy użyć dwóch układów zagnieżdżonych, w których zewnętrzny układ rzuca cień za pomocą elevation, a wewnętrzny układ ustawia background. Następnie ustawiając padding do zewnętrznego układu, można przesunąć wewnętrzny układ dół, bez przemieszczania się cień zatem bardziej cienia jest widoczny:

<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="50dp" 
    android:layout_alignParentBottom="true" 
    android:layout_marginBottom="50dp" 
    android:elevation="4dp" 
    android:outlineProvider="bounds" 
    android:paddingTop="2dp" 
    android:layout_marginTop="-2dp"> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="#00737f"> 

     <!-- content --> 

    </FrameLayout> 

</FrameLayout> 

Ważną rzeczą jest to, atrybut outlineProvider, to jest wymagane, aby zewnętrzny układ rzucał cień nawet bez zestawu tła.

Ponadto określamy ujemną wartość margin, aby skompensować przesunięcie utworzone przez dopełnienie. W zależności od przypadku użycia możemy to pominąć.

Ale uwaga: jeśli przesuwamy View zbyt wiele, niektóre artefakty renderowania stają się widoczne:

android elevation shadow offset examples

Source of this example on Github

Powiązane problemy