material-ripple源码深度剖析:从触摸事件到动画渲染的完整流程

【免费下载链接】material-ripple [deprecated] Android L Ripple effect wrapper for Views 【免费下载链接】material-ripple 项目地址: https://gitcode.com/gh_mirrors/ma/material-ripple

material-ripple是一个为Android视图提供Material Design风格涟漪效果的开源库,通过封装触摸事件处理和动画渲染逻辑,让开发者可以轻松为任何视图添加流畅的点击反馈效果。本文将从源码角度解析其核心工作原理,帮助开发者深入理解从触摸事件到动画渲染的完整流程。

核心类与布局结构

MaterialRippleLayout作为整个库的核心组件,继承自FrameLayout,采用装饰器模式对普通视图进行包装。其布局文件定义位于./demo/src/main/res/layout/demo.xml./demo/src/main/res/layout/demo_list_item.xml,通过自定义命名空间app:mrl_*属性配置涟漪效果参数。

<com.balysv.materialripple.MaterialRippleLayout
    android:id="@+id/ripple"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:mrl_rippleColor="#ff0000"
    app:mrl_rippleOverlay="true">
    
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button inside a ripple"/>
        
</com.balysv.materialripple.MaterialRippleLayout>

触摸事件处理机制

当用户触摸屏幕时,事件首先通过onInterceptTouchEvent方法进入MaterialRippleLayout(L185-187),该方法负责判断是否需要拦截事件:

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    return !findClickableViewInChild(childView, (int) event.getX(), (int) event.getY());
}

随后事件被传递到onTouchEvent方法(L190-280),该方法处理不同类型的触摸事件:

  • ACTION_DOWN:记录触摸位置,启动预按压状态(L231-241)
  • ACTION_MOVE:检测手指移动,更新涟漪位置或取消动画(L259-276)
  • ACTION_UP:触发点击事件,开始涟漪动画(L208-228)
  • ACTION_CANCEL:取消按压状态,清除动画(L243-258)

动画系统设计

涟漪效果的动画实现主要依赖两个属性动画器:

  1. 半径动画器:控制涟漪从触摸点向外扩散的过程

    ObjectAnimator ripple = ObjectAnimator.ofFloat(this, radiusProperty, radius, endRadius);
    ripple.setDuration(rippleDuration);
    ripple.setInterpolator(new DecelerateInterpolator());
    
  2. 透明度动画器:控制涟漪的淡出效果

    ObjectAnimator fade = ObjectAnimator.ofInt(this, circleAlphaProperty, rippleAlpha, 0);
    fade.setDuration(rippleFadeDuration);
    fade.setInterpolator(new AccelerateInterpolator());
    

动画通过startRipple方法(L321-359)组合执行,使用AnimatorSet管理动画序列,确保扩散和淡出效果的同步进行。

自定义属性系统

库提供了丰富的自定义属性,定义在./library/src/main/res/values/attributes.xml中,主要包括:

  • mrl_rippleColor:涟漪颜色(默认黑色)
  • mrl_rippleDimension:初始涟漪直径(默认35dp)
  • mrl_rippleOverlay:是否覆盖在视图上方(默认false)
  • mrl_rippleAlpha:涟漪透明度(默认0.2)
  • mrl_rippleDuration:动画持续时间(默认350ms)

这些属性在构造函数中通过TypedArray读取(L127-142),并应用到相应的绘制和动画参数中。

绘制流程解析

绘制逻辑主要在draw方法(L473-496)中实现,根据rippleOverlay属性决定绘制顺序:

  • 覆盖模式(true):先绘制背景,再绘制子视图,最后绘制涟漪
  • 背景模式(false):先绘制背景和涟漪,再绘制子视图

圆角涟漪效果通过Path.clipPath实现(L481-485),但在API 18以下设备会自动切换到软件渲染模式以保证兼容性。

适配器视图优化

针对ListView等适配器视图,库提供了mrl_rippleInAdapter属性优化性能。当启用该属性时:

  • 跟踪列表项位置变化(L417-418)
  • 滚动时取消动画(L427-430)
  • 复用视图时重置涟漪状态(L432-433)

使用方法与最佳实践

代码方式创建

MaterialRippleLayout.on(view)
           .rippleColor(Color.BLACK)
           .rippleOverlay(true)
           .create();

XML方式配置

<com.balysv.materialripple.MaterialRippleLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:mrl_rippleColor="#ff0000"
    app:mrl_rippleInAdapter="true">
    
    <!-- 子视图 -->
    
</com.balysv.materialripple.MaterialRippleLayout>

性能优化建议

  1. 在AdapterView中务必设置app:mrl_rippleInAdapter="true"
  2. 避免在快速滑动的列表中使用复杂的涟漪效果
  3. 合理设置rippleDuration,建议值300-400ms
  4. 圆角涟漪在低版本设备上会触发软件渲染,谨慎使用

总结

material-ripple通过精心设计的事件处理、动画系统和绘制逻辑,实现了高效流畅的Material Design涟漪效果。其核心价值在于:

  1. 解耦设计:将涟漪效果与业务逻辑分离,不侵入原有视图
  2. 高度可定制:10+自定义属性满足不同场景需求
  3. 性能优化:针对适配器视图和低版本设备做了特殊优化
  4. 兼容性好:支持Android API 14及以上版本

通过深入理解其源码实现,开发者不仅可以更好地使用该库,还能学习到Android自定义视图、属性动画和事件处理的最佳实践。

要开始使用material-ripple,请克隆仓库:git clone https://gitcode.com/gh_mirrors/ma/material-ripple,并参考./demo/src/main/java/com/balysv/materialripple/demo/目录下的示例代码。

【免费下载链接】material-ripple [deprecated] Android L Ripple effect wrapper for Views 【免费下载链接】material-ripple 项目地址: https://gitcode.com/gh_mirrors/ma/material-ripple

Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐