页面切换与状态保留的实现
安卓修改大师智改工坊 · 技术拆解
要动画,也要"回切还在"
双槽容器 · 常驻页面实例 · Esc 的层级顺序

主标语放在最显眼的位置:只需说话,就能让应用变成你想要的样子。这是安卓修改大师智改工坊要说的事——一款 Windows 桌面工具,拖入安装包、用中文写需求,AI 改 smali 与资源,改完自动回编 / 对齐 / 签名 / 校验,一键装到手机或模拟器看效果。介绍页在 https://www.apkeditor.cn/ai-version.aspx,官网 www.apkeditor.cn。

改包是主线,但界面里有一个细节很值得单独讲:底部有五个 Tab 页(新建项目、项目列表、话术列表、任务中心、用户中心),另有从列表或首页点进去的应用详情页。切来切去时,你既看得到新页从侧向滑入、旧页淡出的动画,又不会丢掉"刚才写了一半的需求"和"列表滚到哪儿了"。这两件事同时成立并不自然,本文就把它的做法拆开。

一、要动画,又要不丢状态:一对天然的矛盾

先说矛盾在哪。想要切页动画,最省事的实现是"把旧页拆掉、把新页建出来",然后用动画把新页请进来。可一旦拆掉重建,页面上的一切就都归零了:输入框里的半句话没了、滚到一半的列表跳回顶部、附件列表得重新选。反过来,想保住状态,最简单的办法就是"两个页面都留着",可那样两个都会被渲染、都会响应点击,动画也就无从做起。

所以问题真正问的是:能不能让"保留实例"和"只显示一个"同时成立?答案是把页面和容器分开——容器只负责"此刻显示哪一个",页面自己只管被创建一次、一直活着。

一句话记住这篇的骨架:容器管显示,实例管状态。动画只是容器把两个插槽的透明度和位移演一遍。

二、双槽容器:两个插槽轮流坐庄

这个页面容器本身就是一个网格,里面只放两个"插槽"。每个插槽是一个内容宿主,可以装一个页面;两个插槽一前一后叠着,但同一时刻只有一个在显示,另一个要么装着上次那个页面、要么是空的。

每个插槽身上挂着一组变换(缩放 + 位移),原点定在正中间,所以缩放看起来是"从中心轻轻胀一下",而不是从左上角拉扯。这套变换必须由代码创建而不是写在界面标记里——因为内联的变换对象会在加载时被冻结,冻结的东西挂不上动画。容器本身还会把内容裁剪在边界内,滑入滑出时才不会溢出到旁边的区域。

第三个成员是一道斜向的玻璃高光:一条约 190 像素宽、带 16 度倾斜的窄矩形,叠在最上层(层级最高),并且不参与鼠标命中。它平时完全透明,只在切页那 400 多毫秒里扫过一遍,亮度先升后降,峰值出现在约四成位置。它的作用是给"新页进来"这件事一个方向感——纯靠淡入淡出,人眼很难判断是从哪边来的。

两个插槽与一道高光
图 1:两个插槽轮流坐庄,高光扫过给出方向感。

三、360 毫秒进场、270 毫秒退场:这几个数字是怎么定的

切页时新页和旧页同时演,但参数不同。把关键参数列出来,比一句"丝滑过渡"有用得多:

动作 时长 细节
新页进场 360 毫秒 淡入 + 横向滑 56 像素到位 + 缩放回弹
旧页退场 270 毫秒 反向淡出 + 轻微退缩,比进场短 90 毫秒
高光扫过 420 毫秒 方向跟随切换方向,峰值亮度约 0.85
Tab 指示条 420 毫秒 胶囊滑动带回弹,图标额外来一下缩放弹跳

退场为什么比进场短?因为两页在过渡中有短暂的重叠期,如果旧页迟迟不淡完,两块半透明的界面糊在一起会显得脏。让它早 90 毫秒收工,新页收尾时对面已经干净了。

还有一个不写出来就没人会注意的细节:所有动画都设成"播完回到基础值",而基础值被预先设成了动画终点。这样做的好处是动画一结束,属性不会跳变;下一次切页前把动画清掉,界面也稳稳停在终点上,不会闪一下。如果反过来用"停在动画末尾"的默认行为,基础值还留在起点,下一次清理动画时就会看到一次跳变。

另外两件事保证"连点也不花":其一,新页永远盖在旧页上面,过渡期间的点击命中新页,不会点到底下那个正在退场的页面;其二,每次切换都会给过渡发一个递增的序号,回收动作只在序号对得上时执行——快速连点 Tab 时,上一轮的收尾回调会被直接丢弃,交给新一轮处理。启动时用的是另一条路径:不做动画,直接把第一页放进插槽,免得一打开就先看一段动画。

进场退场的时间参数
图 2:进场 360、退场 270、高光 420,都是"看得见但不拖沓"的区间。

四、状态为什么不丢:页面实例常驻,一次创建终身受用

现在回答"不丢状态"。做法很直白:五个 Tab 页在窗口初始化时一次性全部创建好,放进一个固定数组里;详情页同样是常驻的一个实例,不随打开关闭而重建。切页时容器只是把"要显示的那个实例"放进插槽——页面对象本身从来没被销毁过。

所以你在详情页输入框里写了一半的需求、在项目列表里滚动到的位置、在话术列表里选中的那条,切走再切回来都还在。这不是"把状态存起来再恢复",而是根本没有销毁过:界面标记只解析一次,控件实例只有一份,输入框里的文字本来就在它的属性上。

常驻实例保住界面状态
图 3:实例常驻,写了一半的需求与滚动位置自然就在。

代价是启动时要多创建几个页面、内存里一直留着它们。这是一个明确的取舍:五个页面都不重,而"回切丢状态"带来的挫败感远大于多占的那点内存。启动时不做动画、直接显示第一页,也是同一个取向——把时间花在能用上的地方。

五、哪些状态会保留,哪些会重新取

实例常驻带来一个必须回答的问题:数据会不会一直是旧的?答案是用页面自己的"进入/离开"回调来分工——界面状态保留,业务数据按需刷新。这个分工在几个页面上的表现完全不同:

  • 项目列表:每次切回来都重新扫一遍项目目录。所以你在资源管理器里手工拷进来的项目、刚改完配置的目录,回来就能看到。
  • 新建项目页:回来时刷新一次反编译环境状态;离开时把"文件拖到一半"的悬停提示清掉,不然回到这一页会看到一个假的选中态。
  • 首页与用户中心:切回这两页会顺手重新拉一次全局登录信息(昵称、大师币、会员类型),所以充值成功后切回去看到的就是新数字。
  • 详情页:它显示的是某个具体项目的内容,从列表点进来会先按当前项目装载,避免把 A 项目的历史填进 B 项目的输入框。

性能上的取舍同样值得说清:切页只做透明度和位移/缩放这类变换,不触发重新布局,也不重新解析界面标记,所以切页几乎不耗 CPU;旧页淡出结束后会被彻底收起(不留在可视树里挡点击),但它的内容仍然挂着——下次再显示时又拿回来用,不重建。

六、Esc 的层级顺序:从最上层往下关

浮层多的时候,Esc 该先关谁,直接决定"顺手"还是"抓狂"。这里的规则是:永远先关最上层那个,而且不同浮层的行为不一样——有的可以关,有的只晃一下告诉你"这里必须点按钮"。

  1. 提示窗口(最上层,必须点按钮):Esc 吃不掉,窗口晃一下提醒你。
  2. 扫码登录监测窗口、付款监测窗口:Esc 等于点"关闭",同时停止轮询。
  3. 反编译环境更新窗口:能关就关,正在装的时候晃一下。
  4. 自动打包窗口:正在打包时不给关(晃一下),跑完就能关。
  5. 在线更新窗口:强制更新时不给关,普通更新可关。
  6. 登录窗口、充值窗口:Esc 等于取消。
  7. 新建项目窗口:Esc 等于取消这次建项目。
  8. 修改历史窗口:Esc 关闭。
  9. 选择附件窗口:Esc 等于"取消",选了一半的文件不会带出去。
  10. 修改密码窗口:Esc 等于取消,不会提交。
  11. 以上都没有时,如果正停在应用详情页,Esc 就退回原来的 Tab 页(和左上角的「‹ 返回」等价)。

两个"不关"的设计是有意的:运行中的打包窗口不给关,是为了避免你以为没在跑;提示窗口必须点按钮,是因为它是"必须被看到"的消息,随手按 Esc 关掉反而更容易误事。

七、怎么用顺:从"切页不丢"能得到的四个便利

  1. 等 AI 改包的空档可以放心切页。等的是项目目录里的标志文件(主窗口每 2 秒看一次),这件事在后台线程里跑,和你在哪个 Tab 无关;去话术列表翻一条新需求、回详情页补两句话,都不会打断等待。
  2. 需求写一半可以去抄参考。输入框里的内容不会因为切到话术列表而丢;挑中一条话术点「选择」,内容会填回详情页的输入框。
  3. 从历史里"照上次再改一遍"很顺手。详情页下部就是修改历史(最新在最上),每条右侧的「选择」会把那条需求原样填回输入框,原文不会被改掉,改两句再发就是一条新记录。
  4. 切页动画看不懂方向时,看 Tab 指示条往哪边走。点右边的 Tab,新页从右侧进来、指示条向右滑;点左边的 Tab 反之——方向感是一致的。

八、两个自家应用的改包实例

实例一:给自家内部工具换启动页背景,顺便把开屏广告位去掉。以前:解包后在资源目录里翻图片、对密度、改相关布局;去掉开屏广告还要找到加载它的那处逻辑并改 smali,改完回编、对齐、签名,最后装到手机上试——一轮下来一小时起步,改错一步就得重来。现在一句话:把自家的包装拖进去,写"启动页背景换成附件里的图,去掉开屏广告页,其余不动",主图作为附件上传并写明用途,点「立刻修改」;AI 改完后自动回编 / 对齐 / 签名 / 校验。怎么验证:打包窗口四步逐条过,勾"打包后自动运行"直接装到模拟器或手机并拉起,看启动页;不满意就回详情页,把刚才那句需求从历史里点回来改两个字再发一次——这正是"切页不丢状态"最有用的场景:你根本不用重新组织那段话。

实例二:把自家调试版应用名改成"XX 助手 内测版"并换图标。以前:改字符串资源、替换多个密度的图标、顺手加版本号、重新签名,任何一步漏了都要返工;更麻烦的是打包时手滑关掉工具窗口,进程没了只能从头再来。现在一句话:"应用名改成『智改工坊·内测版』,图标换成附件里的新 logo,版本号 +1。"怎么验证:装到设备上看桌面名字与图标;打包窗口不给关正好避免了误关;出包后还有「保存 APK」按钮,默认文件名是"应用名_版本号_signed.apk",一眼能对上版本。

他们说:界面顺不顺,直接影响用不用得下去
用户评价 · 以下为使用者本人的主观感受
「我写需求写到一半跑去翻话术,回来那句话还在,这个细节救过我好几次。」
—— 小林 · 独立开发者
「等 AI 的时候我经常切到列表里翻项目,切回去输入框还是原样,不会白等。」
—— 老赵 · 团队技术负责人
「Esc 的先后顺序是合理的:监测窗口关掉,剩下的再退页面,不会一下子把所有东西都关掉。」
—— 阿凯 · 自动化测试
「切页动画快,不拖泥带水;该保留的保留、该刷新的刷新,这个分寸感是对的。」
—— 何工 · 企业内部应用维护
请务必注意:安卓修改大师智改工坊面向你自己拥有版权、或已获得权利人明确授权的应用,用于学习研究、自有产品定制、企业内部应用调整与二次开发等合法场景。请勿用于破解他人付费应用、去除他人版权信息,或绕过任何安全机制。
结语:容器管显示,实例管状态

回到主标语:只需说话,就能让应用变成你想要的样子。这句话要成立,前提是"说话"这件事本身别被打断:需求写到一半能去翻资料、切个页面回来继续写、等 AI 的时候能去干别的。安卓修改大师智改工坊把这个前提做成了两个插槽与一批常驻实例——动画照演,状态照留。介绍页在 https://www.apkeditor.cn/ai-version.aspx,官网 www.apkeditor.cn。想验证也简单:把自己的包拖进去,写一句中文需求,切走再切回来,看那句话还在不在。

下载区域
Windows 桌面端 · 只需说话就能改 APK
拖入安装包,用中文写需求,AI 改包;改完自动回编 / 对齐 / 签名 / 校验,一键装到手机或模拟器看效果。改到一半切走、切回来接着写,状态不丢。
立即下载智改工坊(AI 版)
运行环境:Windows 桌面端;导入支持 APK / JAR / APKS / XAPK / APKM / CLASS;出包产物在项目 build 目录下。官网:www.apkeditor.cn