Galaxy Z Fold6焕新秘籍:折叠屏高阶美化玩法
|
亲历现场。那版系统推出来第三天,我正对着 Fold6 的主屏侧边栏图标重绘逻辑发呆,测试妹子把一叠截图甩桌上——全是折叠态下 Launcher 二次加载时的图层撕裂,红框标得跟急诊病历似的。我原以为是 SurfaceFlinger 队列调度的问题,结果抓 trace 发现根本没进 GPU 渲染管线,纯纯在 WindowManagerService 里被 abort 了两次。这个我敢打包票。
产品概念图,仅供参考 窗外洒水车又来了,水柱扫过玻璃的时候我刚敲完第十七行 Canvas.saveLayer() 的 fallback 补丁。编译卡在 dex-merge 那步,三百七十二秒。机械键盘声没停过,同事老陈在隔壁工位用 Cherry MX Blue 敲 gradle.properties,每个“o”都带弹簧回弹音。楼下便利店关东煮的竹签味混着铁皮屋檐的热气钻进来,我数了三根:萝卜、鸡蛋、魔芋丝,没数第四根,因为 Build Output 突然跳红:“Resources not found for folded_state_config”——操,config qualifier 居然认不出 /res/values-folding/ 这个目录名。厂商对接人王工微信弹窗跳出来:“刘哥,‘焕新秘籍’那个 banner 动效能不能加个折叠转场?” 我回了个“正在对”,其实连 res/anim-folding/ 下该放 translate 还是 scale 都没定。他上条消息说“领导说用户就爱看高阶玩法”,我回了个“嗯”,其实心里想的是:这词儿上次出现在 Note20 Ultra 的主题 SDK 文档里,还是个废弃的 deprecated 接口。真要硬接,要么 hook ActivityTransition,要么重写 WindowContainerController——但 fold state change callback 是异步广播,你永远不知道它比 onResume 晚十八秒还是早四百六十三毫秒。 测试机堆在窗台,五台 Fold6,两台 Fold5,一台 Flip4。阳光斜射下来,最左边那台屏膜反光太强,我伸手去挡,发现指尖蹭到的是昨天留下的指纹印,没擦。这台烧的是 debug build,adb logcat -b events 里刷着一串 “FOLDING_STATE_CHANGED: CLOSED -> HALF_OPENED”,可 UI 就是不响应。我切过去看 ViewRootImpl 的 dispatchAttachedToWindow,它根本没走 onLayout。不是卡,是压根没触发。这个我说不准。 老陈端着保温杯路过,瞥了眼我屏幕,说:“哎你试试把 Configuration.touchScreen 改成 TOUCHSCREEN_NOTOUCH?” 我试了。崩了。崩在 SystemUI 的 StatusBarIconController.onConfigurationChanged,null pointer on mIconGroups.get(0)。后来才发现是那版系统里,mIconGroups 在折叠态初始化为 null,但没判空就直接 get(0),连 try-catch 都没包——不是设计问题,是当年某次 OTA 合并冲突时,某位兄弟手抖删掉了三行。这事我在邮件里问过王工,他说“查一下历史记录”,结果他三天后回我:“可能在 Jenkins 的某个已删分支里”。我信了,直到上周在旧 NAS 备份盘里翻出压缩包,解压出来发现:他给我的 SHA 是错的。差两位。 所以什么叫“优胜劣汰”?就是你交包前最后一刻发现,同一套 XML 动画,在 unfold 到 87% 时会掉一帧,但在 unfold 到 86% 或 88% 就不会;你不能改动画时长,不能动插值器,唯一能动的是 setFoldThreshold(0.865f)——可这个值在另一台机器上偏移 0.01 就白屏。没有文档,没有源码注释,只有八百二十七行 patch notes 里夹着一句:“Improved folding continuity under high memory pressure()”,脚注没了,括号里本来该有的 reference number 被剪掉了。我们外包团队五个人对着这句话看了两小时,最后测试妹子点了杯冰美式,把纸巾盒盖子掀开又合上七次,说:“要不……就把阈值设成 0.86 和 0.87 之间随便一个数?反正用户也看不出区别。” 她没说错。真的看不出。上周我去商场蹲点,偷看了十五个路人用 Fold6 打开那个“焕新秘籍”页面——十三个手指划得太快,没停顿;两个划到一半折起来看内屏;零个人注意到底部导航栏的圆角是否和折叠缝对齐。但我还是改了。把 threshold 从 0.865 写成 0.867,加了三百一十九行日志埋点,就为了等下次 OTA 后看 trace 里是不是还卡在同一个 SurfaceView.draw() 调用栈里。 今天早上收到王工消息:“刘哥,下期‘秘籍’加个暗色模式联动折叠动效,客户说要‘感知形态变化’。” 我回:“好的”,然后删了聊天记录。桌上的机械键盘又响起来,这次是空格键,咔哒、咔哒、咔哒。我起身去窗台摸了下那台晒着的 Fold6,背壳烫手。没管。反正再烫也不会炸,就像那些没写进 spec 的 config qualifier,从来不会报错,只会悄悄绕过你写的每一行 onFoldStateChanged()。 我现在在重跑一遍 gradle assembleDebug,这次把 --no-daemon 加上了。编译开始前,我顺手把关东煮汤勺塞回便利店塑料袋里——他们今早换新包装了,油渍渗透得更快。等会要是再卡住,我就去楼下买根萝卜。 (编辑:52刷机网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

