为什么我的数字填色 App 总是填到旁边那一块?
你的指腹一次盖住几十个区域。App 拿这份含糊怎么办,是一个设计决定,而大多数 App 做得并不好。
你瞄着一片花瓣按下去,结果填上的是旁边那一块。或者什么都没发生,而你不知道为什么。这是填色 App 里最常见的一种挫败感,问题不在你的准头。
指腹的算术
一个指腹压在玻璃上的接触面,直径大概在八到十毫米。在手机屏幕上,这相当于四五十个物理显示像素。而当一幅精细的画被完整地放进这块屏幕时,一个屏幕像素可能覆盖原图上的好几个像素——于是一次点击其实是压在一片几十像素宽的图像上。
一幅繁复的曼陀罗里,小区域只有几个图像像素宽。所以你的手指盖住的不是一个区域,而是好几十个,App 得从这一团含糊里判断你到底想点哪一个。
更麻烦的是,接触发生的那一刻你根本看不见目标——你的手指正压在它上面。你瞄的是一个记忆中的位置,然后亲手把它遮住了。
最朴素的实现,以及它为什么会失败
最直接的做法是:取触点的正中心,换算成画面上的坐标,读出那一个像素的区域编号,填上。每个 App 都从这里起步,因为它只有一行代码,而且看上去显然是对的。
它会以三种很具体的方式失败。
- 中心点落在了轮廓像素上,而轮廓不属于任何区域,于是这一下什么都没发生,你也得不到任何解释。
- 中心点落在了邻居区域内一个像素的位置上,于是填上的是邻居——经典的错填。
- 中心点落进了一个你已经填过的区域,于是这一下点击被白白消耗掉、看不出任何变化,读起来就像 App 在无视你。
这三种都出自同一个错误:把一个又胖、又不精确、还会自己遮住自己的输入,当成鼠标指针来对待。
解法一:读一片邻域,而不是一个点
不要只采样一个像素,而是在触点周围取一个小圆盘,数清楚里面有什么。把这个圆里所有的区域编号统计成一张直方图,挑出现次数最多的那一个。
再加一个条件,工作量就完成了大半:只在「还没填过」的编号里挑出现最多的那一个。你已经上过色的区域不是合理的目标——你不会去瞄它们——所以把它们排除在投票之外,本身就能消掉大部分含糊。如果圆里根本没有任何未填的区域,就退回去用正中心那一个像素的结果。
半径必须跟着缩放走。Numbrush 在画面完整显示时用大约十四个图像像素,随着你放大而缩小。要紧的正是这个性质:缩小看全局时,纠正是慷慨的,因为你本来就不可能准;放大之后它收紧,因为这时候你能准了,而一个过于慷慨的半径会开始越过你的意图替你做主。
解法二:让人看得见自己手指底下的东西
纠正终究只是猜。对最小的那些区域来说,真正的解法是别再遮住目标:长按不放,画布上浮起一个放大镜,把拇指底下那片区域以 2.4 倍呈现,中心有十字准星标出真正会被填的是哪一块。你滑动到想要的那一块,然后松手。
这就把一个「瞄准并祈祷」的交互,换成了一个「看清并确认」的交互。这也是为什么有放大镜的 App 不需要你为每一个小块都放大再缩小一次——在一幅有几百个区域的画上,这个差别就是「画完」和「放弃」的差别。
解法三:让点错这件事免费
上面两条减少的是失误。第三条移除的是失误的后果,而它比前两条都更要紧。
很多填色 App 在你点到一个不属于当前颜色的区域时,会照样用错的颜色填上,或者扣掉一次提示,或者打断连续记录。这是一种游戏设计的本能——有摩擦才有得失——被套用在了一件全部意义就在于「没有得失」的活动上。
Numbrush 会把这样一次点击彻底忽略。什么都不会被填上,什么都不会被扣掉,也不会弹出警告。这就是为什么这个 App 没有撤销按钮、也没有橡皮擦:从来没有什么需要撤销,因为那个错误的动作压根没有被执行过。于是精准不再要紧,而这正是整件事的意义所在。
你自己这边能做的事
- 放大。这是你手上最直接的办法:它既让区域在你手指底下变大,又同时让 App 的点击纠正变得更精确。
- 区域小的时候用长按,不要用点。别点了之后指望它。
- 用颜色高亮去找区域,而不是去读数字。选中一个颜色,整幅画里这个颜色所有还没填的区域会同时被标出来,这比去认一个数字容易得多。
- 一个颜色剩下最后几块时用「下一处」,而不是自己在画布上一寸寸扫。
- 最密的画可以把手机横过来,或者换到平板上。屏幕大意味着每个手指宽度里能容纳更多图像像素,而这才是底层的那个约束。
如果点下去什么都没发生
一次没有反应的点击,通常是三件事之一:手指底下那一块属于别的颜色,而 App 正确地拒绝了把它填错;那一块你已经填过了;或者你落在了轮廓上,而轮廓不属于任何区域。第一种是常见情况,办法是去看高亮在告诉你什么——选中一个颜色之后,此刻你能合法填上的每一块都被标出来了。
值得留意的是,这三种情况都不是故障。一个 App 在这种时候什么都不做,比它随便填点什么给你个反馈要好得多——因为后者意味着你必须回头去修,而修这件事本身就是它替你制造出来的。
常见问题
为什么填上的总是我瞄的那一块旁边?
因为 App 把你的点击当成了一个精确像素来读,而那个像素刚好越过了边界一点点。一个指腹盖住的画面范围远大于一个区域,所以任何不对触点周围邻域做纠正的 App,都会经常这样。
为什么我点下去什么都没发生?
通常是那一块属于你当前选中之外的另一个颜色,于是一个规矩的 App 拒绝把它填错。也可能是那一块你已经填过了,或者你落在了轮廓像素上,而轮廓不属于任何区域。
放大真的有用吗?
有用,而且是双重的。它让每一块在你手指底下变得更大,同时也让 App 的点击纠正半径收紧——于是当你自己已经能做到精准时,纠正就不会再越过你替你做主。
填错了有撤销吗?
在 Numbrush 里没有什么可撤销的:点到一个不属于当前所选颜色的区域,什么都不会发生。这也是它没有橡皮擦的原因。至于那些真的会给你填错色的 App,开始画大图之前先确认一下有没有撤销。
拿真画布试一遍
Numbrush 是给成年人的数字填色:曼陀罗、玫瑰花窗和几何纹样,每幅十二色,窄的地方有放大镜,点错了没有任何代价。免费、离线、无广告、无账号。