I am using selectableItemBackgroundBorderless
to add a ripple to an ImageView
.
My expected behaviour would be to have a circular ripple, extending the views size. Unfortunately the ripple gets cropped by the view bounds.
How can this issue be solved?
Default state:
Pressed state:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/nav_instruction_container"
android:layout_width="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_height="wrap_content"
xmlns:tools="http://schemas.android.com/tools"
android:background="@drawable/nav_gradient_bg"
android:padding="20dp">
<ImageView
android:id="@+id/nav_sign"
android:layout_width="wrap_content"
android:layout_height="46dp"
android:layout_centerVertical="true"
android:scaleType="centerInside"
android:adjustViewBounds="true"
/>
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/nav_sign"
android:layout_marginLeft="24dp"
android:layout_marginStart="24dp"
android:layout_marginRight="24dp"
android:layout_marginEnd="24dp"
android:textColor="@color/white"
android:textSize="24sp"
android:textStyle="bold"
android:maxLines="2"
tools:text="A644 Shudehill asdfkjasdf asdfasdf asdfsss"
android:ellipsize="marquee"
/>
<TextView
android:id="@+id/subTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/title"
android:layout_toRightOf="@+id/nav_sign"
android:layout_marginLeft="24dp"
android:layout_marginStart="24dp"
android:layout_marginRight="24dp"
android:layout_marginEnd="24dp"
android:textColor="@color/white"
android:textSize="17sp"
tools:text="via Church St"
/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
app:srcCompat="@drawable/ic_nav_queue_sheet_icon_light"
android:id="@+id/nav_queue"
android:scaleType="centerInside"
android:foreground="?attr/selectableItemBackgroundBorderless"
android:adjustViewBounds="true"/>
</RelativeLayout>
If you have a clickable ImageView
, then most possibly it should be an ImageButton
instead.
Having defined following ImageButton
:
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackgroundBorderless"
app:srcCompat="@drawable/ic_navigation_black_24dp" />
Then you'll get following output:
If you want bigger ripple effect, you have to change view's size: instead of wrap_content
make it, let's say, 100dp:
Define ripple_effect_circle.xml
in drawable
<?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="#BDBDBD"
>
<item android:id="@android:id/mask">
<shape android:shape="oval">
<size
android:width="60dp"
android:height="60dp"/>
<solid android:color="#BDBDBD" />
</shape>
</item>
</ripple>
Define ImageView
in layout
<ImageView
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_margin="60dp"
android:src="@drawable/ripple_effect_circle"
android:background="@drawable/your_round_image"
/>
You can use library https://github.com/hdodenhof/CircleImageView for this issue.
Create the circular Imageview with the above library and it will be having the ripple effect as you expected.
One thing is your limiting the height of the ImageView
by 46dp
add padding
to ImageView
instead of Parent layout
do layerlist drawable xml make the first item shape circle then add item selectableItemBackgroundBorderless and it will work fine
Just change from using ImageView
's foreground to background: android:background="?selectableItemBackgroundBorderless"
. Then you should see the ripple render outside of the view bounds.
来源:https://stackoverflow.com/questions/47511587/imageview-selectableitembackgroundborderless-does-not-render-outside-of-view-bou