gohud

等待、告知、计数

← 控件

GoSnackbar —— 会自己找位置的消息条

它待在屏幕底部(或者顶部),避开安全区域和虚拟键盘,然后自己退场。没有它,每一个需要说一句 “已保存”的界面,都得自己写一遍图层、摆放、计时和拆除。

snack.show_text("已保存", GoTheme.SUCCESS)

# 给一次撤销的机会 —— 0 是第一个按钮,-1 表示它自己超时消失了
if await snack.post({"text": "物品已丢弃", "actions": ["撤销"]}) == 0:
    restore_item()

消息会排队,而不是互相覆盖;重复的同一句会被合并 —— 一秒失败四次的服务器, 不会再堆出四分钟的提示。没有按钮的消息条会放行输入,底下的游戏照常运行。

它不是用来发问的地方。 它会自己消失,所以玩家可能根本没看见。 不可撤销的确认请交给 GoDialogs。这里的按钮必须是可有可无的 —— 撤销、 详情、重试。

GoNotice 是这一对里的另一半:它从不接收输入、也不抢焦点,放在哪儿由拥有它的 那个界面决定。它挂不了按钮,而这个挂得了。

GoSpinner —— 看不到尽头的等待

要和服务器打交道的游戏,本页上最需要的就是它:一个纹丝不动的界面,读起来就是卡死了。 一次调用,就把你按下的那颗按钮就地换成一个转圈。

GoSpinner.busy(buy_button, true)
var ok := await server.purchase(item)
GoSpinner.busy(buy_button, false)

按钮会保住原来的尺寸 —— 文字是变透明,而不是被拿走,所以这一行不会跳动 —— 而且转圈期间它是禁用的。后面这半句才是重点:在你 await 的时候, 一次购买绝不能触发两次。打开 reduce_motion 之后它不转圈,改成三个点在呼吸。

量得出来的进度用 GoBar。转圈对什么时候结束不作任何承诺。

GoBadge —— 未读的小圆点、NEW 角标、99+

GoBadge.attach(mail_button, unread_count)   # 为 0 时自己隐藏
GoBadge.attach(shop_button, 0, "NEW")
GoBadge.attach(friend_button, 3, "", true) # 一个点 —— “那儿有东西”

它靠锚点挂在宿主的右上角,所以宿主的尺寸就算是之后才定下来,它也跟得上;对同一个宿主挂两次, 拿回的是同一个角标。数量会左右玩家下一步动作时用数字,只是“那儿有东西”时用点。

它的文字颜色,是照着皮肤给角标涂的那个底色算对比度挑出来的 —— 从不想当然地用白色 —— 而且它带着无障碍名称,因为一个彩色的点,对读屏软件什么都没说。