在Android Studio 3.6中为XML布局视图添加按压效果
为Android视图添加按压效果的解决方案
要给你的视图添加按压反馈效果,我们可以通过两种常见方式实现——自定义状态选择器或者利用系统自带的Material Design波纹效果,下面分步骤说明:
方法一:自定义按压状态选择器(适合自定义样式)
你的现有状态选择器只处理了state_enabled状态,我们需要添加state_pressed状态来响应按压动作:
1. 更新现有状态选择器文件
修改circle_bg.xml,添加按压状态的drawable:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 禁用状态 --> <item android:drawable="@drawable/circle_paint_dark" android:state_enabled="false" /> <!-- 按压状态:请准备一个对应按压效果的drawable,比如颜色加深的圆形 --> <item android:drawable="@drawable/circle_paint_pressed" android:state_pressed="true" /> <!-- 默认状态 --> <item android:drawable="@drawable/circle_paint" /> </selector>
修改feedback_outline_bg.xml,添加按压状态的图标:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/ic_heartoutlinemade" android:state_enabled="false" /> <!-- 按压状态的图标,比如颜色变化的爱心轮廓 --> <item android:drawable="@drawable/ic_heartoutlinenotmade_pressed" android:state_pressed="true" /> <item android:drawable="@drawable/ic_heartoutlinenotmade" /> </selector>
2. 确保目标视图可点击
在布局中给需要响应按压的视图添加android:clickable="true"和android:focusable="true"属性(比如你的feedbackViewCircle或者整个feedbackContainer):
<ImageView android:id="@+id/feedbackViewCircle" android:layout_width="124dp" android:layout_height="124dp" android:background="@drawable/circle_bg" android:clickable="true" android:focusable="true" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.498" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" />
方法二:使用系统自带波纹效果(快速实现Material Design风格)
如果你的应用遵循Material Design规范,直接使用系统提供的波纹前景可以快速实现按压效果,无需额外准备drawable:
给你的feedbackContainer添加以下属性:
<androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/feedbackContainer" android:layout_width="0dp" android:layout_height="174dp" android:clickable="true" android:focusable="true" android:foreground="?attr/selectableItemBackground" app:layout_constraintEnd_toEndOf="@+id/checkContainer" app:layout_constraintStart_toStartOf="@+id/checkContainer" app:layout_constraintTop_toBottomOf="@+id/checkContainer"> <!-- 内部视图保持不变 --> </androidx.constraintlayout.widget.ConstraintLayout>
?attr/selectableItemBackground会根据你的主题自动生成适配的波纹效果,按压时会在视图范围内显示波纹反馈。
注意事项
- 如果选择自定义选择器,确保
state_pressed的item放在默认状态之前(选择器会从上到下匹配第一个符合条件的状态)。 - 如果你需要给多个子视图添加按压效果,记得分别给每个可点击视图设置对应的选择器和可点击属性。
内容的提问来源于stack exchange,提问作者Alexei
相关产品推荐
相关产品推荐

