Skip to content

按键类型总览

键盘布局通过 TextKeyboardLayout.json 的 JSON 数据结构定义 —— 顶层是一个二维数组:外层数组的每个元素代表一行,每行又是按顺序排列的按键对象数组。文件里的换行只是排版便利,真正划分行的是数组嵌套结构而不是文本换行。每个按键都有一个 type 字段决定其行为类型,再配合该类型支持的具体字段。

编辑入口

所有按键的字段都可以在 键盘布局编辑器 中可视化修改,也可以直接手改 JSON。

类型一览

type用途必填字段详细页
AlphabetKey字母 / 字符键,支持 swipe 替代字符main, alt详情
MacroKey宏键 —— 单键执行多步动作label, tap.macro详情
LayoutSwitchKey切换到指定文本布局label详情
SymbolKey符号键(直接提交符号)label详情
CapsKey大小写切换键详情
BackspaceKey退格键,支持左右滑动选择删除范围详情
ReturnKey回车键详情
SpaceKey空格键,含切换/光标移动等隐含行为详情
CommaKey逗号键(含表情符号快捷菜单)详情
LanguageKey输入法 / 子模式语言切换详情

几乎所有按键都通用的字段

下表列出多数按键类型都接受的"共通字段",各类型详情页只会列出 该类型独有 的字段。

字段类型范围 / 说明
weightfloat0.0–1.0。正数表示按键宽度占整行的比例。省略字段(或 null)走该按键类型的默认值(见下方宽度规则);显式写 0 表示参与分配行内剩余空间
rowHeightPercentfloat1–100。该键 声明的相对行高;同行先取所有按键中此值的最大值,所有行再归一化。详见下方行高规则
textColorint / hex0xAARRGGBB 形式或十进制;按键主标签颜色
textColorMonetstringMaterial You 色 token 名(Android 12+),可替代 textColor
altTextColorint / hexswipe 出现的副标签颜色
altTextColorMonetstring同上的 Monet 版
backgroundColorint / hex按键背景色
backgroundColorMonetstring同上的 Monet 版
shadowColorint / hex阴影颜色(按键浮雕)
shadowColorMonetstring同上的 Monet 版
swipeobject一个 MacroAction 对象(部分按键支持)
swipeLabelstring在键面上显示的滑动提示文字
composeOverrideobject输入过程中(IME composing 状态)的样式覆盖

宽度 weight 规则

weight 控制按键宽度占该行的比例。取值范围 0.0–1.0

留空时按"类型默认值"处理

省略 weight 字段 或显式写 "weight": null 都视为"未指定",按该按键类型的内置默认值处理(在代码里硬编码):

按键类型默认 weight直观感受
AlphabetKey0.1标准字母键宽
MacroKey0.1与字母键同宽
SymbolKey0.1与字母键同宽
CommaKey0.1与字母键同宽
LanguageKey0.1与字母键同宽
CapsKey0.15略宽(功能键)
BackspaceKey0.15略宽(功能键)
ReturnKey0.15略宽(功能键)
LayoutSwitchKey0.15略宽(功能键)
SpaceKey0(剩余空间)占据该行剩余全部空间

TIP

所以 SpaceKey 默认不需要写 weight,自然就铺满行内剩下的位置 —— 这也是为什么"空格行"通常只在两侧放少量功能键、中间留给空格的写法能直接工作。

显式写值

  • 0 —— 参与分配行内剩余宽度(与 SpaceKey 不写时的行为一致)
  • > 0 —— 按比例占整行;同一行多个键的 weight 总和接近 1.0 时正好填满,超过时按约束布局规则压缩
  • 负值、超出 1.0 等异常值:编辑器会阻止保存,手写 JSON 时不应使用

修改默认按键的宽度

如果你要让一个 ReturnKey 比内置默认更窄(比如 0.1),直接写:

json
{ "type": "ReturnKey", "weight": 0.1 }

这会覆盖该类型的内置默认。

行高 rowHeightPercent 规则

rowHeightPercent 字段 对所有按键类型都有效,用来在单个 layout 内做"按行变化"的高度控制。

取值与含义

  • 取值范围:1–100(浮点数)
  • 含义:按键所在行的相对高度百分比
  • 不写时由同一 layout 内其他行的显式百分比分配剩余高度;没有任何显式值时各行等高

同行多键时的合并规则

同行采用逻辑(重要)

一行中如果有多个按键各自声明了 rowHeightPercent,该行先取所有按键 rowHeightPercent 的最大值,再与其他行一起归一化。

也就是说:

  • 你只需要在一行里的 任意一个按键 上写 rowHeightPercent,整行都会按这个高度渲染
  • 同一行上写了多个不同值时 —— 不会冲突,也不会平均;先取最大
  • 想让某行更矮,要让该行所有按键都不写或都写较小值;任何一个按键写了较大值都会"撑起"整行

典型用法

  • 顶部"功能行"(数字行)写一个较小的 rowHeightPercent,让它比主键盘行更紧凑
  • 底部"空格行"放高一点,方便误触
例:第一行(数字键)矮一些

该行的 0 键声明 rowHeightPercent: 8,其余键不写 —— 这一行会先按 8 参与行高分配,再与其他行一起归一化。

json
[
  { "type": "AlphabetKey", "main": "1", "alt": "!" },
  { "type": "AlphabetKey", "main": "2", "alt": "@" },
  { "type": "AlphabetKey", "main": "3", "alt": "#" },
  { "type": "AlphabetKey", "main": "0", "alt": ")", "rowHeightPercent": 8 }
]
例:撑起的反例(容易踩坑)

若想让整行变矮,但只有一个键留了 rowHeightPercent: 18,这一行仍会按 18 参与分配。要让整行更矮,需要 去掉那个 18 的声明(或把它改小)。

颜色字段约定

  • textColor 等数值字段:接受 0xAARRGGBB 形式(如 0xFFFFFFFF)或十进制等价值
  • textColorMonet 等 Monet 字段:接受 Material You 色 token(如 primary / onSurface / surfaceContainer)。系统切换主题色时按键颜色会跟随
  • 两者同时配置时,Monet 优先(Android 12+)

显示文本 displayText 的多模式格式

AlphabetKey / MacroKey 等支持的 displayText 字段,可以是:

  • 普通字符串:"displayText": "A" —— 永远显示这个文字
  • 模式 → 文本映射:{"倉頡五代": "手"} —— 当前 Rime 子模式 label 或 name 匹配 key 时显示对应值;未匹配时回退到该按键的基础文本

真实 JSON 片段

一个简单字母行
json
[
  { "type": "AlphabetKey", "main": "Q", "alt": "1" },
  { "type": "AlphabetKey", "main": "W", "alt": "2" },
  { "type": "AlphabetKey", "main": "E", "alt": "3" },
  { "type": "BackspaceKey", "weight": 0.15 }
]
包含 MacroKey 的混合行
json
[
  {
    "type": "MacroKey",
    "label": "@",
    "altLabel": ".com",
    "tap":   { "macro": [ { "type": "text", "text": "@" } ] },
    "swipe": { "macro": [ { "type": "text", "text": ".com" } ] }
  },
  { "type": "SpaceKey", "weight": 0.5 },
  { "type": "LayoutSwitchKey", "label": "ABC", "subLabel": "" }
]

相关页面

本项目基于 fcitx5-android/fcitx5-android 修改。源码与文档以 LGPL-2.1 发布。