键盘布局 - tumuyan/trime-without-CMake GitHub Wiki

我所理解的皮肤

一套皮肤,既决定了用户看到什么、怎样交互,也决定了是否美观。

我对同文皮肤系统的调整,既没有对美观做太多追求,也没有对方便做太多优化。主要在功能的完善上,兼顾看得下去,而默认主题重在让人看明白需要怎么抄作业。

是否美观,最核心的部分,是背景、外框和文字样式。 rime系皮肤,1套皮肤可以内置多种配色方案,缺少的配色透过fallback机制补完,这一点非常精妙,但是也使得皮肤相当复杂——介于这一事实,我在增加参数时做了一些优化。

皮肤的构成

用户看到的普通键盘,由候选词栏和键盘本体两部分构成。液态键盘,由标签栏和键盘本体两部分构成。这两者之间是相互对应的,共用了大部分皮肤参数。 并且,新版本皮肤是由三部分叠加的——最底层为root_background,上层由上方候选词栏的candidate_background和下方键盘区域的keyboard_back_color构成。这一好处是键盘可以使用一张完整的图,图片顶齐到候选栏,而候选栏又可以通过半透明图片的形式进行分割和强调。

layout\min_check,是悬浮窗显示词数的算法变更(只要前n个候选词有长度大于等于min_length的词,就会把长度符合以及之前的词全部加到悬浮窗内)。

液态键盘

... (在3.2.2之后的版本中)增加了剪贴板管理器、可以快速编辑的符号键盘、符号历史,这些功能全部建立在liquidKeyboard(液态键盘)的基础上。

那么如何调整符号键盘呢?可以说调整符号键盘是前所未有的简单。符号键盘一共有三组参数:

  1. 尺寸参数

  key_height: 40      #按键高度
  key_height_land: 40 #横屏模式按键高度
  single_width: 60    #single类型的按键宽度
  vertical_gap: 1     #纵向按键间隙
  margin_x: 0.5         #左右按键间隙的1/2

  1. tab列表。数组中的每一项对应一个tab,数组的顺序即tab的顺序。如果没有对应的数据,则不显示这个tab。如果同一个tab出现了多次,则显示多次这个tab

  keyboards: [emoji, math, ascii, cn, clipboard, history, exit, list , table, symbol, ids , pinyin, jp, unit, exit, grease, rusa, korea, lation, yinbiao, exit]  #tab列表
 

  1. tab内容。名称和上边的数组内容对应,name即tab显示的文本内容,type即类型,keys即按键列表。当选择NO_KEY类型时,keys解析为命令字符串。SINGLE 类型时,keys解析为按键列表。如果keys的值的属性为字符串,每个字符解析为一个按键;如果为数组,每个元素解析为一个按键。目前支持的type包含:
Type 说明
NO_KEY 只占据tab位,不含keys(如返回键)
TABS tab列表(显示为更多
CLIPBOARD 剪贴板(大段文本自动缩略,按键长度自适应。)
COLLECTION 收藏的文本, 复用剪贴板样式
DRAFT 草稿箱,即文本框编辑历史,复用剪贴板样式
CANDIDATE 候选词,复用候选栏样式
HISTORY 近期上屏符号历史
以下类型的键盘,都必须包含keys列表
SINGLE 按键使用固定宽度。单个字符即按键。SINGLE是默认类型的按键
VAR_LENGTH 按键长度不固定,与展开候选的样式相同

  exit:
    name: 返回
    type: NO_KEY
    keys: EXIT
  emoji:
    type: SINGLE
    keys: "🙂😂🤣😆🙃😅🙈🙉🙊☹😑😄🤐😨😱🌚🌝🤔❤💔♡🌹💣👌👍😣😥😮🙄😏😕😯😪😫😴😌🤑😉😋😎😍😘😚😛😜😝😒😓😔😲😷🤒😇🤓🤗🤕🙁😖😞😟😤😢😭😦😧😨😩😬😰😳😵😡😠☝✌🖕👎🙏🤘👏💪💋☘🍀🌸☕🍵🍺🍻🍦🍬🍚🍜🍲🍖🎂💤"
  clipboard:
    type: CLIPBOARD
    name: 剪贴
  history:
    name: 最近
    type: HISTORY

如何打开关闭liquidKeyboard呢? 在默认键盘布局中,已经设计了开关,点击符号键盘-更多即可打开,点击“候选栏”上的返回即可退出。也可以自行设计按键,直接打开指定的tab。


  # 使用如下形式的按键,打开liquidKeyboard的指定标签页。
  K_symbols40: {label: 🙂, send: function, command: liquid_keyboard, option: "emoji"}
  K_symbols50: {label: 剪贴, send: function, command: liquid_keyboard, option: "剪贴"}
  K_symbols60: {label: 更多, send: function, command: liquid_keyboard, option: "9"}

  #退出liquidkeyboard
  liquid_keyboard_exit: {label: 返回, send: function, command: liquid_keyboard, option: "-1"} 

padding和左右手模式、横屏模式

(在3.2.3之后的版本中)为了避免竖屏误触全面屏手势、导航栏,横屏键盘被拉伸极宽、键盘异常丑陋,竖屏曲面屏误触左右两侧按键,增加了键盘整体布局的一系列padding参数。包含:

keyboard_padding: 0 #竖屏模式下,屏幕左右两侧与键盘的距离(曲面屏减少误触)
keyboard_padding_left: 0 #竖屏屏模式下,左手键盘布局,屏幕左侧与键盘的距离
keyboard_padding_right: 40 #竖屏屏模式下,左手键盘布局,屏幕右侧与键盘的距离
keyboard_padding_bottom: 0 #竖屏模式下,屏幕下边缘与键盘的距离(避免误触发全面屏手势)
keyboard_padding_land: 40 #横屏模式下,屏幕左右两侧与键盘的距离(避免横屏按键过度拉伸变形)
keyboard_padding_land_bottom: 0 #横屏模式下,屏幕下侧与键盘的距离

从注释中可以看到,在竖屏模式下,还能通过padding参数设置左右手键盘。主题可以通过设置如下一组开关,快速切换普通,左手,右手三种布局。

one_hand_switch_1: {toggle: _one_hand_mode_1, send: Mode_switch, states: [ 左手, 普通 ]}
one_hand_switch_2: {toggle: _one_hand_mode_2, send: Mode_switch, states: [ 右手, 普通 ]}
one_hand_switch_3: {toggle: _one_hand_mode_3, send: Mode_switch, states: [ 左手, 右手 ]}

键盘高度

在较早的版本中,每个键盘都独立计算键盘高度。当不同键盘高度不一致时,不止产生键盘高度的变化,还会导致屏幕刷新造成的屏幕闪烁。

(在3.2.5后的版本中) 在皮肤中增加键盘高度参数,方便快速调整整个键盘的高度,同时解决了闪烁的问题。增加了如下参数:

style:
  keyboard_height: 250 #锁定键盘高度,避免切换时键盘高度变化而造成闪烁
  keyboard_height_land: 200 #锁定横屏下键盘高度,避免切换时键盘高度变化而造成闪烁

preset_keyboards:
  keyboard_name:
    auto_height_index: 0 #哪一行吸收缩放后的余数

针对liquidKeyboard,增加了每屏显示的按键行数的参数。

liquid_keyboard:
  row: 6              #每屏最多显示多少行按键
  row_land: 5         #横屏每屏最多显示多少行按键

新的键盘尺寸计算方式如下:

  1. default键盘的高度 = 其他键盘的高度 = liquidKeyboard键盘高度 = keyboard_heightkeyboard_height_land的dp值(float,允许小数)转换为px
  2. 当键盘高度与keyboard_height不一致时,每行按键等比例缩放按键高度高度(padding不参与运算);
  3. 由于高度只能取整数,行之间的间距向上取整数 ,按键高度遵循四舍五入,如存在余数,由 auto_height_index 指定的行吸收 。第一行即0,第二行为1,以此类推;特别的,当值为负数时,为倒序序号(-1即倒数第一个);当值大于按键行数时,为最后一行。
  4. liquidKeyboard的计算方式相对简易, 按键高度 + 行之间的间距 = 键盘高度 / rowrow_land ,取整方式参见上一条。

(编辑中...