You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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就能轻松实现:

  1. 在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>
  1. 给目标View设置这个背景:
    • XML布局中:android:background="@drawable/custom_highlight"
    • Java代码中:view.setBackgroundResource(R.drawable.custom_highlight);

自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:21:23