Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> android sdk中 softkeyboard的自己解析(1)

android sdk中 softkeyboard的自己解析(1)

編輯:Android開發實例

我在網上看了很多篇這個程序的解析,感覺都不錯但是不夠詳細,於是我自己費了幾天的時間解讀了一遍,注釋上去。今天寫在這裡,占個空,此外怕那天丟了還有個備份,如果能對和我一樣的菜鳥們有點幫助最好。

1.LatinKeyBoard.java

 

  1.  
  2. /*  
  3. * Copyright (C) 2008-2009 Google Inc.  
  4. *   
  5. * Licensed under the Apache License, Version 2.0 (the "License"); you may not  
  6. * use this file except in compliance with the License. You may obtain a copy of  
  7. * the License at  
  8. *   
  9. * http://www.apache.org/licenses/LICENSE-2.0  
  10. *   
  11. * Unless required by applicable law or agreed to in writing, software  
  12. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT  
  13. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the  
  14. * License for the specific language governing permissions and limitations under  
  15. * the License.  
  16. */ 
  17.  
  18. package com.example.android.softkeyboard;  
  19.  
  20. import android.content.Context;  
  21. import android.content.res.Resources;  
  22. import android.content.res.XmlResourceParser;  
  23. import android.inputmethodservice.Keyboard;  
  24. import android.inputmethodservice.Keyboard.Key;  
  25. import android.inputmethodservice.Keyboard.Row;  
  26. import android.view.inputmethod.EditorInfo;  
  27.  
  28.  
  29. public class LatinKeyboard extends Keyboard {  
  30.  
  31. private Key mEnterKey;  
  32.  
  33. public LatinKeyboard(Context context, int xmlLayoutResId) {  
  34. super(context, xmlLayoutResId);  
  35. }  
  36.  
  37. public LatinKeyboard(Context context, int layoutTemplateResId, CharSequence characters, int columns, int horizontalPadding) {  
  38. super(context, layoutTemplateResId, characters, columns, horizontalPadding);  
  39. }  
  40.  
  41. @Override 
  42. protected Key createKeyFromXml(Resources res, Row parent, int x, int y, XmlResourceParser parser) {  
  43. //描繪鍵盤時候自動調用??是不是在此類的構造函數中就使用了?肯定是自己的函數調用這個函數。  
  44. Key key = new LatinKey(res, parent, x, y, parser);  
  45. if (key.codes[0] == 10) {     //重載的目的,好像僅僅是為了記錄回車鍵的值而已(以Key型記錄)然後下一個函數要用到  
  46. mEnterKey = key;          //無非就是想對回車鍵做改觀  
  47. }  
  48. return key;  
  49. }  
  50.  
  51. /**  
  52. * This looks at the ime options given by the current editor, to set the  
  53. * appropriate label on the keyboard's enter key (if it has one).  
  54. */ 
  55. void setImeOptions(Resources res, int options) {  
  56. //在SoftKeyboard的StartInput函數最後用到了  
  57. //傳入了EditorInfo.imeOptions類型的options參數。此變量地位與EditorInfo.inputType類似。但作用截然不同  
  58. if (mEnterKey == null) {  
  59. return;  
  60. }  
  61. //驚爆:只要加載了EditorInfo的包,就可以使用其中的常量,所熟知的TextView類中的常量,經過試驗也是可以任意使用的,猜測這些都是靜態變量  
  62. switch (options&(EditorInfo.IME_MASK_ACTION|EditorInfo.IME_FLAG_NO_ENTER_ACTION)) {  
  63. //難道後面兩個或的天生就是為了聯接在一起跟別人與?  
  64. case EditorInfo.IME_ACTION_GO:  
  65. mEnterKey.iconPreview = null;  
  66. mEnterKey.icon = null;   //把圖片設為空,並不代表就是空,只是下面的Lable可以代替之  
  67. mEnterKey.label = res.getText(R.string.label_go_key);  
  68. break;  
  69. case EditorInfo.IME_ACTION_NEXT:  
  70. mEnterKey.iconPreview = null;  
  71. mEnterKey.icon = null;  
  72. mEnterKey.label = res.getText(R.string.label_next_key);  
  73. break;  
  74. case EditorInfo.IME_ACTION_SEARCH:  
  75. mEnterKey.icon = res.getDrawable(  
  76. R.drawable.sym_keyboard_search);  
  77. mEnterKey.label = null;  
  78. break;  
  79. case EditorInfo.IME_ACTION_SEND:  
  80. mEnterKey.iconPreview = null;  
  81. mEnterKey.icon = null;  
  82. mEnterKey.label = res.getText(R.string.label_send_key);  
  83. break;  
  84. default:  
  85. mEnterKey.icon = res.getDrawable(  
  86. R.drawable.sym_keyboard_return);  
  87. mEnterKey.label = null;  
  88. break;  
  89. }  
  90. }  
  91.  
  92. static class LatinKey extends Keyboard.Key {  
  93.  
  94. public LatinKey(Resources res, Keyboard.Row parent, int x, int y, XmlResourceParser parser) {  
  95. super(res, parent, x, y, parser);//用的是老一輩的構造函數  
  96. }  
  97.  
  98. /**  
  99. * Overriding this method so that we can reduce the target area for the key that  
  100. * closes the keyboard.   
  101. */ 
  102. @Override 
  103. public boolean isInside(int x, int y) {  
  104. return super.isInside(x, codes[0] == KEYCODE_CANCEL ? y -10: y);  
  105. //只有一個左下角cancel鍵跟super的此函數不一樣,其余相同  
  106. //僅僅為了防止錯誤的點擊?將cancel鍵的作用范圍減小了10,其余的,如果作用到位,都返回true  
  107. }  
  108. }  
  109.  
  110. }  

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved