產(chǎn)品有九宮格物理鍵盤炸庞,但是系統(tǒng)源碼不支持中英文切換惯疙,按了只有數(shù)字出來
在網(wǎng)上看到有人做過,參考鏈接如下
https://blog.csdn.net/cuckoochun/article/details/78799112
但這個做法妖啥,并不支持長按霉颠,在英文狀態(tài)下,長按數(shù)字2鍵并不會出現(xiàn)a/b/c的輪換荆虱,所以對代碼進行了修改蒿偎,
這里主要改的是framework層的輸入法,長按的鍵盤的時候會一直觸發(fā)onKeyDwon事件怀读,這里是通過點擊F2鍵進行切換Z:\HT380K_20190705_InputMethod\MTK6755\frameworks\base\core\java\android\inputmethodservice\Inputmethodservice.java
/* begin add by yujl */
private long timeDown, timeUp;
private int count;
private int typeCount = 0;
private String input;
private int lastKeyCode;
private boolean isLongPressed = false;
private boolean isDown = false;
private static final long DELAY_TIME = 700;
private boolean isInput = true;
InputConnection inputConnection;// add by yujl
/* end add by yujl */
下面是onKeyDown方法的處理
public boolean onKeyDown(int keyCode, KeyEvent event) {
/* begin add by yujl */
if (SystemProperties.get("persist.sys.fkey_startApp").equals("false")) {
final EditorInfo ei = getCurrentInputEditorInfo();
if (ei.inputType != 524289 && ei.inputType != InputType.TYPE_NULL
&& ei.inputType != InputType.TYPE_CLASS_NUMBER
&& ei.inputType != InputType.TYPE_NUMBER_FLAG_SIGNED
&& ei.inputType != InputType.TYPE_NUMBER_FLAG_DECIMAL
&& ei.inputType != InputType.TYPE_CLASS_PHONE) {
if (isInput
&& ((keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9)
|| keyCode == KeyEvent.KEYCODE_STAR
|| keyCode == KeyEvent.KEYCODE_F2 || keyCode == KeyEvent.KEYCODE_POUND)) {
handler.removeCallbacks(runnableUp);
if (typeCount != 0) {
if (!isLongPressed) {
timeDown = System.currentTimeMillis();
if (/* keyCode == KeyEvent.KEYCODE_F3|| */lastKeyCode != 0
&& lastKeyCode != keyCode
&& timeDown - timeUp < DELAY_TIME
&& lastKeyCode != KeyEvent.KEYCODE_0
&& !isDown) {
if (typeCount == 2) {
input = input.toUpperCase();
}
inputConnection.commitText(input, 1);
count = 0;
}
if (!isDown && keyCode != KeyEvent.KEYCODE_F2)
handler.postDelayed(runnableDown, DELAY_TIME);
isDown = true;
switch (keyCode) {
case KeyEvent.KEYCODE_0:
input = "0";
return true;
case KeyEvent.KEYCODE_1:
input = "1";
return true;
case KeyEvent.KEYCODE_2:
input = "2";
return true;
case KeyEvent.KEYCODE_3:
input = "3";
return true;
case KeyEvent.KEYCODE_4:
input = "4";
return true;
case KeyEvent.KEYCODE_5:
input = "5";
return true;
case KeyEvent.KEYCODE_6:
input = "6";
return true;
case KeyEvent.KEYCODE_7:
input = "7";
return true;
case KeyEvent.KEYCODE_8:
input = "8";
return true;
case KeyEvent.KEYCODE_9:
input = "9";
return true;
case KeyEvent.KEYCODE_STAR:
input = "*";
return true;
case KeyEvent.KEYCODE_POUND:
input = "#";
return true;
}
} else {
switch (keyCode) {
case KeyEvent.KEYCODE_1:
switch (count % 3) {
case 0:
input = ",";
break;
case 1:
input = ".";
break;
case 2:
input = "@";
break;
}
break;
case KeyEvent.KEYCODE_2:
switch (count % 3) {
case 0:
input = "a";
break;
case 1:
input = "b";
break;
case 2:
input = "c";
break;
}
break;
case KeyEvent.KEYCODE_3:
switch (count % 3) {
case 0:
input = "d";
break;
case 1:
input = "e";
break;
case 2:
input = "f";
break;
}
break;
case KeyEvent.KEYCODE_4:
switch (count % 3) {
case 0:
input = "g";
break;
case 1:
input = "h";
break;
case 2:
input = "i";
break;
}
break;
case KeyEvent.KEYCODE_5:
switch (count % 3) {
case 0:
input = "j";
break;
case 1:
input = "k";
break;
case 2:
input = "l";
break;
}
break;
case KeyEvent.KEYCODE_6:
switch (count % 3) {
case 0:
input = "m";
break;
case 1:
input = "n";
break;
case 2:
input = "o";
break;
}
break;
case KeyEvent.KEYCODE_7:
switch (count % 4) {
case 0:
input = "p";
break;
case 1:
input = "q";
break;
case 2:
input = "r";
break;
case 3:
input = "s";
break;
}
break;
case KeyEvent.KEYCODE_8:
switch (count % 3) {
case 0:
input = "t";
break;
case 1:
input = "u";
break;
case 2:
input = "v";
break;
}
break;
case KeyEvent.KEYCODE_9:
switch (count % 4) {
case 0:
input = "w";
break;
case 1:
input = "x";
break;
case 2:
input = "y";
break;
case 3:
input = "z";
break;
}
break;
case KeyEvent.KEYCODE_STAR:
switch (count % 2) {
case 0:
input = ".";
break;
case 1:
input = "*";
break;
}
break;
case KeyEvent.KEYCODE_POUND:
input = "#";
break;
}
if (typeCount == 2) {
input = input.toUpperCase();
}
inputConnection = getCurrentInputConnection();
inputConnection.setComposingText(input, 1);
count++;
return true;
}
}
if (keyCode == KeyEvent.KEYCODE_F2) {
return true;
}
}
}
}
/* end add by yujl */
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
final ExtractEditText eet = getExtractEditTextIfVisible();
if (eet != null && eet.handleBackInTextActionModeIfNeeded(event)) {
return true;
}
if (handleBack(false)) {
event.startTracking();
return true;
}
return false;
}
return doMovementKey(keyCode, event, MOVEMENT_DOWN);
}
下面是onKeyUp方法的處理
public boolean onKeyUp(int keyCode, KeyEvent event) {
/* begin add by yujl */
if (SystemProperties.get("persist.sys.fkey_startApp").equals("false")) {
final EditorInfo ei = getCurrentInputEditorInfo();
if (ei.inputType != 524289 && ei.inputType != InputType.TYPE_NULL
&& ei.inputType != InputType.TYPE_CLASS_NUMBER
&& ei.inputType != InputType.TYPE_NUMBER_FLAG_SIGNED
&& ei.inputType != InputType.TYPE_NUMBER_FLAG_DECIMAL
&& ei.inputType != InputType.TYPE_CLASS_PHONE) {
if (isInput) {
isDown = false;
if (typeCount != 0
&& /* keyCode != KeyEvent.KEYCODE_POUND && */keyCode != KeyEvent.KEYCODE_F2
&& ((keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9)
|| keyCode == KeyEvent.KEYCODE_STAR || keyCode == KeyEvent.KEYCODE_POUND)) {
long nowTime = System.currentTimeMillis();
inputConnection = getCurrentInputConnection();
if (isLongPressed) {
if (typeCount == 2) {
input = input.toUpperCase();
}
inputConnection.commitText(input, 1);
isLongPressed = false;
} else {
handler.removeCallbacks(runnableDown);
switch (keyCode) {
case KeyEvent.KEYCODE_0:
if (nowTime - timeDown < DELAY_TIME) {
handler.removeCallbacks(runnableDown);
input = " ";
inputConnection.commitText(input, 1);
}
break;
case KeyEvent.KEYCODE_1:
switch (count % 3) {
case 0:
input = ",";
break;
case 1:
input = ".";
break;
case 2:
input = "@";
break;
}
break;
case KeyEvent.KEYCODE_2:
switch (count % 3) {
case 0:
input = "a";
break;
case 1:
input = "b";
break;
case 2:
input = "c";
break;
}
break;
case KeyEvent.KEYCODE_3:
switch (count % 3) {
case 0:
input = "d";
break;
case 1:
input = "e";
break;
case 2:
input = "f";
break;
}
break;
case KeyEvent.KEYCODE_4:
switch (count % 3) {
case 0:
input = "g";
break;
case 1:
input = "h";
break;
case 2:
input = "i";
break;
}
break;
case KeyEvent.KEYCODE_5:
switch (count % 3) {
case 0:
input = "j";
break;
case 1:
input = "k";
break;
case 2:
input = "l";
break;
}
break;
case KeyEvent.KEYCODE_6:
switch (count % 3) {
case 0:
input = "m";
break;
case 1:
input = "n";
break;
case 2:
input = "o";
break;
}
break;
case KeyEvent.KEYCODE_7:
switch (count % 4) {
case 0:
input = "p";
break;
case 1:
input = "q";
break;
case 2:
input = "r";
break;
case 3:
input = "s";
break;
}
break;
case KeyEvent.KEYCODE_8:
switch (count % 3) {
case 0:
input = "t";
break;
case 1:
input = "u";
break;
case 2:
input = "v";
break;
}
break;
case KeyEvent.KEYCODE_9:
switch (count % 4) {
case 0:
input = "w";
break;
case 1:
input = "x";
break;
case 2:
input = "y";
break;
case 3:
input = "z";
break;
}
break;
case KeyEvent.KEYCODE_STAR:
switch (count % 2) {
case 0:
input = ".";
break;
case 1:
input = "*";
break;
}
break;
case KeyEvent.KEYCODE_POUND:
input = "#";
break;
}
if (typeCount == 2) {
input = input.toUpperCase();
}
inputConnection.setComposingText(input, 1);
handler.removeCallbacks(runnableUp);
handler.postDelayed(runnableUp, DELAY_TIME);
count++;
isLongPressed = false;
timeUp = System.currentTimeMillis();
lastKeyCode = keyCode;
}
}
if (keyCode == KeyEvent.KEYCODE_F2) {
switch (typeCount) {
case 0:
typeCount = 1;
break;
case 1:
typeCount = 2;
break;
case 2:
typeCount = 0;
break;
}
input = "";
Intent intent = new Intent("INPUT_STATUS_CHANGE");
intent.putExtra("INPUT_STATUS", typeCount);
sendBroadcast(intent);
}
}
}
}
/* end add by yujl */
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
final ExtractEditText eet = getExtractEditTextIfVisible();
if (eet != null && eet.handleBackInTextActionModeIfNeeded(event)) {
return true;
}
if (event.isTracking() && !event.isCanceled()) {
return handleBack(true);
}
}
return doMovementKey(keyCode, event, MOVEMENT_UP);
}
/* begin add by yujl */
Handler handler = new Handler();
Runnable runnableDown = new Runnable() {
@Override
public void run() {
try {
// inputConnection.commitText(input, 1);
isLongPressed = true;
} catch (Exception e) {
e.printStackTrace();
System.out.println("exception...");
}
}
};
Runnable runnableUp = new Runnable() {
@Override
public void run() {
try {
if (typeCount == 2) {
input = input.toUpperCase();
}
inputConnection.commitText(input, 1);
count = 0;
} catch (Exception e) {
e.printStackTrace();
System.out.println("exception...");
}
}
};
/* end add by yujl */