原文地址:http://blog.csdn.net/jianguo_liao19840726/article/details/25370407
源码里面有3套输入法,位置:Z:\myandroid\packages\inputmethods

openwnn是一家日本公司开发的开源输入法框架,涉及中文、日文、韩文。目前已经加入到了Android源码之中。因此你打开一个模拟器时,会发现其中有一个japanese ime的输入法,其服务名为openwnn,这个就是openwnn的日文输入法

latin 虚拟即盘

google是PinyinIME ,后续我们加入了手写,为第三方库支持,13年10月份合并手写和拼音输入法!

现在合并后的为PateoIME

上面截图原因,还有个XmlKeyboardLoader.Java

一、ComposingView

[html]  view plain  copy  
  1. /**
  2. * View used to show composing string (The Pinyin string for the unselected
  3. * syllables and the Chinese string for the selected syllables.)
  4. * 拼音字符串View,用于显示输入的拼音
  5. */
  6. public class ComposingView extends View {

其需要设置的字符通过下面方法传入PateoIME.DecodingInfo decInfo,decInfo中包含了输入的字符,同时进行刷新view

[html]  view plain  copy  
  1. /**
  2. * Set the composing string to show. If the IME status is
  3. * {@link PateoIME.ImeState#STATE_INPUT}, the composing view's status will
  4. * be set to {@link ComposingStatus#SHOW_PINYIN}, otherwise the composing
  5. * view will set its status to {@link ComposingStatus#SHOW_STRING_LOWERCASE}
  6. * or {@link ComposingStatus#EDIT_PINYIN} automatically.
  7. * 设置 解码操作对象,然后刷新View
  8. */
  9. public void setDecodingInfo(PateoIME.DecodingInfo decInfo,
  10. PateoIME.ImeState imeStatus) {

其主要绘制在onDraw的drawForPinyin(canvas);方法中,通过canvas.drawText写入

而上面的setDecodingInfo方法主要在InputMethodService的继承的子类中被调用如下:

[html]  view plain  copy  
  1. private void updateComposingText(boolean visible) {
  2. if (!visible) {
  3. mComposingView.setVisibility(View.INVISIBLE);
  4. } else {
  5. mComposingView.setDecodingInfo(mDecInfo, mImeState);
  6. mComposingView.setVisibility(View.VISIBLE);
  7. }
  8. mComposingView.invalidate();
  9. }

二、SoundManager

[html]  view plain  copy  
  1. /**
  2. * Class used to manage related sound resources.
  3. * 按键声音管理类、单例
  4. */
  5. public class SoundManager {

播放声音前需要注册相应的音频策略,下面为播放声音代码:

[html]  view plain  copy  
  1. public void playKeyDown() {
  2. if (mAudioManager == null) {
  3. updateRingerMode();
  4. }
  5. if (!mSilentMode) {
  6. int sound = AudioManager.FX_KEYPRESS_STANDARD;
  7. mAudioManager.playSoundEffect(sound, FX_VOLUME);
  8. }
  9. }

相应的上面响应按键的方法被调用在SoftKeyboardView类的下面方法中

[html]  view plain  copy  
  1. // If movePress is true, means that this function is called because user
  2. // moves his finger to this button. If movePress is false, means that this
  3. // function is called when user just presses this key.
  4. public SoftKey onKeyPress(int x, int y,
  5. SkbContainer.LongPressTimer longPressTimer, boolean movePress) {
[html]  view plain  copy  
  1. if (!movePress) {
  2. tryPlayKeyDown();
  3. tryVibrate();
  4. }

我们项目中是另外的处理方式,其中特别要注意,在应用监听案件事件的时候需要返回true,不然可能按下键盘键听到两次按键音

三、SoftKeyToggle

[html]  view plain  copy  
  1. /**
  2. * Class for soft keys which defined in the keyboard xml file. A soft key can be
  3. * a basic key or a toggling key.
  4. *
  5. * @see com.android.inputmethod.pateoime.SoftKey
  6. */
  7. public class SoftKeyToggle extends SoftKey {

上面主要定义的为切换键,相应的配置<toggle_state>

四、class SoftKey

上面主要为相应的按键

五、SoftKeyboard

[html]  view plain  copy  
  1. /**
  2. * Class used to represent a soft keyboard definition, including the height, the
  3. * background image, the image for high light, the keys, etc.
  4. */
  5. public class SoftKeyboard {

上面主要是软键盘的定义,包括布局和高宽

此类中有个很关键的函数,就是通过xy坐标值找到相应的临近按键

[html]  view plain  copy  
  1. public SoftKey mapToKey(int x, int y) {

六、SkbTemplate

[html]  view plain  copy  
  1. /**
  2. * Soft keyboard template used by soft keyboards to share common resources. In
  3. * this way, memory cost is reduced.
  4. */
  5. public class SkbTemplate {

上面主要为:共享公共资源软键盘模板,对应xml资源包下的skb_template.xml、可以根据不同的设备来加载不同的公共资源,其他自由也类似

七、SkbPool

[html]  view plain  copy  
  1. /**
  2. * Class used to cache previously loaded soft keyboard layouts.
  3. */
  4. public class SkbPool {

上面说明:用来缓存以前加载的软键盘布局,是一个软键盘缓存池,该类有如下两个变量

[html]  view plain  copy  
  1. private Vector<SkbTemplate> mSkbTemplates = new Vector<SkbTemplate>();
  2. private Vector<SoftKeyboard> mSoftKeyboards = new Vector<SoftKeyboard>();

即上面看出缓存了布局模板和软键盘两个列表

八、SkbContainer

[html]  view plain  copy  
  1. /**
  2. * The top container to host soft keyboard view(s).
  3. */
  4. public class SkbContainer extends RelativeLayout implements OnTouchListener {

上面所说:顶层容器【集装箱】来承载软键盘视图

[html]  view plain  copy  
  1. /**
  2. * 更新软键盘布局
  3. */
  4. private void updateSkbLayout() {
  5. int screenWidth = mEnvironment.getScreenWidth();
  6. int keyHeight = mEnvironment.getKeyHeight();
  7. int skbHeight = mEnvironment.getSkbHeight();
  8. Resources r = mContext.getResources();
  9. if (null == mSkbFlipper) {
  10. mSkbFlipper = (ViewFlipper) findViewById(R.id.alpha_floatable);
  11. }
  12. mMajorView = (SoftKeyboardView) mSkbFlipper.getChildAt(0);
  13. SoftKeyboard majorSkb = null;
  14. SkbPool skbPool = SkbPool.getInstance();
  15. switch (mSkbLayout) {
  16. case R.xml.skb_qwerty:
  17. majorSkb = skbPool.getSoftKeyboard(R.xml.skb_qwerty,
  18. R.xml.skb_qwerty, screenWidth, skbHeight, mContext);
  19. break;
  20. case R.xml.skb_sym1:
  21. majorSkb = skbPool.getSoftKeyboard(R.xml.skb_sym1, R.xml.skb_sym1,
  22. screenWidth, skbHeight, mContext);
  23. break;
  24. case R.xml.skb_sym2:
  25. majorSkb = skbPool.getSoftKeyboard(R.xml.skb_sym2, R.xml.skb_sym2,
  26. screenWidth, skbHeight, mContext);
  27. break;
  28. case R.xml.skb_smiley:
  29. majorSkb = skbPool.getSoftKeyboard(R.xml.skb_smiley,
  30. R.xml.skb_smiley, screenWidth, skbHeight, mContext);
  31. break;
  32. case R.xml.skb_phone:
  33. majorSkb = skbPool.getSoftKeyboard(R.xml.skb_phone,
  34. R.xml.skb_phone, screenWidth, skbHeight, mContext);
  35. break;
  36. default:
  37. }
  38. if (null == majorSkb || !mMajorView.setSoftKeyboard(majorSkb)) {
  39. return;
  40. }
  41. mMajorView.setBalloonHint(mBalloonOnKey, mBalloonPopup, false);
  42. mMajorView.invalidate();
  43. }
[html]  view plain  copy  
  1. @Override
  2. public boolean onTouchEvent(MotionEvent event) {
  3. super.onTouchEvent(event);
  4. if (mSkbFlipper.isFlipping()) {
  5. resetKeyPress(0);
  6. return true;
  7. }
  8. int x = (int) event.getX();
  9. int y = (int) event.getY();
  10. // Bias correction
  11. y = y + mYBiasCorrection;
  12. // Ignore short-distance movement event to get better performance.
  13. if (event.getAction() == MotionEvent.ACTION_MOVE) {
  14. if (Math.abs(x - mXLast) <= MOVE_TOLERANCE
  15. && Math.abs(y - mYLast) <= MOVE_TOLERANCE) {
  16. return true;
  17. }
  18. }
  19. mXLast = x;
  20. mYLast = y;
  21. if (!mPopupSkbShow) {
  22. // mGestureDetector的监听器在输入法服务PinyinIME中。
  23. if (mGestureDetector.onTouchEvent(event)) {
  24. resetKeyPress(0);
  25. mDiscardEvent = true;
  26. return true;
  27. }
  28. }
  29. switch (event.getAction()) {
  30. case MotionEvent.ACTION_DOWN:
  31. resetKeyPress(0);
  32. mWaitForTouchUp = true;
  33. mDiscardEvent = false;
  34. mSkv = null;
  35. mSoftKeyDown = null;
  36. mSkv = inKeyboardView(x, y, mSkvPosInContainer);
  37. if (null != mSkv) {
  38. mSoftKeyDown = mSkv.onKeyPress(x - mSkvPosInContainer[0], y
  39. - mSkvPosInContainer[1], mLongPressTimer, false);
  40. }
  41. break;
  42. case MotionEvent.ACTION_MOVE:
  43. if (x < 0 || x >= getWidth() || y < 0 || y >= getHeight()) {
  44. break;
  45. }
  46. if (mDiscardEvent) {
  47. resetKeyPress(0);
  48. break;
  49. }
  50. if (mPopupSkbShow && mPopupSkbNoResponse) {
  51. break;
  52. }
  53. SoftKeyboardView skv = inKeyboardView(x, y, mSkvPosInContainer);
  54. if (null != skv) {
  55. if (skv != mSkv) {
  56. mSkv = skv;
  57. mSoftKeyDown = mSkv.onKeyPress(x - mSkvPosInContainer[0], y
  58. - mSkvPosInContainer[1], mLongPressTimer, true);
  59. } else if (null != skv) {
  60. if (null != mSkv) {
  61. mSoftKeyDown = mSkv.onKeyMove(
  62. x - mSkvPosInContainer[0], y
  63. - mSkvPosInContainer[1]);
  64. if (null == mSoftKeyDown) {
  65. mDiscardEvent = true;
  66. }
  67. }
  68. }
  69. }
  70. break;
  71. case MotionEvent.ACTION_UP:
  72. if (mDiscardEvent) {
  73. resetKeyPress(0);
  74. break;
  75. }
  76. mWaitForTouchUp = false;

Android系统应用开发(五)android 输入法类说明相关推荐

  1. Android系统级开发进程清理功能的一些记录和发现(一)

    Android系统级开发清理功能的一些记录和发现 客户需求做一键清理所有后台进程的功能,在查阅网上相关博客以及自己研究以后找到以下几种方法: killBackgroundProcesses() 这种方 ...

  2. Android系统级开发进程清理功能的一些记录和发现

    Android系统级开发清理功能的一些记录和发现 客户需求做一键清理所有后台进程的功能,在查阅网上相关博客以及自己研究以后找到以下几种方法: killBackgroundProcesses() 这种方 ...

  3. android原生系统开发板,刷android系统到开发板上.doc

    刷android系统到开发板上 将安卓系统刷系统到开发板上 马亲民 2014.12.20 1.擦除NAND FLASH中原有的Windows CE1 2.加载USB引导文件4 3.下载Linux内核9 ...

  4. 视频教程-基于NDK、C++、FFmpeg的android视频播放器开发实战-Android

    基于NDK.C++.FFmpeg的android视频播放器开发实战 夏曹俊:南京捷帝科技有限公司创始人,南京大学计算机硕士毕业,有15年c++跨平台项目研发的经验,领导开发过大量的c++虚拟仿真,计算 ...

  5. Android 音视频开发(六) -- Android Mediaprojection 截屏和录屏

    Android 音视频开发(一) – 使用AudioRecord 录制PCM(录音):AudioTrack播放音频 Android 音视频开发(二) – Camera1 实现预览.拍照功能 Andro ...

  6. Android 系统(188)---Android开发:ListView、AdapterView、RecyclerView全面解析

    Android开发:ListView.AdapterView.RecyclerView全面解析 目录 ListView.AdapterView.RecyclerView全面解析.png Adapter ...

  7. android系统nfc开发,GitHub - hanjie511/MyNFC: android的NFC开发入门

    MyNFC android的NFC开发入门 NFC简述 近距离无线通信 (NFC) 是一组近距离无线技术,通常只有在距离不超过 4 厘米时才能启动连接.借助 NFC,您可以在 NFC 标签与 Andr ...

  8. android系统应用开发_利用ADB工具免root停用Android系统应用

    最近迷上了安卓的开发,写篇冻结app的教程吧. 主要是实现,免root冻结系统中的某些应用,你懂得哈哈 利用ADB工具免root停用Android系统应用 - Hanada​hanada.info 上 ...

  9. Android 系统(252)---Android:BLE智能硬件开发详解

    Android:BLE智能硬件开发详解 目录 前言 BLE是个什么鬼 BLE中的角色分工 主要的关键词和概念  GATT(Generic Attribute Profile ) Characteris ...

最新文章

  1. [转]Oracle DB 复制数据库
  2. php接口 接受ios或android端图片; php接收NSData数据
  3. log4j2 配置文件
  4. 批量提取 caffe 特征 (python, C++, Matlab)(待续)
  5. 计算机启动时运行ccleaner,Ccleaner的使用方法
  6. JAVA使用FTPClient类读写FTP
  7. webgis从基础到开发实践_开源WebGIS教程系列——11.1 GISLite 的开发背景与设计
  8. 【转载】网站从百度云转入阿里云服务器
  9. 线上redis一般安在linux_Redis企业级应用-Linux安装搭建一个完整的linxu线上服务(上)...
  10. 用Visual Studio 2008编写Win32汇编程序
  11. api 定位 微信小程序 精度_微信小程序城市定位(百度地图API)
  12. IIS7.5应用程序池集成模式和经典模式的区别介绍
  13. J1939CANTP
  14. 3DMax设置长度单位
  15. 传输层协议介绍(深入学习)
  16. 设计模式——工厂方法模式
  17. 老板让全体员工《致加西亚的信》
  18. 服务器pci数据捕获和信号处理控制器驱动,PCI数据捕获和信号处理控制器是哪个驱动...
  19. 2017CNCC会议总结(一)
  20. 人机交互期末复习笔记

热门文章

  1. Linux C高阶(7)异步处理框架C实现
  2. php similartext 中文,推荐10款similar_text源码(收藏)
  3. python 报错:Empty suite
  4. 想工作嘛!让你[肝]一个月有多累
  5. 红黑棋子交换java,象棋大挪移 红黑棋子 红先黑后,输了不臭
  6. 帆软报表设置单元格填报以及根据值的大小进行排名方法
  7. Allegro基本规则设置指导书之Analysis Modes
  8. 视频教程-【直通华为HCNA/HCNP系列R篇3】路由器接口配置与管理-华为认证
  9. Qt 5.15 LTS(长期支持版本)正式发布
  10. 4年功能测试跳槽,最后选择了学习自动化测试,月薪18K实现逆袭