I try to use padding to increase the touch area of a button. I use
<ImageButton
android:paddingRight="32dp"
android:paddingEnd="32dp"
android:id="@+id/confirm_image_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:background="?selectableItemBackgroundBorderless"
android:src="?attr/confirmIcon" />
The click area is enlarge. But, selectableItemBackgroundBorderless click effect no longer shown as a perfect circle.

I try to use duplicateParentState technique to overcome.
<FrameLayout
android:clickable="true"
android:paddingRight="32dp"
android:paddingEnd="32dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true">
<ImageButton
android:duplicateParentState="true"
android:id="@+id/confirm_image_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?selectableItemBackgroundBorderless"
android:src="?attr/confirmIcon" />
</FrameLayout>

Now,
selectableItemBackgroundBorderless circle effect is a perfect circle.However, it seems to have some weird behavior. When I click on the actual area of the ImageButton, the circle press effect is not shown.

May I know why it is so, and how can I overcome it? I tested using API 26.
Note, I try to avoid using TouchDelegate technique, unless I'm forced to, as it makes our code more complicated.
The following is the correct behavior, exhibited by the button for Toolbar.
Ripple effect is shown when the click region is outside the button

Ripple effect is shown when the click region is within the button

However, I have no idea how they implement such behavior.
After spending some time I finally found how the "toolbar mystery" works. It's ActionMenuItemView, that is being displayed on the toolbar. And you can see, that inside xml file it has style="?attr/actionButtonStyle" applied to it. ?attr/actionButtonStyle corresponds to Widget.Material.ActionButton and within this style we can see <item name="background">?attr/actionBarItemBackground</item>.
If you want to apply the same effect to your ImageButton, then all you have to do is to apply android:background="?attr/actionBarItemBackground" to it. Thus, having following xml layout:
<ImageButton
android:id="@+id/confirm_image_button"
android:layout_width="50dp"
android:layout_height="50dp"
android:background="?attr/actionBarItemBackground"
android:src="@drawable/ic_check_black_24dp" />
You'll receive this output:

Turned on "Show layout bounds" so that actual bounds of ImageButton are visible
If you are curious what ?attr/actionBarItemBackground actually represents, here's it:
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="?attr/colorControlHighlight"
android:radius="20dp" />
Thus, you can create your drawable and apply it as a background to ImageButton.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With