Applicare Ripple Touch di Material Design a ImageButton?


95

Ho un pulsante immagine che non risponde con un'animazione tattile quando viene cliccato perché è un'immagine statica a differenza dei normali pulsanti su lecca-lecca che vengono forniti con l'effetto a catena incorporato. Vorrei aggiungere l'effetto tocco increspato del material design all'immagine ma non riesco a trovare un modo per implementarlo. Posso impostare un filtro colore sull'immagine ma non è l'effetto a catena. Un esempio di ciò che sto cercando di fare è quando tieni premuta l'immagine di copertina di un album in Google Play Music e un'increspatura dell'ombra si sposta sull'immagine.

Risposte:


259

Per risultati ancora migliori:

<ImageButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@android:drawable/ic_button"
    android:background="?attr/selectableItemBackgroundBorderless"
/>

6
Questa è la risposta migliore: grazie alla sensazione circolare e all'effetto a catena.
— ElliotM

3
Questo dovrebbe funzionare anche con i drawable colorati? Per me nessun effetto tocco è visibile anche se si applica lo sfondo. Il mio tema si estende da Theme.AppCompat.Light.DarkActionBar, potrebbe essere un problema?
— Nome visualizzato

12
invece lo sfondo lo usa in primo piano per tutte le viste che funziona bene.
— Gopi Cg

1
Qualcuno ha trovato un modo per farlo e cambiare anche il colore di sfondo? La modifica di BackgroundTint non funziona e l'impostazione di Foreground su "? Attr / selectableItemBackgroundBorderless" fornisce una fastidiosa imbottitura sul pulsante.
— Sev

1
Se utilizzi uno sfondo scuro, l'increspatura potrebbe non essere sufficientemente visibile. Puoi cambiarlo in un'ondulazione di colore chiaro aggiungendo android:theme="@style/Base.ThemeOverlay.AppCompat.Dark"(funziona su <API 21). Vedi stackoverflow.com/q/28605031/599535 per altre soluzioni.
— Lifes

28

Puoi semplicemente aggiungere uno sfondo al tuo ImageButton in questo modo:

<ImageButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@android:drawable/btn_dialog"
    android:background="?android:attr/selectableItemBackground" />

2
Usa android: foreground = "? Attr / selectableItemBackgroundBorderless"
— MFQ

@MFQ Com'è diverso da? Android: attr / selectableItemBackground
— Killer

1
@killer selectableItemBackgroundBorderless = dà un'increspatura circolare senza limiti come se clicchi su un'icona nella barra degli strumenti, ma selectableItemBackground dà un'increspatura rettangolare, puoi vedere la differenza se fai clic a lungo sull'icona che implementa questo drawbels
— MFQ

6

Ho ricevuto buone risposte da i.shadrin ( qui ) e Nicolars ( qui ).

La differenza tra le loro risposte è che ?attr/selectableItemBackgroundBorderlesspuò darti una android.view.InflateException, quindi ?android:attr/selectableItemBackgroundè la soluzione.

FWIW, non so perché l'eccezione accade, perché la prima risposta ha funzionato bene in tutti i miei vecchi progetti, ma nel mio progetto recente no (forse perché il tema dell'app = android:Theme.Material?).

La cosa strana che stava accadendo è che, sebbene fosse mostrato l'effetto a catena, era fuori delimitato da ImageButton, quindi la soluzione è:

  • Per usare android:foreground="?android:attr/selectableItemBackgroundBorderless"invece diandroid:background="?android:attr/selectableItemBackgroundBorderless"

Spero che ti aiuti se stai affrontando lo stesso.


3

Se hai già uno sfondo e non vuoi cambiarlo, usa il primo piano;

<ImageButton
    android:layout_width="60dp"
    android:layout_height="match_parent"
    android:background="@drawable/preview_in_4k_background"
    android:src="@drawable/ic_full_screen_24px"
    android:layout_marginLeft="5dp"
    android:foreground="?attr/selectableItemBackgroundBorderless"
    android:layout_column="2"/>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.