Як створити ефект пульсацій у простому макеті


112

Як я можу мати ефект пульсації у простому лінійному / відносному макеті, коли торкатися макета?

Я спробував встановити фон макета на щось подібне:

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="?android:colorControlHighlight" >

    <item android:drawable="@android:color/white"/>

</ripple>

Однак я бачу лише простий білий фон і жодного ефекту пульсацій при дотику до макета. Що я роблю неправильно?

Редагувати:

Для довідки, ось мій файл розміщення xml:

<?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="250dp"
        android:layout_height="250dp"
        android:background="@drawable/test"
        android:clickable="true">
    </RelativeLayout>

2
Погляд, на якому розміщується пульсація, повинен бути включений та доступний для натискання чи фокусування.
alanv

Дякую Аланву, дивіться нижче за мою відповідь. В основному я відзначаю свою компоновку, я хочу, щоб ефект пульсації був таким, що можна натискати, але він не працює.
Зак

Крім того, це добре працює, якщо я видалю <item android:drawable="@android:color/white"/>розділ. Тож я не впевнений, як це має працювати, якби я хотів колір тла на макеті. Накладання цього поверх іншого макета фоновим кольором також не працює!
Зак

4
Якого кольору зображено пульсацію на вашому огляді, наприклад, до якого кольору вирішується colorControlHighlight?
alanv

Відповіді:


260

Встановіть ці властивості у своєму макеті (якщо ваш макет має білий / світлий фон за замовчуванням):

          android:clickable="true"
          android:focusable="true"
          android:background="?attr/selectableItemBackground"

У цьому випадку вам не потрібно користуватися типовим малюнком.

Однак, якщо ваш макет має чорний / темний фон, вам доведеться створити власну пульсацію, що можна малювати, як ця:

<?xml version="1.0" encoding="utf-8"?>
<!-- An white rectangle ripple. -->
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@android:color/white">
    <item
        android:id="@android:id/mask"
        android:gravity="center">
        <shape android:shape="rectangle">
            <solid android:color="@android:color/white"/>
        </shape>
    </item>
</ripple>

А потім встановіть цю пульсацію, яку можна малювати як ваш android: background властивість.

Ви можете побачити багато прикладів цих типів брижі в AOSP: тут


11
Що робити, якщо мені потрібно надати інший колір як фон? Тоді яким повинен бути найкращий підхід?
Ануй Шарма

1
@AnujSharma Ви намагалися надати кольоровий ресурс background?
ІгорГанапольський


31
Якщо вам потрібен інший колір фону, ви можете встановити цей колір як фон і поставити "? Attr / selectableItemBackground" як android: натомість переднього плану
Lucas Arrefelt

2
Оце Так! це чудово. Це слід позначити як відповідь +1
Zia Ur Rahman

59

Я додаю це на додаток до відповіді Ігоря Ганапольського на випадок, якщо хтось хоче мати макет з іншим кольором, а також мати ефект пульсації. Ви просто створюєте ефект пульсації в малюнках, як це:

ripple.xml

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:color="@color/rippleColor"
    tools:targetApi="lollipop"> <!-- ripple effect color -->
    <item android:id="@android:id/background">
        <shape android:shape="rectangle">
            <solid android:color="@color/backgroundColor" /> <!-- background color -->
        </shape>
    </item>
</ripple>

потім дайте це як тло вашого плану чи будь-яку кнопку, як згадував Ігор Ганапольський у своїй відповіді.

android:clickable="true"
android:background="@drawable/ripple"

37

Вам слід змінити наступний фрагмент коду в будь-якому віджеті ( TextView/ Button), і ви можете реалізувати Ripple Effect :

android:clickable="true"
android:focusable="true"
android:foreground="?attr/selectableItemBackground"

І вам добре піти.


хм передній план? це чудово!
Бадр

Це корисно, якщо у вас вже є android: background = "@ color / colorAccent" set
aero

@aero Це корисно, навіть якщо ви не встановлюєте жодного фону.
Панкай Лілан

1
це працює над макетами та спеціальними переглядами на додаток до віджетів.
anoo_radha

1
@MichaelKern Так, ти маєш рацію, також він базується на вимогах усіх у своєму коді.
Панкай Лілан

20

Виявляється, це працює за призначенням. Стандартне значення теми ColorControlHighlight - це тема #40ffffff. Тож на білому тлі це не відображатиметься. Зміна кольору виділення на щось інше працює та / або зміна кольору фону об’єкта.

Дякую всім (особливо Alanv за те, що вказали на мене в правильному напрямку).


якщо я використовую android: background = "? attr / selectableItemBackground" на моєму погляді, як я можу змінити фон об'єкта?
codekraps

1
Не маючи на увазі, я виявив, що стан за замовчуванням selectableItemBackground прозорий. Отже, я встановив вигляд під цим кольором, який я хотів.
codekraps

1
швидка примітка: ви можете змінити colorControlHighlightсвою styles.xml. Наприклад, додайте його до власної теми.
Нюман


5

Це приклад для клацання на зразковому макеті з ефектом пульсації:

 <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/selectableItemBackground"
    android:clickable="true"
    android:focusable="true"
    android:orientation="vertical">

Це просто дивовижне, наскільки це просто і простий факт, що це просто Just Works ™.
Мачадо

4
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:color="#cfd8dc"
    tools:targetApi="lollipop">
    <item android:id="@android:id/mask">
        <shape android:shape="rectangle">
            <solid android:color="#d1c4e9" />
        </shape>
    </item>
</ripple>

Використовуйте цей ripple.xml у папці Dravable , а потім призначте його як View

android: background = "@ dravable / ripple"

android: clickable = "вірно"


2

Просто додайте ефект пульсації за замовчуванням за допомогою android:background="?selectableItemBackground"

Подібно до:

<LinearLayout
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:background="?selectableItemBackground"
            android:clickable="true"
            >

           ...

</LinearLayout>

0

Вставте це у свій макет:

android:clickable="true"
android:background="?attr/selectableItemBackground"

Примітка. У документації API є помилка. Він працюватиме лише в API> = 23

Для всіх рівнів API використовуйте це рішення


2
Ваше посилання перенаправляє цю саму сторінку
TSR

Майте на увазі, що у вас також є можливість використовувати android: background = "? Attr / selectableItemBackgroundBorderless" При цьому менше меж Ефект пульсації поширюватиметься на батьківський вигляд. Це може виглядати краще в багатьох випадках.
Майкл Керн

0

Я намагаюся відповісти на всі ці відповіді, і мені нічого не вийшло, тож я вирішив створити наступний стиль:

<style name="Button.Borderless" parent="Base.Widget.AppCompat.Button.Borderless">
    <item name="android:minHeight">0dp</item>
    <item name="android:minWidth">0dp</item>
    <item name="android:layout_marginLeft">-6dp</item>
    <item name="android:layout_marginRight">-6dp</item>
    <item name="android:paddingTop">0dp</item>
    <item name="android:paddingBottom">0dp</item>
    <item name="android:paddingLeft">6dp</item>
    <item name="android:paddingRight">6dp</item>
</style>

І тоді я застосував до свого лінійного макета:

<LinearLayout
      android:id="@+id/ll_my_ripple"
      style="@style/Button.Borderless">
</LinearLayout>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.