ScanKeyEventHelper.kt 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package xn.hxp.receiver
  2. import android.os.Handler
  3. import android.os.Looper
  4. import android.util.Log
  5. import android.view.KeyEvent
  6. import com.blankj.utilcode.util.LogUtils
  7. class ScanKeyEventHelper(private val callback: ((content: String) -> Unit)? = null) {
  8. private var mCaps = false
  9. private var mKeyContent = StringBuilder()
  10. fun analysisKeyEvent(event: KeyEvent) {
  11. val keyCode = event.keyCode
  12. if (KeyEvent.KEYCODE_SHIFT_RIGHT == keyCode
  13. || KeyEvent.KEYCODE_SHIFT_LEFT == keyCode
  14. ) {
  15. mCaps = KeyEvent.ACTION_DOWN == event.action
  16. }
  17. if (KeyEvent.ACTION_DOWN != event.action) return
  18. if (KeyEvent.KEYCODE_ENTER == keyCode) {
  19. if (mKeyContent.isNotEmpty()) callback?.invoke(mKeyContent.toString())
  20. mKeyContent.clear()
  21. } else {
  22. decodeKeyCode(keyCode, event)?.let { keyChar ->
  23. mKeyContent.append(keyChar)
  24. if (mKeyContent.toString().length == 1) {
  25. Handler(Looper.getMainLooper()).postDelayed({
  26. callback?.invoke(mKeyContent.toString())
  27. mKeyContent.clear()
  28. }, 2000)
  29. }
  30. }
  31. }
  32. }
  33. // private fun decodeKeyCode(keyCode: Int): Char? {
  34. //
  35. // return when (keyCode) {
  36. // in KeyEvent.KEYCODE_0..KeyEvent.KEYCODE_9 -> {
  37. // // 0:48=0x30
  38. // return (keyCode - KeyEvent.KEYCODE_0 + 0x30).toChar()
  39. // }
  40. //
  41. // in KeyEvent.KEYCODE_A..KeyEvent.KEYCODE_Z -> {
  42. // // a:97=0x61 A:65=0x41
  43. // return (keyCode - KeyEvent.KEYCODE_A + if (mCaps) 0x41 else 0x61).toChar()
  44. // }
  45. // KeyEvent.KEYCODE_PERIOD -> '.'
  46. // KeyEvent.KEYCODE_MINUS -> if (mCaps) '_' else '-'
  47. // KeyEvent.KEYCODE_SLASH -> '/'
  48. // KeyEvent.KEYCODE_BACKSLASH -> if (mCaps) '|' else '\\'
  49. // KeyEvent.KEYCODE_EQUALS -> '=' // 等号
  50. //
  51. // else -> {
  52. // null
  53. // }
  54. // }
  55. // }
  56. //
  57. // private fun decodeKeyCode(keyCode: Int,event: KeyEvent): Char? {
  58. // val isShiftPressed = event.isShiftPressed
  59. // LogUtils.i("=======shifou $isShiftPressed ${KeyEvent.KEYCODE_7}")
  60. // return when (keyCode) {
  61. // in KeyEvent.KEYCODE_0..KeyEvent.KEYCODE_9 -> {
  62. // return if(14==KeyEvent.KEYCODE_7 &&isShiftPressed){
  63. // '&'
  64. // }else{
  65. // // 0:48=0x30
  66. // (keyCode - KeyEvent.KEYCODE_0 + 0x30).toChar()
  67. // }
  68. // }
  69. //
  70. // in KeyEvent.KEYCODE_A..KeyEvent.KEYCODE_Z -> {
  71. // // a:97=0x61 A:65=0x41
  72. // return (keyCode - KeyEvent.KEYCODE_A + if (isShiftPressed) 0x41 else 0x61).toChar()
  73. // }
  74. // KeyEvent.KEYCODE_PERIOD -> '.'
  75. // KeyEvent.KEYCODE_MINUS -> if (isShiftPressed) '_' else '-'
  76. // KeyEvent.KEYCODE_SLASH -> '/'
  77. // KeyEvent.KEYCODE_BACKSLASH -> if (isShiftPressed) '|' else '\\'
  78. // KeyEvent.KEYCODE_EQUALS -> '=' // 等号
  79. //
  80. //
  81. // else -> {
  82. // null
  83. // }
  84. // }
  85. // }
  86. /**
  87. * 不知道乱写一通写的啥,总之处理了 但是结果是错的 勉强能用
  88. * @author 前同事之作
  89. */
  90. private fun decodeKeyCode(keyCode: Int, event: KeyEvent): Char? {
  91. val isShiftPressed = event.isShiftPressed
  92. if (keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9) {
  93. return if (KeyEvent.KEYCODE_7 == 14 && isShiftPressed) {
  94. '&'
  95. } else {
  96. // 0:48=0x30
  97. (keyCode - KeyEvent.KEYCODE_0 + 0x30).toChar()
  98. }
  99. } else if (keyCode >= KeyEvent.KEYCODE_A && keyCode <= KeyEvent.KEYCODE_Z) {
  100. // a:97=0x61 A:65=0x41
  101. return (keyCode - KeyEvent.KEYCODE_A + if (isShiftPressed) 0x41 else 0x61).toChar()
  102. } else if (keyCode == KeyEvent.KEYCODE_PERIOD) {
  103. return '.'
  104. } else if (keyCode == KeyEvent.KEYCODE_MINUS) {
  105. return if (isShiftPressed) '_' else '-'
  106. } else if (keyCode == KeyEvent.KEYCODE_SLASH) {
  107. return '/'
  108. } else if (keyCode == KeyEvent.KEYCODE_BACKSLASH) {
  109. return if (isShiftPressed) '|' else '\\'
  110. } else if (keyCode == KeyEvent.KEYCODE_EQUALS) {
  111. return '=' // 等号
  112. } else {
  113. return null
  114. }
  115. }
  116. }