深夜提醒

现在是深夜,建议您注意休息,不要熬夜哦~

🏮 🏮 🏮

新年快乐

祝君万事如意心想事成!

share-image
中
ESC

给自研 ROM 的通话界面照 iPhone 重画了一遍:毛玻璃六键、字幕三态,还有个坑了我两小时的黑方块

前阵子我把 ColorOS 那套「骚扰拦截 + 来电标记」搬进了自己编的 LineageOS:标记库、响铃前拒接、通话记录打标,都跑通了。但每次电话进来,跳出来的还是 AOSP 原版那个通话界面——灰扑扑一块,六个按钮挤在底下,像 2016 年的安卓。

功能都齐了,脸还是旧的,这事我一直忍着。忍到上周给通话加实时字幕的时候,终于忍不了了:字幕面板往那个界面上一放,怎么摆都别扭。索性推倒重画,照着 iPhone 的通话界面来。

一屏只干一件事

iPhone 通话界面好在哪?好在它一屏只干一件事。背景是糊掉的联系人照片,中间是名字和号码,底下六个圆按钮,再底下一个大红挂断。没有多余的框、多余的线、多余的灰。

我照这个骨架重排:

  • 背景:联系人头像放大 1.35 倍铺满,再叠 48dp 高斯模糊;没头像的号码,就按号码哈希出四个色团当底,上面压一层竖向暗渐变,保证白字永远读得清。
  • 中部:实时字幕面板,毛玻璃一大块。
  • 下部:3×2 六个毛玻璃圆键——静音、键盘、免提、录音、字幕、标记。
  • 最底:iOS 红(#FF453A)的挂断键,76dp,带一圈同色柔光。

通话中·字幕展开

第一版背景我图省事,色相完全由号码哈希随机出。截出来一看:橄榄绿、泥巴黄、猪肝紫,一屏一个脸色,像打翻了调色盘又没搅匀。改成四个固定基色(蓝 212°、紫 268°、青 188°、暖棕 24°),哈希只允许在基色上抖 ±24°,脸色立刻正常了。随机不是个性,是事故。

那个坑了我两小时的黑方块

毛玻璃按钮的做法很朴素:白 16% 半透明填充,加一圈 1dp 白 24% 的发丝描边。真机没有 backdrop blur 的免费午餐,Modifier.blur() 只糊自己那层,糊不了背后的内容,所以「玻璃感」全靠这层半透明白撑着。

第一版我顺手给每个圆键加了 Modifier.shadow(6.dp),想着有点投影更立体。截屏一看,六个圆键里各蹲着一个深色圆角方块,像玻璃底下压了块脏东西。

查了一圈才明白:elevation 阴影是画在填充下面的。填充是 16% 的白,近乎透明,于是阴影从玻璃底下透了上来,方方正正一块黑。不透明底板上阴影藏在板子后面没人看见,半透明底板上它就是主角。

删掉 shadow,黑方块没了。半透明填充下面永远别垫 elevation,这条我用两小时和六张废截图换的,记下来。

字幕三态:展开、收起、隐藏

实时字幕是分段识别的,一句一句往上滚。但通话界面不是字幕播放器,大多数人打电话不想盯着一屏字。所以字幕键做成三态循环:

  • 展开:整块面板,上滑翻历史,自动跟随最新一句;
  • 收起:压成一条,只留最近一句;
  • 隐藏:面板彻底消失,只在右上角留一颗小胶囊「识别中 N 句」,点一下回到展开。

字幕收起态

字幕隐藏态·右上角小胶囊

按一次字幕键走一格:展开 → 收起 → 隐藏 → 展开。状态写进 SharedPreferences,下次通话接着上次的样子。第一版只有展开和收起两态来回切,隐藏态根本进不去——按钮逻辑写成了 toggle 而不是 cycle,这种 bug 不上真机点十次发现不了。

号码被标成骚扰类的时候,归属地旁边那颗标签会变红,提醒你这通电话接得值不值:

标记为骚扰电话时的红色标签

通话中也能标:横向标签,一排三个

标记面板原来只在挂断之后出现。这次把它也请进了通话中——点「标记」键,从底下升起一张 sheet,标签横向排、一排三个、可以点多个:

通话中标记面板·横向多选标签

上面七类是「拦下来」:骚扰电话、广告推销、疑似诈骗、高风险号码、房产中介、保险理财、出租司机——标了以后这个号再打进来,响铃前直接拒接。下面五类是「放行」:快递外卖、客服售后、生活服务、招聘猎头、装修维修——盖过标记库,这个号永远不拦。

规则只有一条:只要挂了一类「拦下来」就拦。拦是保护,放行是例外,例外不能压过保护。一个号同时是「快递外卖」和「骚扰电话」,它就得被拦。

没有真电话,怎么验 UI

这套界面没法靠打真电话验——我手上没有会准时打进来的测试号。办法是给自己开一扇后门:一个调试广播 TEST_INCALL_UI,往界面总线里灌一通假通话(号码、归属地、标记、通话时长、七句快递对话全是预设的),然后起通话 Activity 截屏。

中间还撞了一堵墙:广播接收器里 startActivity 被系统的后台启动限制(BAL)拦了,而通话 Activity 是 exported=false,shell 身份也起不来。绕法是 userdebug 的 ROM 上 adb root 再 am start,验完立刻 adb unroot。截图上面那些状态栏时间 08:16、08:17,就是这五个状态一个个点出来的。

现在就能用,不用等镜像

有人问:改完是不是得重新编 ROM 刷进去才能用?

不用。签名后的 APK 直接 adb install 到 /data/app,现在这台机器上跑的就是新界面,上面五张图全是真机截的。ROM 源码树里 vendor/ 那份我也同步替换了,但它要等下一次整包编译才会进 /product/priv-app——那只影响以后刷机、换机或者恢复出厂的场景。日常用,装上去就是它。

界面这东西,功能对了只算及格,脸对了才算完工。之前那版能拦骚扰、能打标、能出字幕,但我每次接电话看见它,心里都咯噔一下。现在不咯噔了。

值了。

文章作者:阿文
文章链接: https://www.awen.me/post/5d78889e.html
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 阿文的博客!

评论

0 条评论
😀😃😄 😁😅😂 🤣😊😇 🙂🙃😉 😌😍🥰 😘😗😙 😚😋😛 😝😜🤪 🤨🧐🤓 😎🥸🤩 🥳😏😒 😞😔😟 😕🙁☹️ 😣😖😫 😩🥺😢 😭😤😠 😡🤬🤯 😳🥵🥶 😱😨😰 😥😓🤗 🤔🤭🤫 🤥😶😐 😑😬🙄 😯😦😧 😮😲🥱 😴🤤😪 😵🤐🥴 🤢🤮🤧 😷🤒🤕 🤑🤠😈 👿👹👺 🤡💩👻 💀☠️👽 👾🤖🎃 😺😸😹 😻😼😽 🙀😿😾 👍👎👏 🙌👐🤲 🤝🤜🤛 ✌️🤞🤟 🤘👌🤏 👈👉👆 👇☝️✋ 🤚🖐️🖖 👋🤙💪 🦾🖕✍️ 🙏💅🤳 💯💢💥 💫💦💨 🕳️💣💬 👁️‍🗨️🗨️🗯️ 💭💤❤️ 🧡💛💚 💙💜🖤 🤍🤎💔 ❣️💕💞 💓💗💖 💘💝💟 ☮️✝️☪️ 🕉️☸️✡️ 🔯🕎☯️ ☦️🛐⛎ ♈♉♊ ♋♌♍ ♎♏♐ ♑♒♓ 🆔⚛️🉑 ☢️☣️📴 📳🈶🈚 🈸🈺🈷️ ✴️🆚💮 🉐㊙️㊗️ 🈴🈵🈹 🈲🅰️🅱️ 🆎🆑🅾️ 🆘❌⭕ 🛑⛔📛 🚫💯💢 ♨️🚷🚯 🚳🚱🔞 📵🚭❗ ❕❓❔ ‼️⁉️🔅 🔆〽️⚠️ 🚸🔱⚜️ 🔰♻️✅ 🈯💹❇️ ✳️❎🌐 💠Ⓜ️🌀 💤🏧🚾 ♿🅿️🈳 🈂🛂🛃 🛄🛅🛗 🚀🛸🚁 🚉🚆🚅 ✈️🛫🛬 🛩️💺🛰️
加载中...

留言反馈

😀😃😄 😁😅😂 🤣😊😇 🙂🙃😉 😌😍🥰 😘😗😙 😚😋😛 😝😜🤪 🤨🧐🤓 😎🥸🤩 🥳😏😒 😞😔😟 😕🙁☹️ 😣😖😫 😩🥺😢 😭😤😠 😡🤬🤯 😳🥵🥶 😱😨😰 😥😓🤗 🤔🤭🤫 🤥😶😐 😑😬🙄 😯😦😧 😮😲🥱 😴🤤😪 😵🤐🥴 🤢🤮🤧 😷🤒🤕 🤑🤠😈 👿👹👺 🤡💩👻 💀☠️👽 👾🤖🎃 😺😸😹 😻😼😽 🙀😿😾 👍👎👏 🙌👐🤲 🤝🤜🤛 ✌️🤞🤟 🤘👌🤏 👈👉👆 👇☝️✋ 🤚🖐️🖖 👋🤙💪 🦾🖕✍️ 🙏💅🤳 💯💢💥 💫💦💨 🕳️💣💬 👁️‍🗨️🗨️🗯️ 💭💤❤️ 🧡💛💚 💙💜🖤 🤍🤎💔 ❣️💕💞 💓💗💖 💘💝💟 ☮️✝️☪️ 🕉️☸️✡️ 🔯🕎☯️ ☦️🛐⛎ ♈♉♊ ♋♌♍ ♎♏♐ ♑♒♓ 🆔⚛️🉑 ☢️☣️📴 📳🈶🈚 🈸🈺🈷️ ✴️🆚💮 🉐㊙️㊗️ 🈴🈵🈹 🈲🅰️🅱️ 🆎🆑🅾️ 🆘❌⭕ 🛑⛔📛 🚫💯💢 ♨️🚷🚯 🚳🚱🔞 📵🚭❗ ❕❓❔ ‼️⁉️🔅 🔆〽️⚠️ 🚸🔱⚜️ 🔰♻️✅ 🈯💹❇️ ✳️❎🌐 💠Ⓜ️🌀 💤🏧🚾 ♿🅿️🈳 🈂🛂🛃 🛄🛅🛗 🚀🛸🚁 🚉🚆🚅 ✈️🛫🛬 🛩️💺🛰️