Color controlHighlight/Ripple Effect:该效果名称及自定义方法咨询
嘿,我来给你把这两个Android触摸反馈效果讲得明明白白的!
对应的效果/视图名称
controlHighlight
这是Android 5.0(API 21)之前的按压高亮触摸反馈,本质是用StateListDrawable实现的状态切换背景——当View被按压、选中时,会切换到指定的高亮样式,松开后恢复默认,是早期Android的标准交互反馈方式。
Ripple Effect(涟漪效果)
这是Android 5.0及以后Material Design引入的涟漪触摸反馈,对应的是RippleDrawable类。点击View时,波纹会从触摸点向外扩散,自带平滑的半透明过渡,现在已经是Android应用的主流触摸反馈效果了。
自定义方法
自定义controlHighlight(适配旧版Android)
用状态列表drawable就能轻松实现:
- 在
res/drawable目录下创建custom_highlight.xml:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 按压状态的高亮颜色 --> <item android:drawable="@color/custom_pressed_color" android:state_pressed="true"/> <!-- 选中状态的样式 --> <item android:drawable="@color/custom_selected_color" android:state_selected="true"/> <!-- 默认无交互状态 --> <item android:drawable="@android:color/transparent"/> </selector>
- 给目标View设置这个背景:
- XML布局中:
android:background="@drawable/custom_highlight" - Java代码中:
view.setBackgroundResource(R.drawable.custom_highlight);
- XML布局中:
自定义Ripple Effect(适配API 21+)
涟漪效果的自定义分两种常见场景,按需选择:
1. 有边界的涟漪(波纹限制在View范围内)
这是最常用的场景,比如按钮、卡片的触摸反馈:
- 在
res/drawable-v21目录下创建custom_ripple.xml:
<?xml version="1.0" encoding="utf-8"?> <ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="@color/custom_ripple_color"> <!-- 设置波纹的颜色 --> <!-- 可选:设置View的默认背景,不设置则使用View本身的背景 --> <item android:drawable="@drawable/custom_normal_bg"/> </ripple>
- 给View设置背景:
android:background="@drawable/custom_ripple"
2. 无边界的涟漪(波纹超出View范围)
比如FloatingActionButton的触摸效果,波纹会扩散成圆形超出View本身:
- 先在
res/drawable创建圆形遮罩circle_mask.xml:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <solid android:color="@android:color/white"/> <!-- 颜色不影响,仅用于确定波纹扩散范围 --> </shape>
- 再在
res/drawable-v21创建custom_unbounded_ripple.xml:
<?xml version="1.0" encoding="utf-8"?> <ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="@color/custom_ripple_color"> <!-- 通过mask指定波纹的最大扩散范围 --> <item android:id="@android:id/mask" android:drawable="@drawable/circle_mask"/> </ripple>
- 给View设置这个背景即可。
代码动态生成涟漪效果
如果需要在代码里动态创建涟漪,可以这么写:
// 获取波纹颜色和遮罩Drawable int rippleColor = getResources().getColor(R.color.custom_ripple_color); Drawable maskDrawable = getResources().getDrawable(R.drawable.circle_mask); // 构建RippleDrawable RippleDrawable rippleDrawable = new RippleDrawable(ColorStateList.valueOf(rippleColor), null, maskDrawable); // 给目标View设置 targetView.setBackground(rippleDrawable);
内容的提问来源于stack exchange,提问作者Abu Nayem
相关产品推荐
相关产品推荐

