将 Material Design Touch Ripple 应用于 ImageButton?
Apply Material Design Touch Ripple to ImageButton?
我有一个图像按钮,当它被点击时不会响应触摸动画,因为它是一个静态图像,不像棒棒糖上的常规按钮,后者带有内置的波纹效果。我想为图像添加 material 设计波纹触摸效果,但似乎找不到实现它的方法。我可以在图像上设置滤色器,但这不是波纹效果。我正在尝试做的一个例子是,当您在 Google 播放音乐中拿着一张专辑封面图片时,阴影波纹会在图片上移动。
您可以像这样向 ImageButton 添加背景:
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@android:drawable/btn_dialog"
android:background="?android:attr/selectableItemBackground" />
为了更好的结果:
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_button"
android:background="?attr/selectableItemBackgroundBorderless"
/>
我从 i.shadrin () and Nicolars () 那里得到了很好的答案。
他们答案的区别在于?attr/selectableItemBackgroundBorderless
可以给你一个android.view.InflateException
,所以?android:attr/selectableItemBackground
就是答案。
FWIW,我不知道为什么会出现异常,因为第一个答案在我所有的旧项目中都运行良好,但在我最近的项目中却没有(可能是因为应用程序主题 = android:Theme.Material
?)。
发生的奇怪事情是,虽然显示了涟漪效应,但它超出了 ImageButton 的范围,所以解决方案是:
- 要使用
android:foreground="?android:attr/selectableItemBackgroundBorderless"
而不是 android:background="?android:attr/selectableItemBackgroundBorderless"
如果你遇到同样的情况,希望对你有所帮助。
如果您已有背景并且不想更改它,请使用前景;
<ImageButton
android:layout_width="60dp"
android:layout_height="match_parent"
android:background="@drawable/preview_in_4k_background"
android:src="@drawable/ic_full_screen_24px"
android:layout_marginLeft="5dp"
android:foreground="?attr/selectableItemBackgroundBorderless"
android:layout_column="2"/>
您可以使用具有此属性的 MaterialButton (com.google.android.material.button.MaterialButton) 而不是 ImageButton。 如果您使用 material 个组件。
<style name="IconOnlyButton">
<item name="iconPadding">0dp</item>
<item name="iconGravity">textStart</item>
</style>
<com.google.android.material.button.MaterialButton
style="@style/IconOnlyButton"
app:icon="@drawable/ic_refresh"/>
对我来说,i.shadin 给出的解决方案由于图像原因无法正常工作,将可绘制对象设置为前景是有效的,但在 API 23 之后得到支持。
这是我的解决方案:
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
android:src="@drawable/men_img" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnMale"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:insetLeft="0dp"
android:insetTop="0dp"
android:insetRight="0dp"
android:insetBottom="0dp"
app:backgroundTint="@android:color/transparent"
app:cornerRadius="0dp"
app:elevation="0dp"
app:strokeWidth="0dp" />
</FrameLayout>
我有一个图像按钮,当它被点击时不会响应触摸动画,因为它是一个静态图像,不像棒棒糖上的常规按钮,后者带有内置的波纹效果。我想为图像添加 material 设计波纹触摸效果,但似乎找不到实现它的方法。我可以在图像上设置滤色器,但这不是波纹效果。我正在尝试做的一个例子是,当您在 Google 播放音乐中拿着一张专辑封面图片时,阴影波纹会在图片上移动。
您可以像这样向 ImageButton 添加背景:
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@android:drawable/btn_dialog"
android:background="?android:attr/selectableItemBackground" />
为了更好的结果:
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_button"
android:background="?attr/selectableItemBackgroundBorderless"
/>
我从 i.shadrin (
他们答案的区别在于?attr/selectableItemBackgroundBorderless
可以给你一个android.view.InflateException
,所以?android:attr/selectableItemBackground
就是答案。
FWIW,我不知道为什么会出现异常,因为第一个答案在我所有的旧项目中都运行良好,但在我最近的项目中却没有(可能是因为应用程序主题 = android:Theme.Material
?)。
发生的奇怪事情是,虽然显示了涟漪效应,但它超出了 ImageButton 的范围,所以解决方案是:
- 要使用
android:foreground="?android:attr/selectableItemBackgroundBorderless"
而不是android:background="?android:attr/selectableItemBackgroundBorderless"
如果你遇到同样的情况,希望对你有所帮助。
如果您已有背景并且不想更改它,请使用前景;
<ImageButton
android:layout_width="60dp"
android:layout_height="match_parent"
android:background="@drawable/preview_in_4k_background"
android:src="@drawable/ic_full_screen_24px"
android:layout_marginLeft="5dp"
android:foreground="?attr/selectableItemBackgroundBorderless"
android:layout_column="2"/>
您可以使用具有此属性的 MaterialButton (com.google.android.material.button.MaterialButton) 而不是 ImageButton。 如果您使用 material 个组件。
<style name="IconOnlyButton">
<item name="iconPadding">0dp</item>
<item name="iconGravity">textStart</item>
</style>
<com.google.android.material.button.MaterialButton
style="@style/IconOnlyButton"
app:icon="@drawable/ic_refresh"/>
对我来说,i.shadin 给出的解决方案由于图像原因无法正常工作,将可绘制对象设置为前景是有效的,但在 API 23 之后得到支持。
这是我的解决方案:
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
android:src="@drawable/men_img" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnMale"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:insetLeft="0dp"
android:insetTop="0dp"
android:insetRight="0dp"
android:insetBottom="0dp"
app:backgroundTint="@android:color/transparent"
app:cornerRadius="0dp"
app:elevation="0dp"
app:strokeWidth="0dp" />
</FrameLayout>