Google原生输入法LatinIME词库构建流程分析--相关数据结构分析

ADB命令深度解析:Android输入法程序化控制与自动化实战 在Android开发与自动化测试领域,程序化控制设备是提升效率的关键。Android Debug Bridge(ADB)作为官方命令行工具,提供了与设备深度交互的能力,其核心原理在于通过客户端-服务器架构,在设备Shell中执行命令并与系统服务通信。其中,对输入法框架(Input Method Framework)的控制具有重要技术价值,它能实现输入法的查询、切换、启用/禁用以及文本注入,从而确保测试环境的纯净与自动化流程的稳定。这一能力在UI自动化测试、批量数据填充、设备故障应急处理等场景中尤为实用。例如 阅读详情

其实输入法词库相关数据结构的定义基本上都在头文件dictdef.h文件中,进入到代码目录cpp下.

初始化字库,首先读取txt文件内容到数据结构lemma_arr和valid_hzs中,lemma_arr是一个数组类型为LemmaEntry,下面来看下LemmaEntry定义(cpp/include/dictdef.h):

//rawdict_utf16_65105_freq.txt每一行是一个LemmaEntry实体
//在记录拼音的时候,它默认将拼音字母转成大写,仅对双声母中的h使用小写。 这里指的是pinyin_str
struct LemmaEntry {
  LemmaIdType idx_by_py;
  LemmaIdType idx_by_hz;
  char16 hanzi_str[kMaxLemmaSize + 1];

  // The SingleCharItem id for each Hanzi.
  uint16 hanzi_scis_ids[kMaxLemmaSize];

  uint16 spl_idx_arr[kMaxLemmaSize + 1];
  char pinyin_str[kMaxLemmaSize][kMaxPinyinSize + 1];
  unsigned char hz_str_len;
  float freq;
};

首先来看下rawdict_utf16_65105_freq.txt文件内容:

鼥 0.750684002197 1 ba
釛 0.781224156844 1 ba
軷 0.9691786136 1 ba
釟 0.9691786136 1 ba
蚆 1.15534975655 1 ba
。。。。。。

可以看到该文件行数为65105,每一行的格式都是:汉字  频率  ?  拼音,结构体中的freq就是频率,hz_str_len就是汉字的长度,二维数组pinyin_str[8][7]用来存放拼音,限制最长汉字串长度为8,单个汉字拼音长度限定为7,hanzi_str[8+1]是用来存放汉字的一种unicode编码,如第一个字“鼥”的编码就是:40741,可以在这里转换,在gdb中查看lemma_arr_第一个元素如下:

{idx_by_py = 0, idx_by_hz = 0, hanzi_str =     {40741,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0}, hanzi_scis_ids =     {0,
    0,
    0,
    0,
    0,
    0,
    0,
    0}, spl_idx_arr =     {0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0}, pinyin_str =     {      "BA\000\000\000\000",
          "\000\000\000\000\000\000",
          "\000\000\000\000\000\000",
          "\000\000\000\000\000\000",
          "\000\000\000\000\000\000",
          "\000\000\000\000\000\000",
          "\000\000\000\000\000\000",
          "\000\000\000\000\000\000"}, hz_str_len = 1 '\001', freq = 0.750684023}

拼音都被转换成了大写,但是双声母中的h除外。hanzi_scis_ids字段对应的是该lemma每个汉字在单个汉字表scis中对应的id,比如:第一行的“鼥”字在单字表scis中对应的id就被赋值给了hanzi_scis_ids的第一个元素即hanzi_scis_ids[0]位置,最后一行为“欧洲市场”,那么该字段对应的数组中依次存放“欧” “洲” “市” “场”所对应的id,假如“欧” “洲” “市” “场”分别对应id为34、46、29、200,那么hanzi_scis_ids[0] = 34、hanzi_scis_ids[1] = 46、hanzi_scis_ids[2] = 29、hanzi_scis_ids[3] = 200,其余值仍为初始值0,spl_idx_arr字段描述了每个LemmaEntry中每个汉字字音的id,在gdb中跳过50000次执行后正好跳到“叫声”这个词组,打印看到lemma_arr_中的结构:

(gdb) p lemma_arr_[8117]
$31 = {idx_by_py = 0, idx_by_hz = 0, hanzi_str = {21483, 0, 0, 0, 0, 0, 0, 0, 0}, hanzi_scis_ids = {0, 0, 0, 0, 0, 0, 0, 0}, spl_idx_arr = {166, 0, 0, 0, 0, 0, 0, 0, 0}, pinyin_str = {"JIAO\000\000", 
    "\000\000\000\000\000\000", "\000\000\000\000\000\000", "\000\000\000\000\000\000", "\000\000\000\000\000\000", "\000\000\000\000\000\000", "\000\000\000\000\000\000", "\000\000\000\000\000\000"}, 
  hz_str_len = 1 '\001', freq = 55685.8672}
(gdb) p lemma_arr_[12781]
$32 = {idx_by_py = 0, idx_by_hz = 0, hanzi_str = {22768, 0, 0, 0, 0, 0, 0, 0, 0}, hanzi_scis_ids = {0, 0, 0, 0, 0, 0, 0, 0}, spl_idx_arr = {337, 0, 0, 0, 0, 0, 0, 0, 0}, pinyin_str = {"ShENG\000", 
    "\000\000\000\000\000\000", "\000\000\000\000\000\000", "\000\000\000\000\000\000", "\000\000\000\000\000\000", "\000\000\000\000\000\000", "\000\000\000\000\000\000", "\000\000\000\000\000\000"}, 
  hz_str_len = 1 '\001', freq = 7169.11719}
(gdb) p lemma_arr_[i-1]
$33 = {idx_by_py = 0, idx_by_hz = 0, hanzi_str = {21483, 22768, 0, 0, 0, 0, 0, 0, 0}, hanzi_scis_ids = {0, 0, 0, 0, 0, 0, 0, 0}, spl_idx_arr = {166, 337, 0, 0, 0, 0, 0, 0, 0}, pinyin_str = {
    "JIAO\000\000", "ShENG\000", "\000\000\000\000\000\000", "\000\000\000\000\000\000", "\000\000\000\000\000\000", "\000\000\000\000\000\000", "\000\000\000\000\000\000", "\000\000\000\000\000\000"}, 
  hz_str_len = 2 '\002', freq = 564.171448}
(gdb) p i
$34 = 33619
(gdb) 

8117为“叫”这个字在lemma_arr_中的存储,12781为“声”这个字的lemma_arr_存储,i-1 = 33618,可以看到lemma_arr[33618]处“叫声”的idx_by_hz和spl_idx_arr就是其单个字的组合而来,同时还可以看到双声母“ShENG”中的h被设置为了小写。idx_by_py和idx_by_hz字段分别表示该lemma通过汉字id数组和拼音id数组计算出来的lemma的id。

        前面提到过,LemmaEntry字段hanzi_scis_ids字段表示lemma(称之为汉字串吧)中每个汉字在单汉字表中的id,单汉字表scis也是一个数组,其类型为SingleCharItem的结构体(cpp/include/dictdef.h):

#ifdef ___BUILD_MODEL___
struct SingleCharItem {
  float freq;
  char16 hz;
  SpellingId splid;
};

字段splid对应了单个汉字的拼音id,hz即汉字的描述,freq字段描述该单个汉字的频率,具体代码在dictbuilder.cpp中

size_t hz_num = lemma_arr_[pos].hz_str_len;
...
if (1 == hz_num)
        scis_[scis_num_].freq = lemma_arr_[pos].freq;
      else
        scis_[scis_num_].freq = 0.000001;

汉字num为1也就是lemma只有一个汉字,否则freq设置为0.000001。再来看splid类型为SpellingId,这也是一个结构体:

typedef struct {
  uint16 half_splid:5;
  uint16 full_splid:11;
} SpellingId, *PSpellingId;

此结构体定义的half_splid和full_splid使用了位字段进行定义,即half_splid可以存储的无符号short类数不大于31(最大为11111),而full_splid可以存储最大无符号short类形数(大于31)小于2的0次方累加到2的11次方(具体多少自己算吧)。

        接下来看与构建字典树相关的数据结构,一个是LmaNodeLE0,另一个是LmaNodeGE1,它们分别代表层数小于等于0上的节点和层数大于1上的节点,先来看LmaNodeLE0的定义(cpp/include/dictdef.h):

/**
 * We use different node types for different layers
 * Statistical data of the building result for a testing dictionary:
 *                              root,   level 0,   level 1,   level 2,   level 3
 * max son num of one node:     406        280         41          2          -
 * max homo num of one node:      0         90         23          2          2
 * total node num of a layer:     1        406      31766      13516        993
 * total homo num of a layer:     9       5674      44609      12667        995
 *
 * The node number for root and level 0 won't be larger than 500
 * According to the information above, two kinds of nodes can be used; one for
 * root and level 0, the other for these layers deeper than 0.
 *
 * LE = less and equal,
 * A node occupies 16 bytes. so, totallly less than 16 * 500 = 8K
 */
struct LmaNodeLE0 {
  uint32 son_1st_off;
  uint32 homo_idx_buf_off;
  uint16 spl_idx;
  uint16 num_of_son;
  uint16 num_of_homo;
};

/**
 * GE = great and equal
 * A node occupies 8 bytes.
 */
struct LmaNodeGE1 {
  uint16 son_1st_off_l;        // Low bits of the son_1st_off
  uint16 homo_idx_buf_off_l;   // Low bits of the homo_idx_buf_off_1
  uint16 spl_idx;
  unsigned char num_of_son;            // number of son nodes
  unsigned char num_of_homo;           // number of homo words
  unsigned char son_1st_off_h;         // high bits of the son_1st_off
  unsigned char homo_idx_buf_off_h;    // high bits of the homo_idx_buf_off
};

        结构体LmaNodeGE0和LmaNodeGE1结构体主要在dictbuilder::construct_subset(...)方法中调用,从buidl_dict方法调用时传入的item_start=0, item_end=65101,就是rawdict_utf16_65101_freq.txt文件第一行到最后一行,也就是遍历lemma_arr_这个数组生成分层的trie树,在方法construtc_subset中递归调用自己为level0和level1层上添加节点,这块具体结构形式还没弄太明白,等以后明白了再详细描述这两个结构体吧。

 

 

 

// Node used for the trie of spellings
struct SpellingNode {
  SpellingNode *first_son;
  // The spelling id for each node. If you need more bits to store
  // spelling id, please adjust this structure.
  uint16 spelling_idx:11;
  uint16  num_of_son:5;
  char char_this_node;
  unsigned char score;
};

结构体SpellingNode用来描述拼音字典树的每个节点,此结构体定义在cpp/include/spellingtrie.h中,*first_son是一个指向儿子节点类型为SpellingNode的指针数组首地址,spellingtrie.cpp的construct方法中构建的音节树的每个节点都是此类型,root_节点的first_son指针指向level1_sons的首元素地址,num_of_son采用位字段来定义,说明它可以存放不大于2的5次方的整数,该字段用来描述以此char_this_node描述的char可以组成的音节数量,如:当char_this_node 为 ‘A‘时,它的儿子节点数为3,分别是ai an ao。字段score即此char的得分,score越小搜索优先级越高,root_节点的score=0,位字段spelling_idx描述每个可组成音节的字母在列表中的id:

{first_son = 0x617420, spelling_idx = 1, num_of_son = 3, char_this_node = 65 'A', score = 86 'V'},
  {first_son = 0x617480, spelling_idx = 2, num_of_son = 5, char_this_node = 66 'B', score = 57 '9'},
  {first_son = 0x617620, spelling_idx = 3, num_of_son = 6, char_this_node = 67 'C', score = 72 'H'},
  {first_son = 0x6179e0, spelling_idx = 5, num_of_son = 5, char_this_node = 68 'D', score = 46 '.'},
  {first_son = 0x617c50, spelling_idx = 6, num_of_son = 3, char_this_node = 69 'E', score = 79 'O'},
  {first_son = 0x617cb0, spelling_idx = 7, num_of_son = 5, char_this_node = 70 'F', score = 72 'H'},
  {first_son = 0x617e00, spelling_idx = 8, num_of_son = 4, char_this_node = 71 'G', score = 62 '>'},
  {first_son = 0x617ff0, spelling_idx = 9, num_of_son = 4, char_this_node = 72 'H', score = 64 '@'},
  {first_son = 0x6181e0, spelling_idx = 11, num_of_son = 2, char_this_node = 74 'J', score = 59 ';'},
  {first_son = 0x618380, spelling_idx = 12, num_of_son = 4, char_this_node = 75 'K', score = 70 'F'},
  {first_son = 0x618570, spelling_idx = 13, num_of_son = 6, char_this_node = 76 'L', score = 62 '>'},
  {first_son = 0x618810, spelling_idx = 14, num_of_son = 5, char_this_node = 77 'M', score = 68 'D'},
  {first_son = 0x6189e0, spelling_idx = 15, num_of_son = 6, char_this_node = 78 'N', score = 66 'B'},
  {first_son = 0x618c70, spelling_idx = 16, num_of_son = 1, char_this_node = 79 'O', score = 109 'm'},
  {first_son = 0x618c90, spelling_idx = 17, num_of_son = 5, char_this_node = 80 'P', score = 90 'Z'},
  {first_son = 0x618e50, spelling_idx = 18, num_of_son = 2, char_this_node = 81 'Q', score = 66 'B'},
  {first_son = 0x626ff0, spelling_idx = 19, num_of_son = 5, char_this_node = 82 'R', score = 65 'A'},
  {first_son = 0x6271a0, spelling_idx = 20, num_of_son = 6, char_this_node = 83 'S', score = 46 '.'},
  {first_son = 0x627540, spelling_idx = 22, num_of_son = 5, char_this_node = 84 'T', score = 70 'F'},
  {first_son = 0x6277a0, spelling_idx = 25, num_of_son = 4, char_this_node = 87 'W', score = 61 '='},
  {first_son = 0x627890, spelling_idx = 26, num_of_son = 2, char_this_node = 88 'X', score = 68 'D'},
  {first_son = 0x627a30, spelling_idx = 27, num_of_son = 5, char_this_node = 89 'Y', score = 51 '3'},
  {first_son = 0x627bd0, spelling_idx = 28, num_of_son = 6, char_this_node = 90 'Z', score = 61 '='}

但是该字段为11位,也就是说它可以存放不大于2的11次方的整数(2048)。

 

 

 

android pinyinime源码,android PinyinIME 带注释 【实例简介】android PinyinIME 拼音输入法带注释,可进行二次开发【实例截图】【核心代码】bb87589c-158d-452b-a34c-544b74504822└── PinyinIme├── AndroidManifest.xml├── gen│ └── com│ └── keanbin│ └── pinyinime│ ... 阅读详情

相关推荐

web-pinyin-ime:在线拼音输入法

网络拼音动画 在线拼音输入法 在线演示 如果要构建并部署到您自己的服务器,请将package.json "homepage": "https://dongyuwei.github.io/web-pinyin-ime/"更改为"/"或您的域/子域。 拼音字典来源 您可以通过以下链接下载Android PinyinIME: //android.googlesource 它已获得Apache许可证2.0版的许可,请参阅: : rawdict_utf16_65105_freq.txt和NOTICE包含在./ime/src/script目录中。 拼音字典的过程: 将文件转换为UTF-8编码: iconv -f UTF-16 -t UTF-8 rawdict_utf16_65105_freq.txt > google_pinyin_rawdict_utf8_65105_freq.txt

安卓源码--]Latin输入法怎么默认勾选几种语言

[SOLUTION] 【GB】 提供简单的sample code,如默认将俄语、英文、法语输入法勾选: 1.新增文件LatinImeReceiver.java package com.android.inputmethod.latin; import android.content.BroadcastReceiver; import android.content.Context;

Github: lianghuiyong 1696

qt-使用qt开发的虚拟键盘-项目源码.zip

qt qt_使用qt开发的虚拟键盘_项目源码

Google原生输入法LatinIME词库扩容(Windows10环境)

去年在Linux(ubuntu)环境下针对LatinIME进行词库扩容处理,针对LatinIME的词库构建进行了一些列分析,大家可以查阅历史文章。词库扩容最近试了一下是可以的,具体流程大致如下(windows10环境): 1、安装MinGw以及gcc、g++、gdb等,下载地址:e795, 安装完成配置环境变量到path(..\mingw\bin) 2、进入到..\cpp\command目录进行make windows下没有make命令的,需要到MinGw\bin目录下重命名mingw32-mak

camel@Y blog 2385

android google 拼音输入法源码

android google 拼音输入法源码

LatinIME:这是从Android 4.4源代码中单独分离出来的输入法代码

拉丁IME 这是从Android 4.4源代码中单独分离出来的输入法代码

Google原生输入法LatinIME词库构建流程分析(一)

进入到cpp目录下(pwd=.../cpp/),在command目录中有个pinyinime_dictbuilder.cpp文件,源码中可以看到main函数,这里就是词库构建的入口,接下来看下main函数源码: 25 /** 26 * Build binary dictionary model. Make sure that ___BUILD_MODEL___ is defined 2...

camel@Y blog 3855

嵌入式开发-Qt框架-C编程-轻量级虚拟键盘-跨平台输入法-中文英文数字符号输入-大小写切换-皮肤主题定制-手写识别功能-开源学习项目-适用于Linux-Windows-And.zip

pycharm嵌入式开发_Qt框架_C编程_轻量级虚拟键盘_跨平台输入法_中文英文数字符号输入_大小写切换_皮肤主题定制_手写识别功能_开源学习项目_适用于Linux_Windows_And.zip

LatinIME输入法分析

<br /><br />输入法的设置在res/xml/method.xml的<input-method>标签中,主要设置两个属性:<br />android:settingsActivity,输入法的设置程序入口。<br />android:isDefault,这个输入法是不是系统的默认输入法。<br /> <br />另外,如果输入法的apk直接push到/system/app/下面的话,算是系统输入法,如果是以第三方程序的方式安装到/data/app/下面的话,算是第三方输入法,两个输入法目前来看,最大

农场老马的专栏 2万+

避坑指南:SAP STO订单里‘发货存储地点’栏位不显示?检查这个关键配置

本文深入解析SAP STO订单中‘发货存储地点’栏位缺失问题的根本原因及解决方案。通过激活库存地点间转储功能、维护库存地点主数据等关键配置步骤,帮助用户快速恢复业务操作。特别适用于MM模块实施顾问和SAP系统管理员处理UB STO相关技术问题。

weixin_30632089的博客 98

Innovus时钟树综合CTS实战:从原理到signoff的完整指南

时钟树综合(CTS)是数字后端实现中保障同步电路时序收敛的核心环节,其本质是在物理层面构建低偏斜、可控延迟的全局时钟分发网络。它基于静态时序分析(STA)原理,通过平衡clock skew、insertion delay、transition time与功耗面积等多维约束,对抗工艺电压温度(PVT)变异带来的时序不确定性。技术价值在于支撑GHz级高频芯片的setup/hold签核,广泛应用于CPU、GPU、AI加速器等复杂SoC的Innovus后端流程。本文聚焦CTS在Innovus工具链中的工程落地,覆盖

weixin_28523493的博客 223

中文输入法浅谈

常见几种中文输入法对比介绍

mart!nhu的博客 8890

Zemax热分析实战:5分钟搞定双胶合透镜温度漂移优化(附操作数详解)

本文详细解析了使用Zemax进行光学系统热分析的全流程,以双胶合透镜为例,重点阐述了如何通过多重结构编辑器模拟温度变化,并利用关键操作数优化系统以抵抗温度漂移。文章提供了从基础设置到高级优化的实战技巧,帮助工程师快速掌握无热化设计方法,确保系统在宽温范围内保持稳定成像性能。

n4o5p6q7r的博客 396

Android AOSP输入法(LatinIME)输入流程二

一、起始: LatinIME字符输入的初始方法是LatinIME类中的onCodeInput方法: // Implementation of {@link KeyboardActionListener}. @Override public void onCodeInput(final int codePoint, final int x, final int y,

dcsff的专栏 9154

EMC测试案例分析——晶振对辐射发射的影响

本文分析了某产品350MHz辐射发射超标问题,发现源头是50MHz晶振的7次谐波通过连接器泄漏。主要原因是:1)防水非导电垫圈形成屏蔽缝隙;2)晶振下方地平面不完整且信号线穿过;3)晶振离接口过近。改进措施包括:完善晶振下方地平面、增大晶振与接口距离、使用导电密封圈等。最终辐射降低10dB以上达标。文章总结了晶振EMC设计要点:保持地平面完整、远离接口、外壳接地、合理布局滤波电路等,并强调防水与屏蔽的协调统一。

u012526819的博客 668

升降机SEW MOVIDRIVE变频器设置

选择PO1 第2,3,9,13 位,点击“SendPA”Start reference,编码器反馈值为0(PI2/3 Actual position=0)提示:传送参考位置前请断开变频器安全24V电源,否则会弹出禁止修改提示框;提示:做这一步时,如果出现电机不能转动,或产生报警不能通过编码器匹配。下载配置的参数,提示:下载参数需要断开变频器的安全24V电源。编码器匹配通过后点击下一步,进入下图画面传送参考位置。1电机不能转动:a可能是由于变频器的安全24V未给。点击2.SEW总线扩展定位,定位块设置。

xdpcxq的专栏 5395

ime输入法android,PinyinIME-source android下pinyin输入法源码 - 下载 - 搜珍网

Android.mkAndroidManifest.xml.git/config.git/description.git/HEAD.git/hooks/applypatch-msg.sample.git/hooks/commit-msg.sample.git/hooks/post-commit.sample.git/hooks/post-receive.sample.git/hooks/post-...

weixin_32829077的博客 463

SQL注入绕过information_schema:实战技法与替代路径详解

SQL注入是Web安全领域的核心漏洞类型,其原理是通过构造恶意SQL语句,干扰应用程序与数据库的正常交互逻辑,从而窃取或篡改数据。在渗透测试与CTF竞赛中,绕过常见防护措施是提升技术能力的关键。当标准的信息收集方式受阻时,例如无法访问information_schema数据库,攻击者需要掌握替代的元数据获取方法。这些技术价值在于模拟真实环境中日益严密的防御体系,锻炼在受限条件下的系统性信息收集思维。典型的应用场景包括存在WAF过滤、权限限制或编码干扰的实战环境。本文将围绕SQL注入这一核心,深入探讨如何利用

weixin_33980459的博客 429

搜狗输入法 linux 源码,ibus-pinyin

ibus-pinyin-1.3.11/ibus-pinyin-1.3.11/missingibus-pinyin-1.3.11/aclocal.m4ibus-pinyin-1.3.11/autogen.shibus-pinyin-1.3.11/setup/ibus-pinyin-1.3.11/setup/Makefile.inibus-pinyin-1.3.11/setup/main.pyibus...

weixin_39929153的博客 1070

Visual Studio Installer下载失败的5种修复方法(含DNS修改/补丁安装)

本文针对Visual Studio Installer下载安装文件失败的问题,提供了从网络层到系统层的深度排查与修复指南。详细介绍了DNS修改、代理配置、防火墙设置、系统服务检查等5种核心修复方法,并包含离线安装与手动补丁等替代方案,帮助开发者彻底解决安装难题。

sprite的博客 1614

AI Agent Harness实时监控大屏搭建实战

本文将以目前主流的AI Agent管控框架Harness为基础,结合React、ECharts、WebSocket技术,手把手带你搭建一套完整的实时监控大屏,覆盖全局概览、状态分布、工具调用统计、异常告警、实时日志等核心功能,不需要复杂的底层开发,复制代码就能快速跑通。本文我们从需求出发,先梳理了AI Agent的核心监控指标,然后搭建了监控大屏的静态布局,逐个实现了各个图表,对接了Harness的实时数据源,最后加了交互和告警功能,完整走了一遍监控大屏从设计到落地的全流程。

大数据洞察的博客 172

【亲测免费】 探索开源输入法:GitCode上的LatinIME项目

探索开源输入法:GitCode上的LatinIME项目 如果您正在寻找一个可靠的、开源的输入法以供个人或商业使用,那么您可能已经发现了拉丁IME(LatinIME)项目。这个项目是Android系统的一部分,并且可以在GitCode上获得源代码。本文将为您介绍一下这个项目的背景、功能及特性,让您更好地了解它。 LatinIME是什么? LatinIME是一个用于Android设备的开源输入法引擎,...

gitblog_00008的博客 1225

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

LatinIME输入法增加不同国家字符键盘

keyboard_layout_set_xxxx.xml 后缀要接定义的brazil字段,需要制作自己需要的键盘布局就可以了。3.创建对应的键盘布局文件keyboard_layout_set_brazil.xml。2.attrs.xml文件supportedScript枚举项添加对应的支持。4.在ScriptUtils.java文件也需要增加相应的字段,不然会报错。要创建什么语言的键盘就查找对应的缩写词,这里以巴西为例。1.打开method.xml。

qq_42481796的博客 972

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Android 13 LatinME原生输入法加入一键关闭输入法按键

在Android 13的LatinIME原生输入法中,实现了一键关闭输入法的功能。通过在KeyboardCodesSet中添加新的按键值key_hide,并在KeyboardIconsSet中设置相应的按钮背景布局,实现了虚拟按键的添加。在LatinIME中,通过设置点击事件并调用requestHideSelf(0)方法来关闭输入法。此外,在建议条布局中初始化了关闭按钮,并在配置文件中定义了按键ID。最终,用户可以在输入法的右上角看到一个关闭按钮,点击后即可关闭输入法。

qq_59029385的博客 947

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

LatinIME学习-Latin

Latin是android输入法框架一个InputMethodService实现类,类整体还是很简单的,执行过程已经android封装的接口限定好了。 之前移植输入法到电视上面,核心修改就是修改onKeyDown()和onLongPress()。android框架决定,所有键值都会先分发到输入法中,所以就可以通过记录界面的当前状态,结合键值,做出 ...

weixin_30418341的博客 416

android latinime分析,Android AOSP输入法(LatinIME)大写判断分析

LatinIME源码地址:https://android.googlesource.com/platform/packages/inputmethods/LatinIME/+/android-5.1.1_r6一、大写模式:Android中字母大写有三种模式:textCapCharacters、textCapWords、textCapSentences,分别对应全大写、单词首字母大写、句子首字母大写...

weixin_29416781的博客 1767
上一篇: Google原生输入法LatinIME词库构建流程分析(一)
下一篇: Google原生LatinIME输入法spl_buf_数据内容
杨鑫校
博客等级 码龄11年 24粉丝 113原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值