Skip to content

Commit 7c76d6a

Browse files
committed
支持通过发送按键值来控制键盘
1 parent b04fd2d commit 7c76d6a

File tree

8 files changed

+141
-43
lines changed

8 files changed

+141
-43
lines changed

README.md

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ KingKeyboard for Android 是一个自定义键盘。内置了满足各种场景
1919
## Gif 展示
2020
![Image](GIF.gif)
2121

22+
> 你也可以直接下载 [演示App](https://raw.githubusercontent.com/jenly1314/KingKeyboard/master/app/release/app-release.apk) 体验效果
23+
2224

2325
## 引入
2426

@@ -37,7 +39,7 @@ allprojects {
3739

3840
2. 在Module的 **build.gradle** 里面添加引入依赖项
3941
```gradle
40-
implementation 'com.github.jenly1314:kingkeyboard:1.0.1'
42+
implementation 'com.github.jenly1314:kingkeyboard:1.0.2'
4143
4244
```
4345

@@ -200,6 +202,43 @@ implementation 'com.king.keyboard:kingkeyboard:1.0.0'
200202

201203
```
202204

205+
206+
207+
v1.0.2 新增:KingKeyboard.sendKey(primaryCode: Int) 的用法示例:
208+
209+
```kotlin
210+
val beforeCount = 0
211+
212+
kingKeyboard.register(et,KingKeyboard.KeyboardType.LICENSE_PLATE_PROVINCE)
213+
214+
//通过监听输入框内容改变,来通过发送功能键来切换键盘(这里只是举例展示kingKeyboard.sendKey的用法,具体怎么用还需根据需求场景去决定)
215+
et.addTextChangedListener(object : TextWatcher{
216+
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
217+
beforeCount = s?.length ?: 0
218+
}
219+
220+
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
221+
when(s?.length){
222+
0 -> {//车牌键盘:如果输入的内容长度改变为0,并且当前的键盘不是省份键盘模式时,通过发送“返回”功能按键值,让键盘自动切换到省份键盘模式
223+
if(kingKeyboard.getKeyboardType() != KingKeyboard.KeyboardType.LICENSE_PLATE_PROVINCE){
224+
kingKeyboard.sendKey(KingKeyboard.KEYCODE_BACK)
225+
}
226+
}
227+
1 -> {//车牌键盘:如果输入的内容长度从0改变为1,并且当前的键盘为省份键盘模式时,通过发送“模式改变”功能按键值,让键盘自动切换到字母键盘模式
228+
if(beforeCount == 0 && kingKeyboard.getKeyboardType() == KingKeyboard.KeyboardType.LICENSE_PLATE_PROVINCE){
229+
kingKeyboard.sendKey(KingKeyboard.KEYCODE_MODE_CHANGE)
230+
}
231+
}
232+
}
233+
}
234+
235+
override fun afterTextChanged(s: Editable?) {
236+
237+
}
238+
239+
})
240+
```
241+
203242
### 相关说明
204243

205244
> * **KingKeyboard** 主要采用Kotlin编写实现,如果您的项目使用的是Java编写,集成时语法上可能稍微有点不同,除了结尾没有分号以外,对应类伴生对象中的常量,需要通过点伴生对象才能获取。
@@ -223,6 +262,9 @@ implementation 'com.king.keyboard:kingkeyboard:1.0.0'
223262

224263
## 版本记录
225264

265+
#### v1.0.2:2021-9-29
266+
* 新增** KingKeyboard.sendKey(primaryCode: Int)** 方法;(支持通过发送按键的值来控制键盘)
267+
226268
#### v1.0.1:2021-9-3 (从v1.0.1开始发布至 MavenCentral)
227269
* 优化按键提示音策略(跟随系统的提示音设置)
228270

app/release/app-release.apk

-2 Bytes
Binary file not shown.

app/release/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":2,"versionName":"1.0.1","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release","dirName":""},"path":"app-release.apk","properties":{}}]
1+
[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":3,"versionName":"1.0.2","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release","dirName":""},"path":"app-release.apk","properties":{}}]

app/src/main/java/com/king/keyboard/app/MainActivity.kt

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ package com.king.keyboard.app
22

33
import androidx.appcompat.app.AppCompatActivity
44
import android.os.Bundle
5-
import android.view.SoundEffectConstants
5+
import android.text.Editable
6+
import android.text.TextWatcher
67
import com.king.keyboard.KingKeyboard
78
import kotlinx.android.synthetic.main.activity_main.*
89

@@ -12,6 +13,8 @@ class MainActivity : AppCompatActivity() {
1213

1314
private var isVibrationEffectEnabled = false
1415

16+
private var beforeCount = 0
17+
1518
override fun onCreate(savedInstanceState: Bundle?) {
1619
super.onCreate(savedInstanceState)
1720
setContentView(R.layout.activity_main)
@@ -30,6 +33,35 @@ class MainActivity : AppCompatActivity() {
3033
kingKeyboard.register(et10,KingKeyboard.KeyboardType.LICENSE_PLATE)
3134
kingKeyboard.register(et11,KingKeyboard.KeyboardType.LICENSE_PLATE_PROVINCE)
3235

36+
37+
//通过监听输入框内容改变,来通过发送功能键来切换键盘(这里只是举例展示kingKeyboard.sendKey的用法,具体怎么用还需根据需求场景去决定)
38+
et11.addTextChangedListener(object : TextWatcher{
39+
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
40+
beforeCount = s?.length ?: 0
41+
}
42+
43+
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
44+
when(s?.length){
45+
0 -> {//车牌键盘:如果输入的内容长度改变为0,并且当前的键盘不是省份键盘模式时,通过发送“返回”功能按键值,让键盘自动切换到省份键盘模式
46+
if(kingKeyboard.getKeyboardType() != KingKeyboard.KeyboardType.LICENSE_PLATE_PROVINCE){
47+
kingKeyboard.sendKey(KingKeyboard.KEYCODE_BACK)
48+
}
49+
}
50+
1 -> {//车牌键盘:如果输入的内容长度从0改变为1,并且当前的键盘为省份键盘模式时,通过发送“模式改变”功能按键值,让键盘自动切换到字母键盘模式
51+
if(beforeCount == 0 && kingKeyboard.getKeyboardType() == KingKeyboard.KeyboardType.LICENSE_PLATE_PROVINCE){
52+
kingKeyboard.sendKey(KingKeyboard.KEYCODE_MODE_CHANGE)
53+
}
54+
}
55+
}
56+
}
57+
58+
override fun afterTextChanged(s: Editable?) {
59+
60+
}
61+
62+
})
63+
64+
3365
/*
3466
* 如果目前所支持的键盘满足不了您的需求,您也可以自定义键盘,KingKeyboard对外提供自定义键盘类型。
3567
* 自定义步骤也非常简单,只需自定义键盘的xml布局,然后将EditText注册到对应的自定义键盘类型即可

gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ android.enableJetifier=true
2020
# Kotlin code style for this project: "official" or "obsolete":
2121
kotlin.code.style=official
2222

23-
VERSION_NAME=1.0.1
24-
VERSION_CODE=2
23+
VERSION_NAME=1.0.2
24+
VERSION_CODE=3
2525
GROUP=com.github.jenly1314
2626

2727
POM_DESCRIPTION=KingKeyboard for Android

lib/src/main/java/com/king/keyboard/KeyboardView.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import android.os.Handler;
3131
import android.os.Message;
3232
import android.util.AttributeSet;
33+
import android.util.Log;
3334
import android.util.TypedValue;
3435
import android.view.GestureDetector;
3536
import android.view.Gravity;
@@ -1157,6 +1158,7 @@ public boolean onTouchEvent(MotionEvent me) {
11571158
}
11581159
mOldPointerCount = pointerCount;
11591160

1161+
11601162
return result;
11611163
}
11621164

@@ -1177,6 +1179,7 @@ private boolean onModifiedTouchEvent(MotionEvent me, boolean possiblePoly) {
11771179
// Ignore all motion events until a DOWN.
11781180
if (mAbortKey
11791181
&& action != MotionEvent.ACTION_DOWN && action != MotionEvent.ACTION_CANCEL) {
1182+
mRepeatKeyIndex = NOT_A_KEY;
11801183
return true;
11811184
}
11821185

@@ -1190,6 +1193,7 @@ private boolean onModifiedTouchEvent(MotionEvent me, boolean possiblePoly) {
11901193
// Needs to be called after the gesture detector gets a turn, as it may have
11911194
// displayed the mini keyboard
11921195
if (mMiniKeyboardOnScreen && action != MotionEvent.ACTION_CANCEL) {
1196+
mRepeatKeyIndex = NOT_A_KEY;
11931197
return true;
11941198
}
11951199

@@ -1303,9 +1307,12 @@ private boolean onModifiedTouchEvent(MotionEvent me, boolean possiblePoly) {
13031307
}
13041308

13051309
private boolean repeatKey() {
1306-
Key key = mKeys[mRepeatKeyIndex];
1307-
detectAndSendKey(mCurrentKey, key.x, key.y, mLastTapTime);
1308-
return true;
1310+
if(mRepeatKeyIndex != NOT_A_KEY){
1311+
Key key = mKeys[mRepeatKeyIndex];
1312+
detectAndSendKey(mCurrentKey, key.x, key.y, mLastTapTime);
1313+
return true;
1314+
}
1315+
return false;
13091316
}
13101317

13111318
protected void swipeRight() {

lib/src/main/java/com/king/keyboard/KingKeyboard.kt

Lines changed: 50 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -297,36 +297,7 @@ open class KingKeyboard {
297297
playSoundEffect()
298298
sendVibrationEffect()
299299
}
300-
//根据不同的按键值去处理
301-
when(primaryCode){
302-
KEYCODE_SHIFT -> keyShift()
303-
KEYCODE_MODE_CHANGE -> keyModeChange()
304-
KEYCODE_CANCEL -> keyCancel(primaryCode)
305-
KEYCODE_DONE -> keyDone(primaryCode)
306-
KEYCODE_DELETE -> keyDelete()
307-
KEYCODE_ALT -> keyAlt()
308-
KEYCODE_MODE_BACK -> keyBack(false)
309-
KEYCODE_BACK -> keyBack(true)
310-
KEYCODE_MORE -> keyMore()
311-
//预留值,具有相同的作用
312-
KEYCODE_KING_SHIFT -> keyShift()
313-
KEYCODE_KING_MODE_CHANGE -> keyModeChange()
314-
KEYCODE_KING_CANCEL -> keyCancel(primaryCode)
315-
KEYCODE_KING_DONE -> keyDone(primaryCode)
316-
KEYCODE_KING_DELETE -> keyDelete()
317-
KEYCODE_KING_ALT -> keyAlt()
318-
KEYCODE_KING_MODE_BACK -> keyBack(false)
319-
KEYCODE_KING_BACK -> keyBack(true)
320-
KEYCODE_KING_MORE -> keyMore()
321-
//预留的自定义可扩展按键
322-
in -999..-300 -> keyExtra(primaryCode)
323-
//直接输入按键值
324-
in 32..Int.MAX_VALUE -> keyInput(primaryCode)
325-
//无效的按键值,打印相关日志
326-
else -> Log.d(TAG,"primaryCode:$primaryCode")
327-
}
328-
onKeyboardActionListener?.onKey(primaryCode,keyCodes)
329-
300+
performKey(primaryCode, keyCodes)
330301
}
331302

332303
override fun onText(text: CharSequence?) {
@@ -390,6 +361,50 @@ open class KingKeyboard {
390361
rootView.viewTreeObserver.addOnGlobalFocusChangeListener(globalFocusChangeListener)
391362
}
392363

364+
/**
365+
* 根据 primaryCode 发送按键事件,可通过调用触发去执行按键值对应的功能(仅限功能键)
366+
* 特别说明:之所以仅限功能键,是因为如果对外支持输入相关的按键值,会破坏输入内容的限制。
367+
*/
368+
fun sendKey(primaryCode: Int){
369+
if(primaryCode < 0){
370+
performKey(primaryCode, IntArray(1) { primaryCode })
371+
}
372+
}
373+
374+
/**
375+
* 根据 primaryCode去做相应的处理
376+
*/
377+
private fun performKey(primaryCode: Int, keyCodes: IntArray?){
378+
when(primaryCode){
379+
KEYCODE_SHIFT -> keyShift()
380+
KEYCODE_MODE_CHANGE -> keyModeChange()
381+
KEYCODE_CANCEL -> keyCancel(primaryCode)
382+
KEYCODE_DONE -> keyDone(primaryCode)
383+
KEYCODE_DELETE -> keyDelete()
384+
KEYCODE_ALT -> keyAlt()
385+
KEYCODE_MODE_BACK -> keyBack(false)
386+
KEYCODE_BACK -> keyBack(true)
387+
KEYCODE_MORE -> keyMore()
388+
//预留值,具有相同的作用
389+
KEYCODE_KING_SHIFT -> keyShift()
390+
KEYCODE_KING_MODE_CHANGE -> keyModeChange()
391+
KEYCODE_KING_CANCEL -> keyCancel(primaryCode)
392+
KEYCODE_KING_DONE -> keyDone(primaryCode)
393+
KEYCODE_KING_DELETE -> keyDelete()
394+
KEYCODE_KING_ALT -> keyAlt()
395+
KEYCODE_KING_MODE_BACK -> keyBack(false)
396+
KEYCODE_KING_BACK -> keyBack(true)
397+
KEYCODE_KING_MORE -> keyMore()
398+
//预留的自定义可扩展按键
399+
in -999..-300 -> keyExtra(primaryCode)
400+
//直接输入按键值
401+
in 32..Int.MAX_VALUE -> keyInput(primaryCode)
402+
//无效的按键值,打印相关日志
403+
else -> Log.d(TAG,"primaryCode:$primaryCode")
404+
}
405+
onKeyboardActionListener?.onKey(primaryCode,keyCodes)
406+
}
407+
393408
/**
394409
* 自定义键盘Custom,键盘类型为{@link KeyboardType#CUSTOM}
395410
*
@@ -928,9 +943,9 @@ open class KingKeyboard {
928943
}
929944
//震动
930945
vibrator?.let {
931-
if (Build.VERSION.SDK_INT >= 26) {
946+
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
932947
it.vibrate(VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK))
933-
}else{
948+
} else {
934949
it.vibrate(16L)
935950
}
936951
}
@@ -946,7 +961,9 @@ open class KingKeyboard {
946961
*/
947962
private fun keyDown(keycode: Int,action: Int = KeyEvent.ACTION_DOWN){
948963
currentEditText?.let {
949-
it.onKeyDown(keycode, KeyEvent(action,keycode))
964+
if(it.text.isNotEmpty()){
965+
it.onKeyDown(keycode, KeyEvent(action,keycode))
966+
}
950967
}
951968
}
952969

versions.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//App
22
def app_version = [:]
3-
app_version.versionCode = 2
4-
app_version.versionName = "1.0.1"
3+
app_version.versionCode = 3
4+
app_version.versionName = "1.0.2"
55
ext.app_version = app_version
66

77
//build version

0 commit comments

Comments
 (0)