Android 自定义控件的多样式能力来自 View 继承、style、theme attr、selector 和 values-night 的组合;迁到 ArkUI 时,先把 style 树拆成颜色资源、AttributeModifier、状态样式和结构组件,而不是直接封装一堆 BrandButton。
Android 自定义控件是一条从 View 继承出去的主线;ArkUI 的自定义能力则分散在 @Component、@BuilderParam、@Styles/@Extend、AttributeModifier、Canvas、DrawModifier、ContentModifier、FrameNode/RenderNode 等多条分支里。能力不是没有,但入口更零散,组件库设计也不能照搬 Android 的继承模型。
Android 的深浅色处理不只是 values-night 资源切换,还包括 theme attr、style 继承、widget 默认样式和局部 theme overlay。迁到 HarmonyOS 时,resources/dark 可以承接同名颜色资源,但 XML style 继承链要重构成语义 token、组件封装和 ArkUI 参数。
Android 的 .9.png 不只是图片,它把可拉伸区域和内容 padding 写进 1px 标记边。迁到 HarmonyOS 时,图片要还原成普通 PNG,拉伸规则交给 ArkUI 的 resizable、backgroundImageResizable 或 borderImage,内容区域用 padding 显式写出来。
Android 的 animation-list 可以把一组 PNG 写进 drawable XML,再由 AnimationDrawable 播放。HarmonyOS 没有同名资源 XML,但 ArkUI ImageAnimator 可以完整承接这个场景。关键迁移点是:图片帧保留为 media 资源,播放语义从 drawable XML 移到 ArkUI 组件状态。
首页里常见的推荐/关注/我的,或者概览/统计/设置,本质上都是同级页面切换。本文用一个三栏首页示例讲 ArkUI Tabs 的写法:父组件只管 tab 切换,每个 tab 自己维护状态;再对照 Android View 的 TabLayout + ViewPager2 和 Compose 的 TabRow / NavigationBar。
栅格解决的是“同一组卡片排几列”,动态布局解决的是“页面结构什么时候改变”。本文用一个设置面板示例,把 ArkUI 的 onAreaChange、条件渲染和布局模式表串起来:窄屏纵向堆叠,宽屏切成主设置区 + 右侧状态栏;再对照 Android View/Compose 的资源限定符、WindowSizeClass 与 BoxWithConstraints。
同一个“入口宫格/卡片墙”,在手机要两列、平板要三列、横屏要四列:如果你靠 if/else 手写一堆宽高,很快就会失控。本文用一个最小可复用的“功能入口栅格”示例,对照 ArkUI 的 GridRow/GridCol 与 Android(Compose 的 LazyVerticalGrid / View 的 GridLayoutManager),把“列数、间距、span/offset、断点”这套规则落到具体写法。
Row/Column 解决“沿一条轴排”,Stack 解决“覆盖叠放”,Flex 解决“放不下就换行”。但当你要把角标、播放按钮、标题、副标题、操作区同时放进同一张卡片时,真正的难点变成了:控件之间到底怎么互相对齐、互相约束?本文用一个封面卡片示例,对照 ArkUI RelativeContainer 与 Android ConstraintLayout(含 Compose 约束思路),把“约束关系”这件事从心智到写法一次讲清楚。
入门第二篇:我用 10 分钟的 curl 实验跑通 LLM 调用闭环,并把请求、错误处理和日志字段收敛成一个最小 client。