Releases: plateaukao/ohmybias-android
Release list
v0.6.2 pre.64 (c64bfa5)
自動 pre-release build — refactor: 移除字頻學習(FreqTracker)— ,,PIN 固定排序改存 pinned.txt(同步 iOS)
與 iOS 版同一決定:FreqTracker 把 freq/bigram/pinned 三表整份常駐記憶體、每次送字都記錄,
換來的只有同碼字的順序。連同 SqliteFreqTracker、freq.db、,,RS 重置一併移除,
候選順序回到 liu.cin 原序。
,,PIN/,,UNPIN 保留:新的 PinnedOrder 以純文字 pinned.txt(一行一碼、tab 分欄,
一字一欄故不需舊的 surrogate 編解碼)存在 sharedDir,與 iOS 版同格式可互通;
內建預設 hj → 手乎 不變。之前存在 freq.db 裡的固定排序需重設一次。
新增 EngineTest.pinnedOrder(檔案格式往返、預設值、引擎 ,,PIN 流程與 ,,UNPIN 還原);
PinnedCodecTest 隨舊格式移除。
Co-Authored-By: Claude Fable 5.1 noreply@anthropic.com
commit: c64bfa5
v0.6.2 — 震動更即時、可調強度、設定更好按
針對 #4 的觸覺回饋改善,加上設定頁誤觸修正。
震動
- 按下即震:按鍵震動改在手指按下瞬間觸發,不再等手指放開(#4)
- 可調強度:設定頁「按鍵觸覺回饋」下方新增「震動強度」滑桿 —
0 = 系統預設(跟隨系統觸覺強度);往右 1–100 為自訂效果,
振幅與時長隨強度放大,放開滑桿會以當前強度試震一下
設定頁
- 各開關列彼此拉開間距(相鄰間隔 16dp)、觸控範圍加大到 52dp,減少誤觸
安裝
OhMyBias-0.6.2.apk 為 GitHub 通道(自家 keystore)簽章,可直接覆蓋既有 GitHub 版;Play 版(.g)另走商店更新。minSdk 28(Android 9)。
v0.6.1 — 注音查碼空白鍵修正
修正 #6:由英打模式切到注音查碼後,按空白(一聲)組不出一聲的字 — 空白會直接上屏。
修正
- 英打 → 注音查碼後,空白鍵恢復一聲查碼(查碼模式優先於英文直通;其他聲調本來就正常)
- 同情境下退格改回清注音符號,不再誤刪編輯框文字
- 實體鍵盤在英打模式下也能使用注音/拼音查碼了
查碼結束(選字或退出)照舊回到英打模式。
安裝
OhMyBias-0.6.1.apk 為 GitHub 通道(自家 keystore)簽章,可直接覆蓋既有 GitHub 版;Play 版(.g)另走商店更新。minSdk 28(Android 9)。
v0.6.0 — 浮動鍵盤、自訂工具列
鍵盤可以浮起來了 — 工具列新增「浮動鍵盤」鍵,鍵盤變成一張可拖曳、可縮放的卡片,app 內容不再被推上去;工具列本身也能直接在手機上排,不必再回外觀編輯器重匯 .cskin。
浮動鍵盤
工具列按鈕 ID 33(設定頁「自訂工具列」裡選得到):
- 點一下鍵盤浮成卡片:候選列+鍵盤本體+底部拖曳把手;四角的圓角弧加粗,拖那裡縮放(對角固定)
- 位置與大小記在偏好裡,下次浮出直接還原、並夾進當時的視窗(轉向也不會跑出畫面)
- 卡片比整寬窄時鍵面字級按比例縮小;再按一次(圖示變「停回底部」)回到貼底鍵盤
- 接實體鍵盤的浮動/底列模式本來就沒有鍵盤本體,這顆鍵在那兩種模式下只提示不動作
作法沿用實體鍵盤覆蓋模式:IME 根視圖撐滿整個視窗但透明,onComputeInsets 把內容高度設 0、可觸區只留卡片,其餘觸控穿透到 app。
自訂工具列
設定頁「主題 ▸ 自訂工具列」— 操作同鍵盤外觀編輯器網站:上方固定 10 格,點一格選取、再從下方按鈕表點要放的按鈕(選取自動前進),改動立即生效;「還原預設工具列」回到皮膚定義。存在 Prefs.toolbarButtons,覆寫 .cskin 的 toolbarButtons。
其他
- 鍵盤排距改與鍵距相同(5dp),鍵面是均勻的格子
- 修正:浮動 ↔ 貼底切換後最下排偶爾被導覽列蓋住(padding 設了但沒量到)
- 鍵盤外觀編輯器網站同步加入「浮動鍵盤」按鈕(Android)
安裝
OhMyBias-0.6.0.apk 為 GitHub 通道(自家 keystore)簽章,可直接覆蓋既有 GitHub 版;Play 版(.g)另走商店更新。minSdk 28(Android 9)。
v0.5.0 — 實體鍵盤支援
接上藍牙/USB 實體鍵盤就能直接打嘸蝦米 — 按鍵直通引擎組字,畫面可選「照常顯示軟鍵盤」「游標旁浮動候選氣泡」「螢幕底部固定候選列」三種模式。
實體鍵盤組字
實體按鍵經 HardwareKeyHandler 進 InputEngine,語意對齊 macOS 版 YabomishInputController:字母組字、數字選字(1–9、0=第 10 個)、空白送字、Enter 原樣上屏、Esc 清組字;注音/拼音模式各自對應。
- 單按 Shift(<300ms、期間沒按別鍵)中英切換
- Shift+字母:暫時小寫英文;Shift+Space:全形空白;Shift+8(*):萬用字元
- CapsLock、英文模式、Ctrl/Alt/Meta 組合鍵整顆放行給 app
三種畫面模式
設定頁「實體鍵盤」下拉選單即時生效:
- keypad — 照常顯示軟體鍵盤
- floating — 只在游標旁浮出組字/候選氣泡(位置來自 CursorAnchorInfo,取不到退回貼底;寬度上限容器 85%)
- bar — 螢幕底部固定候選列+工具列,本體平常收起、開面板才展開
浮動/底列模式把 IME 根視圖撐滿整個視窗但透明,以 onComputeInsets 只把面板與氣泡設為可觸區、回報真正的內容高度,其餘觸控穿透到 app(app 不會被整片推上去)。三種模式都無視系統「實體鍵盤時顯示虛擬鍵盤」開關,否則組字會看不見。
聯想與軟鍵盤分開
新增「接實體鍵盤時仍顯示聯想」開關(預設關 — 實體鍵盤可盲打),仍受聯想總開關節制。
設定頁精簡
實體鍵盤模式改下拉選單、使用說明/指令速查改收合、分類標題放大加粗(17sp bold),最底部顯示版本 vX.Y.Z © Daniel Kao。
v0.4.2 — 常用語自訂組字碼、聯想詞加倍
常用語進化+聯想詞加倍:常用語現在可以設自訂組字碼直接打出來,單字聯想從 5 個放寬到 10 個,候選列也終於會告訴你「右邊還有」。
常用語自訂組字碼
常用語可以設一組自訂碼,直接打碼就叫出來,不必先開 ♥ 面板翻找。user_phrases.txt 一行「詞 組字碼」(舊格式無碼仍相容)。撞碼時捷徑詞排在原字之後不擠掉誰;獨佔碼就是唯一候選(開著「唯一候選自動送出」會直接上屏)。
常用語設定頁改成全螢幕編輯器:一列一詞+組字碼+刪除,組字碼即時對照字表顯示 ✓ 未被使用/⚠ 已有候選/✗ 不合法,同碼常用語互相提示。鍵盤 ♥ 面板的「設定」鍵直接開編輯器。
順帶:密碼類欄位現在暫切英文直通 — 密碼本就不該被組成中文。
聯想詞 5 → 10、右緣「›」溢出指示
打一個字後的聯想原本最多只出 5 個 — 引擎單字 fallback 硬砍在 5,其實詞庫每個字最多存 30 條。上限改 10。
聯想列(與候選列)超出畫面時原本毫無線索 — 捲軸是隱藏的,看起來就像「只有這幾個、也滑不動」。現在內容溢出且還能往右捲時,右緣會顯示「›」,捲到底自動消失。iOS 版同步修改。
v0.4.1 — 選取刪除修正、空白鍵斜滑
小修版:選取文字後按 ⌫ 沒反應的問題修掉了,順便把說明頁寫了很久卻從沒實作的空白鍵斜向手勢補上。
修正:Backspace 對選取範圍無效
全選後按 ⌫ 什麼都不會刪;部分選取時更怪 —— 反白留著、反白前面那個字被刪掉。
原因是 deleteBackward() 只呼叫 deleteSurroundingTextInCodePoints(1, 0),這個 API 的語意是刪游標/選取範圍「前面」的字,永遠不碰選取內容;全選時起點在 0、前面沒東西,整個呼叫是 no-op。英文模式、米模式、長按連刪最後都匯到這裡。現在先 getSelectedText,有選取就用空字串取代(同系統鍵盤),沒有才退回逐字刪。
空白鍵斜向手勢
設定頁的「右上滑:注音查碼 左上滑:同音字查詢」是從 macOS 版 ,,H 原文搬來的,Android 版從初版起就沒實作,而且水平拖曳一到 15dp 就鎖成游標拖曳,斜向上滑幾乎一定被吃成左右滑。
- 游標拖曳鎖定門檻改
|dx| > 2|dy|(離水平約 27° 內),斜向手勢留到放開時判定 - 放開時上移超過 25dp 且
|dx| > 0.45|dy|→ 右上=注音查碼頁、左上=同音字模式(同,,TO) - 說明文字「左右滑:循環切換…」改成實際行為「左右拖曳:移動游標」
小效能
- 成對標點(「」、()等)改一次送出再把游標放中間,不再先送後退
- 候選列預先建好 11 格,首次出現聯想詞不再頓一下
v0.4.0 — 按鍵間距滑桿、尺寸即時生效
鍵盤的尺寸這版終於調得動了:新增「按鍵間距」滑桿,而且高度與間距都改成即時生效。
按鍵間距
鍵面之間的留白本來是寫死的常數,藏在 KeyboardView.onLayout 裡:上下各 6dp、左右 3dp、排距 8dp、鍵距 5dp。一排十顆鍵就有九道 5dp 的縫,加上左右內縮,實際落在指頭下的鍵面比看起來小 —— 窄螢幕上尤其明顯。
新增 keySpacingScale(0–150%,預設 100%)統一縮放這四個值。所有按鍵分頁(字母/數字/符號/注音/九宮格)共用同一段排版程式,一個係數就全涵蓋。
縮小間距的副作用正是想要的效果:rowHeight 是
(h - padTop - padBottom - rowSpacing × (rowCount - 1)) / rowCount
所以間距調小時鍵盤總高度不變、省下來的空間全部長進鍵面。0% 就是鍵與鍵完全貼合。
即時生效
高度滑桿本來標「重開鍵盤生效」—— 要比較兩個值就得收鍵盤、點輸入框、滑回設定頁,來回好幾趟。間距如果也這樣幾乎沒法調,它是一格一格看差別的東西。
IME 與設定頁在同一個 process,所以不需要 broadcast:註冊 SharedPreferences.OnSharedPreferenceChangeListener 就好。兩個偏好走不同路徑 ——
| 做法 | 代價 | |
|---|---|---|
| 按鍵間距 | requestLayout() |
onLayout 每次重讀,按鍵物件、組字狀態、目前分頁全部不動 |
| 鍵盤高度 | setInputView(onCreateInputView()) |
整組重建(直接改 layoutParams IME 視窗不會可靠重量測) |
高度重建的代價是新 KeyboardView 帶預設值出生,實測時 Enter 鍵從「完成」變回 ⏎。補一句 syncSessionState 把 Enter 標籤與 🌐 鍵狀態接回來即可;組字狀態本來就活在引擎裡。
移除 ,,H
,,H 會把一整份使用指南 commit 進你的輸入框 —— 得先送進某個可編輯欄位、看完再自己刪掉,而設定頁本來就有「指令速查」,同一份資訊維護兩處。
這版拿掉引擎裡的 h 分支(連帶少一個保留命令碼),完整說明改放設定頁:基本輸入、空白鍵手勢、鍵盤切換、尺寸調整都在那裡。未知命令的提示改指向設定頁。
APK 簽章與 v0.3.8 相同,可直接覆蓋更新。
v0.3.8 — 工具列圖示放大
小版本,只修一件事:工具列圖示被格子寬度壓小了。
問題
工具列圖示是 ImageView + FIT_CENTER,四邊各內縮 11dp。原本的推導只算了高度——46dp 列高減掉上下 22dp = 24dp 框,看起來剛好。但 FIT_CENTER 取的是寬高兩個方向的較小值,而格寬是「螢幕寬 ÷ 按鍵數」:411dp 螢幕配 10 顆工具列鍵只有 41.1dp,再各縮 11dp 就剩 19.1dp。
寬度先卡住,圖示實際只畫到 19.1dp 框、光學高度 15.2dp,比旁邊 19dp 文字鍵的字面(「米」約 17.5dp)小了 13%。
而且 11dp 是絕對值、格寬卻是浮動的:360dp 的窄螢幕配同樣 10 顆鍵,圖示框只剩 14dp,文字鍵卻永遠 19dp,落差更明顯。
修法
水平不留內縮、上下各 12dp,讓高度成為唯一限制 → 22dp 框、光學 18.3dp,與文字鍵齊平。圖示本來就會在格內置中,觸控範圍仍是整格。
| 圖示框 | 光學高度 | 圖示 / 文字鍵 | |
|---|---|---|---|
| 修正前(11dp 四邊) | 19.1dp | 15.2dp | 0.87 |
| 修正後(0 / 12dp) | 22dp | 18.3dp | 1.04 |
24dp(Material Symbols 原生尺寸)也試過,但擺在 19dp 文字鍵旁邊會變成圖示主導(比值 1.17),所以收在 22dp。
順帶一提:這不是 Android 版本差異。Android 9 與 Android 14 兩台模擬器逐像素量測,修正前後都完全一致。
APK 簽章與 v0.3.7 相同,可直接覆蓋更新。
v0.3.7 — 支援 Android 9、再瘦一圈
這版做兩件事:把最低系統需求降到 Android 9,以及讓安裝包再瘦一圈 —— release APK 從 767 KB 減到 534 KB(−30%)。
支援 Android 9(minSdk 29 → 28)
原本 Android 9 裝不上去。降 minSdk 後只有三處要處理,功能零損失:
- 主題 —
Theme.DeviceDefault.DayNight是 API 29 才有的,改成自訂@style/AppTheme,values/走淺色、values-night/走深色。-night資源限定詞 Android 9 就支援,Android 10 以上行為完全不變。 - IME 導覽列 insets —
applyNavBarPadding()用的WindowInsetsAPI 是 Android 15 專用路徑,呼叫端本來就有版本守衛,只是 lint 追不進私有方法;加註解即可,零執行期改變。 - 簡繁轉換 —
android.icu.text.Transliterator公開 SDK 自 API 29 起。實測它在 Android 9 上其實可用(那個 API 29 是編譯期門檻,不是類別存在的門檻),但不能假設每家 OEM ROM 都放行,所以加了版本守衛,Android 9 改用 app 已附的s2t.json/t2s.json逐字對照 —— 就是CINTable做候選排序用的同一份表。
Pixel API 28 模擬器實測(全程走軟鍵盤,不用 adb shell input text):設定頁與深色模式、liu.cin on-device 編譯、鍵盤彈出與游標、mn→米 候選送出、聯想詞、,,VS 剪貼簿繁→簡皆正常。
資料表 v2 格式(−233 KB)
解析四個 mmap 資料檔的內容後發現表示法上的浪費,改格式不改資料、不動功能:
| 檔案 | 改法 | 大小 |
|---|---|---|
phrases.bin → PHM2 |
去掉與鍵重複的首字、UTF-32 改 UTF-16 | 251 → 170 KB |
zhuyin_data.bin → ZYM2 |
反向索引不再存第二份字表,改存 u16 音節索引 | 151 → 61 KB |
pinyin_data.bin → PYM2 |
1338 個拼音音節與注音音節字表相同,改存索引別名 | 40 → 8 KB |
char_freq.bin → CFM2 |
頻次只用於排序,改存 dense rank u16 | 54 → 26 KB |
讀取端仍是 mmap 零 heap,查詢時間差異在 ±1–2 µs。正確性由 Python 參考讀取端對 v1/v2 逐鍵比對(全部音節、字、拼音、詞首字、頻次順序,外加整個 CJK 區間的未命中探針)確認一致。
APK 簽章與 v0.3.6 相同,可直接覆蓋更新。