174

I want to set a ripple effect on textview and imageview in Android Studio. How can I do it?

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Vasant
  • 3,475
  • 3
  • 19
  • 33
  • 1
    Please elaborate your question first.What actually you need and what have you tried so far.Simply saying that i want ripple effect makes it a very broad question.You can also give some link for reference as to what you want.Also see http://stackoverflow.com/help/how-to-ask – Anirudh Sharma Nov 02 '15 at 12:01
  • Actually i want effect for text-view and image-view select/unselect effect. – Vasant Nov 02 '15 at 12:04
  • have you tried searching for the same? – Anirudh Sharma Nov 02 '15 at 12:06

16 Answers16

354

Ref : http://developer.android.com/training/material/animations.html,

http://wiki.workassis.com/category/android/android-xml/

<TextView
.
.
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
/>

<ImageView
.
.
.
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
/>
Bikesh M
  • 8,163
  • 6
  • 40
  • 52
103

If you want the ripple to be bounded to the size of the TextView/ImageView use:

<TextView
android:background="?attr/selectableItemBackground"
android:clickable="true"/>

(I think it looks better)

Micro
  • 10,303
  • 14
  • 82
  • 120
  • 3
    Is there any difference in using ```selectableItemBackground``` vs ```selectableItemBackgroundBorderless``` – rakesh kashyap Sep 30 '16 at 16:29
  • I don't know why it was not bounded to borders and it expand through whole layout – VSB Nov 22 '16 at 18:29
  • 5
    @rakeshkashyap the difference is that selectableItemBackground will keep the ripple within it's view size(width/height). selectableItemBackgroundBorderless will expand it's ripple over other views (like the official calculator app ripple) – Tudor Feb 06 '17 at 12:36
  • 1
    and also need to set this >>> android:focusable="true" – Amos Nov 21 '18 at 00:20
43

Please refer below answer for ripple effect.

ripple on Textview or view :

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

ripple on Button or Imageview :

android:foreground="?android:attr/selectableItemBackgroundBorderless"
Vasant
  • 3,475
  • 3
  • 19
  • 33
  • 4
    Please notice that `selectableItemBackgroundBorderless` is API 21+. Below you can choose `selectableItemBackground` to avoid compatibility issue – StevenTB Jan 30 '19 at 14:00
  • Thanks! It has effect on API 23+. Also instead you can use `?attr/selectableItemBackgroundBorderless` and `?attr/selectableItemBackground`. I think, `android:clickable` and `android:focusable` are optional. – CoolMind Oct 14 '21 at 07:43
18

Add android:clickable="true" android:focusable="true"

For Ripple Effect

android:background="?attr/selectableItemBackgroundBorderless"

For Selectable Effect

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

For Button effect

android:adjustViewBounds="true" style="?android:attr/borderlessButtonStyle"
silver_hawk
  • 189
  • 1
  • 4
12
<TextView
    android:id="@+id/txt_banner"
    android:layout_width="match_parent"
    android:layout_height="45dp"
    android:layout_below="@+id/title"
    android:background="@drawable/ripple_effect"
    android:gravity="center|left"
    android:paddingLeft="15dp"
    android:text="@string/banner"
    android:textSize="15sp" />

Add this into drawable

<?xml version="1.0" encoding="utf-8"?>

<!--this ripple animation only working for >= android version 21 -->

<ripple
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@color/click_efect" />
Boken
  • 4,825
  • 10
  • 32
  • 42
11

You can use android-ripple-background

Start Effect

final RippleBackground rippleBackground=(RippleBackground)findViewById(R.id.content);
ImageView imageView=(ImageView)findViewById(R.id.centerImage);
imageView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        rippleBackground.startRippleAnimation();
    }
});

Stop animation:

rippleBackground.stopRippleAnimation();

For KOTLIN

val rippleBackground = findViewById(R.id.content) as RippleBackground
val imageView: ImageView = findViewById(R.id.centerImage) as ImageView
imageView.setOnClickListener(object : OnClickListener() {
    fun onClick(view: View?) {
        rippleBackground.startRippleAnimation()
    }
})
Zain
  • 37,492
  • 7
  • 60
  • 84
IntelliJ Amiya
  • 74,896
  • 15
  • 165
  • 198
8

for circle ripple : android:background="?attr/selectableItemBackgroundBorderless"

for rectangle ripple : android:background="?attr/selectableItemBackground"

Bita Mirshafiee
  • 600
  • 8
  • 14
7
android:background="?android:selectableItemBackground"
android:focusable="true"
android:clickable="true"
BDL
  • 21,052
  • 22
  • 49
  • 55
Areeb Momin
  • 199
  • 4
  • 4
6

In the case of the well voted solution posted by @Bikesh M Annur (here) doesn't work to you, try using:

<TextView
...
android:background="?android:attr/selectableItemBackgroundBorderless"
android:clickable="true" />

<ImageView
...
android:background="?android:attr/selectableItemBackgroundBorderless"
android:clickable="true" />

Also, when using android:clickable="true" add android:focusable="true" because:

"A widget that is declared to be clickable but not declared to be focusable is not accessible via the keyboard."

Filipe Brito
  • 5,329
  • 5
  • 32
  • 42
4

addition to above answers is adding focusable to avoid UI editor's warning

android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:focusable="true"
Zafer Celaloglu
  • 1,438
  • 1
  • 17
  • 28
4

If above solutions are not working for your TextView then this will definitely work:

    <com.google.android.material.button.MaterialButton
        style="?attr/buttonBarButtonStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minWidth="0dp"
        android:minHeight="0dp"
        android:paddingHorizontal="@dimen/padding_8dp"
        android:text="Clickable Text"
        android:textColor="your text color"
        app:backgroundTint="@android:color/transparent"
        app:rippleColor="ripple effect color" />

Here, style="?attr/buttonBarButtonStyle" and app:backgroundTint="@android:color/transparent" will make this button as transparent background so that it will look like TextView and everything else will be done automatically.

Kishan Solanki
  • 13,761
  • 4
  • 85
  • 82
1

In addition to @Bikesh M Annur's answer, be sure to update your support libraries. Previously I was using 23.1.1 and nothing happened. Updating it to 23.3.0 did the trick.

Mark Pazon
  • 6,167
  • 2
  • 34
  • 50
0

The best way its add:

    <ImageView
        android:id="@+id/ivBack"
        style="?attr/actionButtonStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="16dp"
        android:src="@drawable/ic_back_arrow_black"
        android:tint="@color/white" />
Jack
  • 11
  • 2
0
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="@android:integer/config_shortAnimTime">
    <item android:state_pressed="true">
        <shape>
            <solid android:color="@color/textHint"/>
        </shape>
    </item>
    <item android:state_pressed="false">
        <shape>
            <solid android:color="@android:color/transparent"/>
        </shape>
    </item>
</selector>




<TextView
      android:id="@+id/t9_key_6"
      android:layout_height="80dp"
      android:text="@string/number_six"
      android:background="@drawable/keyboard_button_bg"
      android:textSize="30sp" />
Ritunjay kumar
  • 261
  • 3
  • 6
0

selectableItemBackgroundBorderless does not work when you have some background or background color property set. It wasn't working for me.

android:background="?attr/selectableItemBackgroundBorderless"

but the good news is that it works on the foreground as well.

android:foreground="?attr/selectableItemBackgroundBorderless"
Sandeep Dixit
  • 799
  • 7
  • 12
-5

Using libraries. This is one of them. Just add its dependency and put below code in xml before each elements that needs ripple effect:

<com.balysv.materialripple.MaterialRippleLayout
android:id="@+id/ripple"
android:layout_width="match_parent"
android:layout_height="wrap_content">
  • 5
    oh please no, it's not the best way because you have less control over it and it's widely supported in the Android SDK itself. If anyone reads this I recommend to either look at the comment of @Bikesh or Karthik if you want to control the color. – Dion Segijn Jan 25 '17 at 12:35