KhKeyboardView.java 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. package me.yoqi.android.safekeyboard.keyboard;
  2. import android.app.Activity;
  3. import android.graphics.drawable.Drawable;
  4. import android.inputmethodservice.Keyboard;
  5. import android.inputmethodservice.KeyboardView;
  6. import android.text.Editable;
  7. import android.text.InputType;
  8. import android.util.Log;
  9. import android.view.View;
  10. import android.widget.EditText;
  11. import java.util.List;
  12. import me.yoqi.android.safekeyboard.R;
  13. public class KhKeyboardView {
  14. private Activity mContext;
  15. private View parentView;
  16. private KeyboardView mLetterView; //字母键盘view
  17. private KeyboardView mNumberView; //数字键盘View
  18. private Keyboard mNumberKeyboard; // 数字键盘
  19. private Keyboard mLetterKeyboard; // 字母键盘
  20. private Keyboard mSymbolKeyboard; // 符号键盘
  21. private boolean isNumber = true; // 是否数字键盘
  22. public static boolean isUpper = false; // 是否大写
  23. private boolean isSymbol = false; // 是否是符号
  24. private EditText mEditText;
  25. private View headerView;
  26. public void setEditText(EditText text) {
  27. mEditText = text;
  28. }
  29. public KhKeyboardView(Activity context, View view) {
  30. mContext = context;
  31. parentView = view;
  32. //构建系统 Keyboard 实例
  33. mNumberKeyboard = new Keyboard(mContext, R.xml.keyboard_numbers); //数字键盘
  34. mLetterKeyboard = new Keyboard(mContext, R.xml.keyboard_word); // 字母键盘
  35. mSymbolKeyboard = new Keyboard(mContext, R.xml.keyboard_symbol); // 符号键盘
  36. mNumberView = (KeyboardView) parentView.findViewById(R.id.keyboard_view);
  37. mLetterView = (KeyboardView) parentView.findViewById(R.id.keyboard_view_2);
  38. mNumberView.setKeyboard(mNumberKeyboard);
  39. mNumberView.setEnabled(true);
  40. mNumberView.setPreviewEnabled(false);
  41. mNumberView.setOnKeyboardActionListener(listener);
  42. mLetterView.setKeyboard(mLetterKeyboard);
  43. mLetterView.setEnabled(true);
  44. mLetterView.setPreviewEnabled(true); //默认显示字母键盘
  45. mLetterView.setOnKeyboardActionListener(listener);
  46. headerView = parentView.findViewById(R.id.keyboard_header);
  47. }
  48. private KeyboardView.OnKeyboardActionListener listener = new KeyboardView.OnKeyboardActionListener() {
  49. @Override
  50. public void onPress(int primaryCode) {
  51. Log.d("primaryCode","onPress--"+primaryCode);
  52. if (primaryCode == Keyboard.KEYCODE_SHIFT) {
  53. List<Keyboard.Key> keyList = mLetterKeyboard.getKeys();
  54. mLetterView.setPreviewEnabled(false);
  55. } else if (primaryCode == Keyboard.KEYCODE_DELETE) {
  56. mLetterView.setPreviewEnabled(false);
  57. } else if (primaryCode == 32) {
  58. mLetterView.setPreviewEnabled(false);
  59. } else {
  60. mLetterView.setPreviewEnabled(true);
  61. }
  62. }
  63. @Override
  64. public void onRelease(int primaryCode) {
  65. Log.d("primaryCode","onRelease--"+primaryCode);
  66. // if(primaryCode== -1){
  67. // if(isUpper){
  68. // isUpper=false;
  69. // }else {
  70. // isUpper=true;
  71. // }
  72. // }
  73. }
  74. @Override
  75. public void onKey(int primaryCode, int[] keyCodes) {
  76. Log.d("primaryCode","onKey--"+primaryCode);
  77. try {
  78. if (mEditText == null)
  79. return;
  80. Editable editable = mEditText.getText();
  81. int start = mEditText.getSelectionStart();
  82. if (primaryCode == Keyboard.KEYCODE_CANCEL) {
  83. // 隐藏键盘
  84. hideKeyboard();
  85. } else if (primaryCode == Keyboard.KEYCODE_DELETE || primaryCode == -35) {
  86. // 回退键,删除字符
  87. if (editable != null && editable.length() > 0) {
  88. if (start > 0) {
  89. editable.delete(start - 1, start);
  90. }
  91. }
  92. } else if (primaryCode == Keyboard.KEYCODE_SHIFT) {
  93. // 大小写切换
  94. changeKeyboart();
  95. mLetterView.setKeyboard(mLetterKeyboard);
  96. } else if (primaryCode == Keyboard.KEYCODE_MODE_CHANGE) {
  97. // 数字与字母键盘互换
  98. if (isNumber) {
  99. showLetterView();
  100. showLetterView2();
  101. } else {
  102. showNumberView();
  103. }
  104. } else if (primaryCode == 90001) {
  105. // 字母与符号切换
  106. if (isSymbol) {
  107. showLetterView2();
  108. } else {
  109. showSymbolView();
  110. }
  111. } else {
  112. // 输入键盘值
  113. editable.insert(start, Character.toString((char) primaryCode));
  114. }
  115. } catch (Exception e) {
  116. e.printStackTrace();
  117. }
  118. }
  119. @Override
  120. public void onText(CharSequence text) {
  121. }
  122. @Override
  123. public void swipeLeft() {
  124. }
  125. @Override
  126. public void swipeRight() {
  127. }
  128. @Override
  129. public void swipeDown() {
  130. }
  131. @Override
  132. public void swipeUp() {
  133. }
  134. };
  135. // 字母-符号,显示字母
  136. private void showLetterView2() {
  137. if (mLetterView != null) {
  138. isSymbol = false;
  139. mLetterView.setKeyboard(mLetterKeyboard);
  140. }
  141. }
  142. // 字母-符号,显示符号
  143. private void showSymbolView() {
  144. try {
  145. if (mLetterKeyboard != null) {
  146. isSymbol = true;
  147. mLetterView.setKeyboard(mSymbolKeyboard);
  148. }
  149. } catch (Exception e) {
  150. }
  151. }
  152. // 数字-字母,显示字母键盘
  153. private void showLetterView() {
  154. try {
  155. if (mLetterView != null && mNumberView != null) {
  156. isNumber = false;
  157. mLetterView.setVisibility(View.VISIBLE);
  158. mNumberView.setVisibility(View.INVISIBLE);
  159. }
  160. } catch (Exception e) {
  161. e.printStackTrace();
  162. }
  163. }
  164. // 数字-字母, 显示数字键盘
  165. private void showNumberView() {
  166. try {
  167. if (mLetterView != null && mNumberView != null) {
  168. isNumber = true;
  169. mLetterView.setVisibility(View.INVISIBLE);
  170. mNumberView.setVisibility(View.VISIBLE);
  171. }
  172. } catch (Exception e) {
  173. e.printStackTrace();
  174. }
  175. }
  176. /**
  177. * 切换大小写
  178. */
  179. private void changeKeyboart() {
  180. List<Keyboard.Key> keyList = mLetterKeyboard.getKeys();
  181. if (isUpper) {
  182. // 大写切换小写
  183. isUpper = false;
  184. for (Keyboard.Key key : keyList) {
  185. Drawable icon = key.icon;
  186. if (key.label != null && isLetter(key.label.toString())) {
  187. key.label = key.label.toString().toLowerCase();
  188. key.codes[0] = key.codes[0] + 32;
  189. }
  190. }
  191. } else {
  192. // 小写切换成大写
  193. isUpper = true;
  194. for (Keyboard.Key key : keyList) {
  195. if (key.label != null && isLetter(key.label.toString())) {
  196. key.label = key.label.toString().toUpperCase();
  197. key.codes[0] = key.codes[0] - 32;
  198. }
  199. }
  200. }
  201. }
  202. /**
  203. * 判断是否是字母
  204. */
  205. private boolean isLetter(String str) {
  206. String wordStr = "abcdefghijklmnopqrstuvwxyz";
  207. return wordStr.contains(str.toLowerCase());
  208. }
  209. public void hideKeyboard() {
  210. try {
  211. int visibility = mLetterView.getVisibility();
  212. if (visibility == View.VISIBLE) {
  213. headerView.setVisibility(View.GONE);
  214. mLetterView.setVisibility(View.GONE);
  215. }
  216. visibility = mNumberView.getVisibility();
  217. if (visibility == View.VISIBLE) {
  218. headerView.setVisibility(View.GONE);
  219. mNumberView.setVisibility(View.GONE);
  220. }
  221. } catch (Exception e) {
  222. e.printStackTrace();
  223. }
  224. }
  225. /**
  226. * 显示键盘
  227. *
  228. * @param editText 输入字符串到 editText 类型的控件中
  229. */
  230. public void showKeyboard(EditText editText) {
  231. try {
  232. this.mEditText = editText;
  233. int visibility = 0;
  234. int inputText = mEditText.getInputType();
  235. headerView.setVisibility(View.VISIBLE);
  236. switch (inputText) {
  237. case InputType.TYPE_CLASS_NUMBER:
  238. showNumberView();
  239. break;
  240. case InputType.TYPE_CLASS_PHONE:
  241. showNumberView();
  242. break;
  243. case InputType.TYPE_NUMBER_FLAG_DECIMAL:
  244. showNumberView();
  245. break;
  246. default:
  247. showLetterView();
  248. break;
  249. }
  250. } catch (Exception e) {
  251. e.printStackTrace();
  252. }
  253. }
  254. }