修改九宮格物理按鍵盤支持數(shù)字和字母切換

產(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 */
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诉位,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子菜枷,更是在濱河造成了極大的恐慌苍糠,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啤誊,死亡現(xiàn)場離奇詭異岳瞭,居然都是意外死亡拥娄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門瞳筏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稚瘾,“玉大人,你說我怎么就攤上這事姚炕√罚” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵柱宦,是天一觀的道長些椒。 經(jīng)常有香客問我,道長捷沸,這世上最難降的妖魔是什么摊沉? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮痒给,結(jié)果婚禮上说墨,老公的妹妹穿的比我還像新娘。我一直安慰自己苍柏,他們只是感情好尼斧,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著试吁,像睡著了一般棺棵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上熄捍,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天烛恤,我揣著相機與錄音,去河邊找鬼余耽。 笑死缚柏,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的碟贾。 我是一名探鬼主播币喧,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼袱耽!你這毒婦竟也來了杀餐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤朱巨,失蹤者是張志新(化名)和其女友劉穎史翘,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡恶座,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年搀暑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跨琳。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡自点,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出脉让,到底是詐尸還是另有隱情桂敛,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布溅潜,位于F島的核電站术唬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏滚澜。R本人自食惡果不足惜粗仓,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望设捐。 院中可真熱鬧借浊,春花似錦、人聲如沸萝招。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽槐沼。三九已至曙蒸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間岗钩,已是汗流浹背纽窟。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留兼吓,地道東北人师倔。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像周蹭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子疲恢,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容