Застосувати Touch Design Ripple з дизайну матеріалу до кнопки ImageButton?


95

У мене є кнопка зображення, яка не реагує на сенсорну анімацію при натисканні, оскільки це статичне зображення, на відміну від звичайних кнопок на льодянику, які мають вбудований ефект пульсацій. Я хотів би додати до зображення ефект ефектного хвильового дотику, але, здається, не можу знайти спосіб його реалізувати. Я можу встановити кольоровий фільтр над зображенням, але це не ефект пульсації. Прикладом того, що я намагаюся зробити, є те, коли ви тримаєте зображення обкладинки альбому в Google Play Музиці, і брижа тіні рухається по зображенню.

Відповіді:


261

Для ще кращого результату:

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

7
Це краща відповідь - дякуючи круговому відчуттю, а також ефекту пульсації.
— ElliotM

3
Чи це також має працювати з кольоровими шухлядами? Для мене не видно сенсорного ефекту, хоча застосовується фон. Моя тема поширюється на Theme.AppCompat.Light.DarkActionBar, чи може це бути проблемою?
— Відображувана назва

12
замість фону використовуйте його на передньому плані для всіх подань, які працюють нормально.
— Gopi Cg

1
Хтось знайшов спосіб зробити це, а також змінити колір тла? Зміна BackgroundTint не працює, а встановлення переднього плану на "? Attr / selectableItemBackgroundBorderless" дає неприємні відступи на кнопці.
— Sev

1
Якщо ви використовуєте темний фон, пульсація може бути недостатньо видимою. Ви змінюєте його на світлу пульсацію шляхом додавання android:theme="@style/Base.ThemeOverlay.AppCompat.Dark"(працює на <API 21). Інші рішення див. У статті stackoverflow.com/q/28605031/599535 .
— Натюрморти

28

Ви можете просто додати фон до вашої ImageButton таким чином:

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

2
Використовувати android: foreground = "? Attr / selectableItemBackgroundBorderless"
— MFQ

@MFQ Чим він відрізняється від? Android: attr / selectableItemBackground
— Killer

1
@killer selectableItemBackgroundBorderless = дайте кругову пульсацію без меж, як якщо натиснути на піктограму на панелі інструментів, але selectableItemBackground дасть пульсацію прямокутника, ви побачите різницю, якщо довго натискали на піктограму, яка реалізує ці штрихи
— MFQ

6

Я отримав хороші відповіді від i.shadrin ( тут ) та Nicolars ( тут ).

Різниця між їхніми відповідями полягає в тому, що ?attr/selectableItemBackgroundBorderlessви можете дати вам відповідь android.view.InflateException, тому ?android:attr/selectableItemBackgroundце рішення.

FWIW, я не знаю, чому трапляється виняток, тому що перша відповідь спрацювала добре у всіх моїх старих проектах, але в моєму недавньому проекті ні (можливо, тому що тема програми = android:Theme.Material?).

Дивна річ, що відбувалася, полягає в тому, що, хоча ефект пульсації був показаний, він виходив за межі ImageButton, тому рішення:

  • Використовувати android:foreground="?android:attr/selectableItemBackgroundBorderless"замістьandroid:background="?android:attr/selectableItemBackgroundBorderless"

Сподіваюся, це допоможе вам, якщо ви стикаєтесь з тим самим.


3

Якщо у вас вже є фон і ви не хочете його змінювати, використовуйте передній план;

<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"/>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.