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),仅供参考

相关新闻

火焰检测数据集应用指南:格式转换、训练验证与避坑清单

火焰检测数据集应用指南:格式转换、训练验证与避坑清单

简介:一份用于火焰识别与检测的标注数据集,面向计算机视觉初学者和YOLO系列模型开发者,主要解决火灾预警、视频监控等场景下的目标检测训练数据匮乏问题。包体共5260个文件,压缩包大小约194MB,其中包含1553张JPG火焰图…

2026/10/17 8:27:49 阅读更多 →
深入mo架构:Go后端+React单页应用如何被打包进一个可执行文件

深入mo架构:Go后端+React单页应用如何被打包进一个可执行文件

【免费下载链接】mo mo is a Markdown viewer that opens .md files in a browser. 项目地址: https://gitcode.com/gh_mirrors/mo7/mo 点击查看 免费下载 mo 是一款在浏览器中打开 Markdown 文件的 Markdown 查看器(Markdown viewer)。它最…

2026/10/16 2:16:50 阅读更多 →
WorkBuddy2API-Hub性能优化实录:SSE按块处理与用量分桶如何让CPU降低76%

WorkBuddy2API-Hub性能优化实录:SSE按块处理与用量分桶如何让CPU降低76%

【免费下载链接】workbuddy2api-hub WorkBuddy 国际国内多账号反代网关,支持 Codex / Claude Code / DSH与标准 OpenAI 客户端。 项目地址: https://gitcode.com/gh_mirrors/wo/workbuddy2api-hub 点击查看 免费下载 WorkBuddy2API-Hub 是一个把 WorkBu…

2026/10/16 2:16:50 阅读更多 →

最新新闻

视觉中心4D占用预测:自动驾驶世界模型的量产落地关键

视觉中心4D占用预测:自动驾驶世界模型的量产落地关键

1. 项目概述:为什么自动驾驶世界模型绕不开4D占用聊一个这两年自动驾驶圈被反复提的词:世界模型。市面上关于世界模型的讨论很多,有生成视频的,有做驾驶预演的,但落到量产最实际的一条线,其实是先把"空…

2026/10/17 8:29:22 阅读更多 →
Function Calling+NestJS:给管理后台加一个会干活的AI Agent

Function Calling+NestJS:给管理后台加一个会干活的AI Agent

说实话,最开始听到“给后台加个AI”这个需求,我第一反应是拒绝的——市面上大多数所谓的“AI后台”,不过是套了一个聊天框的搜索框,用户问一句答一句,答完就完了,什么都落不了地。直到我把大模型的 Functio…

2026/10/17 8:29:22 阅读更多 →
ZED双目测距实战:标定重校准与深度ROI加权优化

ZED双目测距实战:标定重校准与深度ROI加权优化

简介:本资源是一套基于ZED双目立体相机与YOLO目标检测模型融合实现三维测距的完整实践方案,面向计算机视觉初学者、机器人感知开发者及嵌入式AI应用工程师,解决实时目标识别与精确距离估计的技术落地难题,适用于自动驾驶辅助、无人…

2026/10/17 8:29:22 阅读更多 →
Java漏洞扫描器ClassLoader实战避坑指南

Java漏洞扫描器ClassLoader实战避坑指南

简介:本资源是一套面向计算机专业本科生的毕业设计实战项目,聚焦Java语言实现的轻量级漏洞扫描系统,适用于网络安全课程设计、毕设参考及安全工具开发入门学习。项目完整实现了网络爬虫、常见Web漏洞(SQL注入、XSS等)检…

2026/10/17 8:29:22 阅读更多 →
步步高售后刷机工具救砖实战:从驱动配置到分区修复全指南

步步高售后刷机工具救砖实战:从驱动配置到分区修复全指南

简介:步步高售后刷机工具是一款面向VIVO手机用户的系统维护与修复软件,适配高通及MTK(MediaTek)芯片机型,可用于系统恢复、固件升级、root后故障修复以及个性化定制系统等场景,适合具备一定刷机基础、需要自…

2026/10/17 8:28:21 阅读更多 →
一篇讲透数据结构与算法:原理、复杂度与实战应用

一篇讲透数据结构与算法:原理、复杂度与实战应用

不用废话,直接聊正题。干了这么多年开发,面试过的人没有三百也有两百,我越来越确信一件事:数据结构与算法不是面试官拿来刁难人的八股文,而是区分“会写代码”和“能写好代码”的那条分界线。很多人一听到这四个字就头…

2026/10/17 8:28:21 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →