WelcomeCoordinator 源码剖析:自定义 LayoutParams 与 destiny 属性深度解析

发布时间:2026/10/16 2:17:47
WelcomeCoordinator 源码剖析:自定义 LayoutParams 与 destiny 属性深度解析
【免费下载链接】welcome-coordinatorWelcome Coordinator for Android项目地址https://gitcode.com/gh_mirrors/we/welcome-coordinator点击查看免费下载WelcomeCoordinator 是一款帮助 Android 应用打造欢迎向导Welcome Wizard与表单向导的开源库。本文带你深入它的源码完整剖析两件事自定义 LayoutParams 是如何被生成和解析的以及destiny 属性如何仅用一行 XML 就让一个控件飞行到指定的目标位置。 先认识 WelcomeCoordinator库的核心思路很直观把每一屏欢迎页做成一个独立 layout根节点使用 WelcomePageLayout再通过addPage(...)依次加到 WelcomeCoordinatorLayout 中它负责横向排布、触摸滚动和底部指示点。真正的魔法在于页面上的每个子视图都可以声明一段行为Behavior当用户滚动页面时行为会驱动视差、缩放、飞行等动画。而声明行为、指定目标位置靠的就是下面要讲的LayoutParams和destiny。 源码地图5 个核心文件文件职责WelcomeCoordinatorLayout.java继承 HorizontalScrollView负责页面排布、滚动、指示点并把滚动进度分发给所有 BehaviorWelcomePageLayout.java每页的根布局内含自定义 LayoutParams解析两个关键属性WelcomePageBehavior.javaBehavior 抽象基类定义onCreate/onPlaytimeChange两个回调WelcomeCoordinatorPageInflater.java负责 inflate 每个页面布局attrs.xml声明所有可识别的 XML 属性 自定义 LayoutParams从生成到解析第一步4 个钩子方法确保用对参数Android 中每个子视图的属性都挂在父容器的 LayoutParams 上。WelcomePageLayout 重写了 4 个钩子方法保证无论子视图以何种方式被创建拿到的都是它自己的LayoutParams类型Override public LayoutParams generateLayoutParams(AttributeSet attrs) { return new LayoutParams(getContext(), attrs); }其中generateLayoutParams(AttributeSet)是关键——XML 中的子视图 inflate 时走的就是这个构造函数。第二步读出两个 XML 属性LayoutParams的构造方法会调用extractAttributesL131-L143用obtainStyledAttributes从 attrs.xml 定义的 styleable 中读取两个属性declare-styleable nameWelcomePageLayout_LayoutParams attr nameview_behavior formatstring/ attr namedestiny formatreference/ /declare-styleable注意 styleable 的命名约定父布局类名_LayoutParams这是 Android 识别子视图自定义属性的标准写法。两个属性各走一条解析路径view_behaviorformatstring取出的是 Behavior 类名交给反射处理destinyformatreference通过getResourceId(...)取出目标控件的 id未设置时默认NO_DESTINY_VIEW -1第三步反射实例化 BehaviorparseBehavior 的实现堪称迷你版 MotionLayout behavior 机制如果类名以.开头如.ParallaxTitleBehaviour自动补上context.getPackageName()作为包名前缀——这也是 XML 里可以简写的原因Class.forName加载类 → 取无参构造 →newInstance()创建实例任何异常统一包装为RuntimeException(Could not inflate Behavior subclass ...)让错误暴露在启动时而非静默失效页面加入 Coordinator 后getBehaviors 会遍历本页所有子视图把带 behavior 的视图逐一装配setCoordinator→setTarget→setPage。其中setCoordinatorWelcomePageBehavior.java#L56-L72注册了一个一次性的全局布局监听等布局测量完成后才回调onCreate——保证行为初始化时能读到真实的测量尺寸。 destiny 属性深度解析定义与用途一个引用型属性destiny拉丁语命运/目的地在 attrs.xml 中声明为formatreference专门用来告诉 Behavior你的动画终点是哪一个控件。核心实现懒加载 全局查找destiny 最值得玩味的是它的查找逻辑位于 getDestinyViewint destinyViewId ((WelcomePageLayout.LayoutParams) targetView.getLayoutParams()).getDestinyViewId(); if (destinyViewId ! NO_DESTINY_VIEW) { destinyView coordinatorLayout.findViewById(destinyViewId); }三个设计细节懒加载只有在 Behavior 真正需要时才查找且结果缓存到destinyView字段之后直接复用全局查找findViewById作用域是整个WelcomeCoordinatorLayout而不是当前页面——这意味着目标控件可以位于另一屏id 来自 LayoutParamsdestiny 的值不是存在 Behavior 上而是存在目标视图自身的 LayoutParams 里由getDestinyViewId()按需取出实战案例一颗跨页面飞行的星星demo 中的 welcome_page_2.xml 里一颗星星只写了两个属性FrameLayout android:idid/star app:view_behavior.AnimationFlightTo app:destinyid/android_destiny而android_destiny这个 60dp 的锚点 View 竟然定义在下一页welcome_page_3.xml 的右上角。于是 AnimationFlightTo 在onCreate中通过 getLeftPositionFrom 逐级累加父布局偏移算出星星与 destiny 锚点在全局坐标系中的距离生成位移、缩放、阴影透明度四组ObjectAnimator——用户从第 2 页滑向第 3 页时星星就飞进了下一页右上角的锚点。⏱ Behavior 如何被驱动滚动位置即播放时间所有 Behavior 的动画并不是自己播放的。滚动发生时notifyProgressScroll 会把页面进度 滚动位置分发给每一个 Behavior 的onPlaytimeChange回调。Behavior 内部则使用setCurrentPlayTime手动驱动一个时长 10 秒的ObjectAnimator把动画进度与滚动位置一一映射见 AnimationFlightTo.onPlaytimeChange。这种滚动 scrub 动画的手法让动画与手指完全同步滑回去就倒放体验浑然一体。 值得借鉴的 3 个模式属性下放子视图的差异化配置放在父容器的自定义 LayoutParams 中XML 声明即代码零 Java 接线反射 点前缀简写app:view_behavior.MyBehavior免去写全包名类名解析失败时立即抛出可读异常reference 类型属性用formatreferencegetResourceId表达指向某个控件配合全局findViewById实现跨布局引用 关键文件索引路径关注点attrs.xml两组 declare-styleable 属性定义WelcomePageLayout.java自定义 LayoutParams 全貌WelcomePageBehavior.java基类与 destiny 懒查找WelcomeCoordinatorLayout.java页面装配与 Behavior 提取AnimationFlightTo.javadestiny 的完整使用范例赞分享【免费下载链接】welcome-coordinatorWelcome Coordinator for Android项目地址https://gitcode.com/gh_mirrors/we/welcome-coordinator点击查看免费下载相关推荐WelcomeCoordinator 完整入门addPage 添加页面与 4 大自定义属性详解WelcomeCoordinator 完整入门addPage 添加页面与 4 大自定义属性详解 WelcomeCoordinator 是一款 AndroidSmoothProgressBar源码深度剖析理解Android自定义Drawable的实现原理SmoothProgressBar源码深度剖析理解Android自定义Drawable的实现原理 想要为你的Android应用添加流畅美观的进度条动画吗Sm移动开发UI组件FlexSearch源码深度剖析三resolution评分机制与自定义score函数完全解析FlexSearch源码深度剖析三resolution评分机制与自定义score函数完全解析 本文带你彻底搞懂 FlexSearch https:/搜索引擎后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考