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) # 一个点 —— “那儿有东西”
它靠锚点挂在宿主的右上角,所以宿主的尺寸就算是之后才定下来,它也跟得上;对同一个宿主挂两次, 拿回的是同一个角标。数量会左右玩家下一步动作时用数字,只是“那儿有东西”时用点。
它的文字颜色,是照着皮肤给角标涂的那个底色算对比度挑出来的 —— 从不想当然地用白色 —— 而且它带着无障碍名称,因为一个彩色的点,对读屏软件什么都没说。