2016-08-26 29 views
18

Zawsze używałem android:background="?selectableItemBackground" dla efektu ripple, gdy kliknięto widok (na przykład LinearLayout). Myślę, że czytałem gdzieś, że to jest wstecznie kompatybilne z API 14.Używając? SelectableItemBackground z białym tłem

Jednak znalazłem, że muszę użyć tego efektu marszczyć, ale z białym tłem. W szczególności mam układ dla elementu listy, który będzie wyświetlany na domyślnym tle koloru (będę rozciągał się od Theme.AppCompat.Light.NoActionBar), więc chcę, aby element listy wyróżniał się na tym tle, kolorując element listy jako biały (#FFFFFF) .

Oto układ element listy:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:background="?selectableItemBackground" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    ... 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center_vertical" 
     android:paddingLeft="@dimen/mdu_keyline_1" 
     android:paddingRight="@dimen/mdu_keyline_1" 
     android:paddingTop="@dimen/mdu_padding_normal" 
     android:paddingBottom="@dimen/mdu_padding_normal"> 

     ... 

    </LinearLayout> 

</FrameLayout> 

Powyższy wywołuje odzew bez białym tle.

Gdy próbuję:

<FrameLayout ... 
    android:background="@color/white"> 

To oczywiście powoduje białe tło ale bez odzew.

Próbowałem też coś innego - i to produkowane wynik najbliżej czego szukam:

<FrameLayout ... 
    android:background="@color/white"> 

    ... 

    <LinearLayout ... 
     android:background="?selectableItemBackground"> 

Powyższy dał mi białe tło z odzew. Mimo to,, tętnienie zawsze zaczyna się od środka, niezależnie od tego, którą część elementu kliknę.

Oto kilka zrzutów ekranu pokazujących aktualny wynik (zignoruj ​​cień na górze listy elementów - jest to cień z AppBarLayout i Toolbar używam).

enter image description here

enter image description here

Jak mogę osiągnąć pożądany efekt?

Odpowiedz

35

można wykorzystywać nową wiedzę swojego FrameLayout:

<FrameLayout ... 
    android:background="@android:color/white" 
    android:foreground="?attr/selectableItemBackground"> 
+0

To jest idealne! Dziękuję bardzo. –

+2

Hm. Ciekawe, dlaczego nigdy wcześniej nie słyszałem o nowej wiedzy. Działa jednak! Dzięki! – EGHDK

15

Można utworzyć Layer-listy w folderze kanału alfa, i ustawić na swoim tle:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@android:color/white"/> 
    <item android:drawable="?attr/selectableItemBackground"/> 
</layer-list> 
+0

Kiedy używam marszczyć w folderze do rysowania, w systemie Android 6.0 powoduje to błędy, a następnie utworzyłem pytanie proszę sprawdzić: [binary-xml-file-line-error-inflating-class-unknown] (http://stackoverflow.com/ pytania/38862718/binary-xml-file-line-error-inflating-class-unknown). Czy próbowałeś tego w Androidzie 6.0? –

+0

Czy dzieje się tak również, gdy używasz tego jako tła do rysowania (zamiast pierwszego planu)? Obecnie używam dokładnej listy warstw powyżej w jednej z moich aplikacji, działa dobrze na Androidzie szóstym. Używam wsparcia biblioteki libs 23.4.0. – Marcel50506

+0

Tak, próbowałem użyć jako tła. Może to jest problem CardView.Nie próbowałem użyć w normalnym widoku. –

0

Ripple odkształcalne jest LayerDrawable. Tak więc właściwą drogą jest:

<ripple xmlns:android="http://schemas.android.com/apk/res/android" 
     android:color="?attr/colorControlHighlight"> 

    <item> 
     <shape> 
      <solid 
       android:color="#FFFFFF"/> 
     </shape> 
    </item> 

    <item android:id="@android:id/mask"> 
     <shape> 
      <solid android:color="@android:color/white"/> 
     </shape> 
    </item> 

</ripple>