Ashok Varma

Programmatically create Ripple Drawable

19 September 2015

It comes in handy many times, from customising colors to set Ripple Drawables dynamically based on content.

public static Drawable getAdaptiveRippleDrawable(int normalColor, int pressedColor) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        return new RippleDrawable(ColorStateList.valueOf(pressedColor),
                null, getRippleMask(normalColor));
    } else { 
        return getStateListDrawable(normalColor, pressedColor);
    } 
} 
 
private static Drawable getRippleMask(int color) {
    float[] outerRadii = new float[8];
    Arrays.fill(outerRadii, 3);// 3 is radius of final ripple, instead of 3 you can give required final radius
 
    RoundRectShape r = new RoundRectShape(outerRadii, null, null);
 
    ShapeDrawable shapeDrawable = new ShapeDrawable(r);
    shapeDrawable.getPaint().setColor(color);
 
    return shapeDrawable;
} 
 
public static StateListDrawable getStateListDrawable(int normalColor, int pressedColor) {
    StateListDrawable states = new StateListDrawable();
    states.addState(new int[]{android.R.attr.state_pressed}, new ColorDrawable(pressedColor));
    states.addState(new int[]{android.R.attr.state_focused}, new ColorDrawable(pressedColor));
    states.addState(new int[]{android.R.attr.state_activated}, new ColorDrawable(pressedColor));
    states.addState(new int[]{}, new ColorDrawable(normalColor));
    return states;
} 

you can get the drawable and apply to any view using view.setBackgroundDrawable()

Drawable drawable = getPressedColorRippleDrawable(normalColor, pressedColor);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
    view.setBackground(drawable);
} else {
    view.setBackgroundDrawable(drawable);
}

for lollipop+ devices you will get ripple else it will change the color of view

— Ashok Varma