LatinIME输入法分析

摘要:
此输入法不是系统的默认输入法。如果输入方法的apk被直接推送到/system/app/或更低,->使用第三方输入法时必须设置;这些布局的分析由键盘(在框架中)及其子类LatinIME(在拉丁输入法的源代码中)完成,所有的键都绘制在位图上。

输入法的设置在res/xml/method.xml的<input-method>标签中,主要设置两个属性:

android:settingsActivity,输入法的设置程序入口。

android:isDefault,这个输入法是不是系统的默认输入法。

另外,假设输入法的apk直接push到/system/app/以下的话,算是系统输入法,假设是以第三方程序的方式安装到/data/app/以下的话,算是第三方输入法,两个输入法眼下来看,最大的不同在于,使用第三方输入法时必须在设置->语言和键盘其中手工启动。

最主要的字母布局由res/xml/以下的kbd_qwerty.xml,kbd_qwerty_black.xml定义,其他的还有符号布局,数字布局等也都在这个目录以下。当用户进行操作时,程序就会在这些布局之间来回切换。

对这些布局的解析由Keyboard(位于framework中)以及它的子类LatinIME(位于Latin输入法的源代码中)一起完毕,涉及到的主要方法有:

1、loadKeyboard:解析布局文件

2、LatinKeyboard.createKeyFromXml,Keyboard.createKeyFromXml:从XML文件创建一个按键。

3、getDimensionOrFraction:获取某一个属性的值。这个属性值的格式必须规定为Dimen(dip,px,sp,in等)或者Fraction(百分比)的。

4、LatinKeyboardBase.onBufferDraw:把全部的Key绘制在一张Bitmap上,再由继承自ViewonDraw方法把这张Bitmap渲染到onDraw传递过来的Canvas上。

绘制Key的时候,主要绘制两个东西,label和icon。对于a,b,c,1,2,&等这样能够用字符来表示的键,就绘制它的label属性。对于Shift,Alt等这样无法用字符表示的键,就绘制它的icon属性。

另外,大部分Key仅仅绘制icon或label中的一个。而少部分Key,两个都绘制。比方qwertyuiop这几个Key,还会在Key的右上方有一个小的数字,这些小数字每个都是一个icon,存放在LatinKeyboard的mNumberHintIcons数组中。而qwertyuiop这几个Key是一组比較特殊的Key,它们会在LatinKeyboard中有一个引用备份:mNumberHintKeys。每次用户按Shift来更新键盘布局时,除了会更新这几个Key的label之外,都会调用updateNumberHintKeys方法把它们的icon也赋值。

这次遇到的问题是LatinIME布局混乱,打开这个输入法时,整个输入法界面被挤在屏幕下方一个高度非常小的矩形范围内。经过跟踪,发现输入法的布局的高度宽度,每一个Key的高度宽度等信息都是定义在dimens.xml中的。而在dimens.xml中,这些尺寸的单位都是in,在程序其中把这些单位转化成像素以后,是个非常小的值。最后把这些尺寸单位改为dip,并设置好合适的值就好了。看来是系统移植到板子上以后,in和像素之间进行转换时出问题了。

免责声明:文章转载自《LatinIME输入法分析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Zend Framework 教程:简单的注册和登录验证Dos命令大全下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux下编写Shell程序运行报“command not found”的解决思路

  在学习Linux环境的Shell程序编写时,遇到报错“command not found”,但是仔细检查语法并没有任何错误,那么就奇怪了,然后在尝试编写其它小案例程序后发现,在经常是在if、while等这些语句的位置报此错误。   如下图所示:   然后,在仔细一比对书上的案例,发现了问题所在:   原来,Shell语言对于空格并不想Java和C等对...

WebView2简单试用(五)—— 自定义用户数据文件夹

默认情况下,WebView2程序的用户数据是按程序独立存储的: 桌面应用位置是当前路径,以 xxx.exe.WebView2命名 UWP程序在ApplicationDataLocalFolder 程序包文件夹中的子文件夹 这么做的好处是程序具有独立的会话信息。但很多时候我们需要自定义用户数据存储的位置,例如: 程序的根目录可能没有写入权限...

C#笔记21:多线程之线程同步中的锁定lock、Monitor

C#笔记21:多线程之线程同步中的锁定lock、Monitor 1:什么是锁 2:如何选择锁定对象 3:如何锁定集合 4:Monitor 1:什么是锁      lock 语句可以用来确保代码块完成运行,而不会被其他线程中断。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。 2:如何选择锁定对象      提供给 lock 关键字的参数必须为基于引用...

很酷的页面布局框架

建高楼大厦时,我们总是先用钢筋水泥搭好骨架,然后再加砖添瓦,布置每套房屋。编写一个网页也是这样,须先将布局框架搭好稳固,之后才能游刃有余。本博文阐述如何实现了两栏布局(main栏和sub栏),三栏布局(main栏、sub栏和extra栏),以及布局中各栏的排列顺序。 本示例布局框架具有以下特性: 跨浏览器:兼容IE6。 稳固性:布局稳固,不受内容的影响。...

.net—— webservice的新建、发布、使用(最全、最简单)【原创】

网上有很多关于webservice资料,但大部分都不完整,其中还有很大部分是转载的……,这个悲剧了,自己都没试过能不能用就不负责任的转载。 所以今天对webservice的新建、发布、使用做一个全面、细致的演练,如果有问题的留言,咱们共同讨论。 一、 首先建立webservice  工具:vs2013 1、咱们新建一个web的项目: 选择空的web项目就...

PowerShell脚本之Invoke-Expression Hook

目录 PowerShell脚本之Invoke-Expression Hook 开发环境 Hook的起因 Hook的原理 Hook的流程 patch程序的编写 0x01--原始DLL的修改 0x02--3环程序的编写 0x03--驱动程序的编写 0x04--总结和梳理: 效果展示 PowerShell脚本之Invoke-Expressio...