android开发自定义键盘,Android 总结:自定义键盘实现原理和三种实例详解
1、實現原理
實現軟鍵盤主要用到了系統的兩個類?Keyboard?和?KeyboardView?.html
1. Keyboard
用于監聽虛擬鍵盤:java
Loads an XML description of a keyboard and stores the attributes of the keys. A keyboard consists of rows of keys . The layout file for a keyboard contains XML that looks like the following snippet :
android:keyWidth="%10p"
android:keyHeight="50px"
android:horizontalGap="2px"
android:verticalGap="2px" >
...
...
1
2
3
4
5
6
7
8
9
10
11
1
2
3
4
5
6
7
8
9
10
11
咱們自定義的每個按鍵都將會有一個?codes?值,好比回退咱們就寫成:android
android:keyIcon="@drawable/sym_keyboard_delete"/>
1
2
1
2
再監聽就是:git
if (primaryCode == Keyboard.KEYCODE_DELETE){}
1
1
這就表示,監聽?delete?事件了!
定義??標簽時經常使用到的?codes / KEYCODE?有:github
public static final int KEYCODE_SHIFT = -1;
public static final int KEYCODE_MODE_CHANGE = -2;
public static final int KEYCODE_CANCEL = -3;
public static final int KEYCODE_DONE = -4;
public static final int KEYCODE_DELETE = -5;
public static final int KEYCODE_ALT = -6;
1
2
3
4
5
6
1
2
3
4
5
6
2. KeyboardView
處理繪制,檢測按鍵,觸摸動做:markdown
A view that renders a virtual?Keyboard. It handles rendering of keys and detecting key presses and touch movements.
咱們會在Activity的xml文件中這樣定義:dom
android:id="@+id/keyboard_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="@color/gray"
android:focusable="true"
android:focusableInTouchMode="true"
android:keyBackground="@drawable/bg_keyboard_selector"
android:keyTextColor="@color/keyTextColor"
android:visibility="gone"
android:keyPreviewLayout="@layout/key_preview_layout"
/>
1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
3
4
5
6
7
8
9
10
11
12
13
其中?android:keyPreviewLayout?指的是每當咱們點擊鍵盤上的某個鍵時,短暫彈出的布局。
屬性名
描述
android:keyBackground
Image for the key.
android:keyPreviewLayout
Layout resource for key press feedback.
android:keyPreviewOffset
Vertical offset of the key press feedback from the key.
android:keyTextColor
Color to use for the label in a key.
android:keyTextSize
Size of the text for character keys.
android:labelTextSize
Size of the text for custom keys with some text and no icon.
android:popupLayout
Layout resource for popup keyboards.
android:verticalCorrection
Amount to offset the touch Y coordinate by, for bias correction.
咱們須要建一個xml文件,來布局咱們的視圖,
通常是在res文件夾中建一個名為xml的文件夾,在里面新創建一個xml布局文件。ide
每個按鍵的屬性主要包括
Android:codes=" " 和 android:keyLabel=""
Activity?就是根據?codes?的值來監聽的。
一些能夠自定義設置,一些須要是?keyboard?中設置好的,要保持一致。布局
2、實例解析:在xml文件中定義
1. 效果圖:
?
建一個類,用于處理軟鍵盤事件,文件名為?KeyboardUtil.Java動畫
2. 定義鍵盤的鍵
鍵盤上鍵的細節和它的位置咱們指定在一個xml文件中,每個鍵都有以下的屬性,
keyLabel?這個屬性是指每一個鍵顯示的文本
codes?這個屬性是指這個鍵表明的字符的unicode
例如,咱們定義了一個字母A,
codes?屬性的值是97,keyLabel屬性的值就是A
若是一個code對應多個key,這個key表明的字符取決于這個key接受到的點擊數taps,例如,一個鍵具備63,33,58編碼:
一次點擊就是??
兩次點擊就是?!
三次點擊就是?:
一個?key?還能夠有一些可選的屬性:
keyEdgeFlags?這個屬性的值能夠是left或者right
這個屬性一般加在一行中最左邊和最右邊的鍵上。
keyWidth?這個屬性定義了鍵的寬度,一般是一個百分比的值。
isRepeatable?這個屬性若是設置為true,那么當長按該鍵時就會
重復接受到該鍵上的動做,在?刪除鍵鍵?和?空格鍵?上一般設為true。
鍵盤上的鍵都是按行分組,一般狀況下咱們每行上的鍵限制到10個之內
英文鍵盤建議每一個鍵占整個鍵盤寬度的10%,咱們將鍵的高度設置為60dp,這個值能夠調整,可是不建議設置低于48dp .
有些鍵的code是負數,負數等于在Keyboard類
中預約義的常量,例如,-5等于Keyboard.KEYCODE_DELETE
3. 定義按鍵聲音
建立一個方法,這個方法的做用就是當咱們按下某個鍵時發出一個聲音,咱們使用?AudioManager?來播放這個聲音,Android SDK給咱們提供了一些鍵盤的聲效,咱們在本身定義的playClick()方法中使用。
private void playClick(int keyCode){
AudioManager am = (AudioManager)getSystemService(AUDIO_SERVICE);
switch(keyCode){
case 32:
am.playSoundEffect(AudioManager.FX_KEYPRESS_SPACEBAR);
break;
case Keyboard.KEYCODE_DONE:
case 10:
am.playSoundEffect(AudioManager.FX_KEYPRESS_RETURN);
break;
case Keyboard.KEYCODE_DELETE:
am.playSoundEffect(AudioManager.FX_KEYPRESS_DELETE);
break;
default:
am.playSoundEffect(AudioManager.FX_KEYPRESS_STANDARD);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
4. 處理按鍵輸入
當用戶按下鍵盤上的一個鍵時,onKey()方法?會被調用,而且發送這個?鍵的unicode值,基于這個值,鍵盤能夠執行如下動做:
若是code是?KEYCODE_DELETE,使用deleteSurroundingText()方法刪除光標左邊的字符。
若是code是?KEYCODE_DONE?,?KEYCODE_ENTER?事件會被發送。
若是code是?KEYCODE_SHIFT,boolean類型的caps的值會被改變,而且使用?setShifted()?方法改變鍵盤的換檔狀態(shift state),當狀態改變時,鍵盤須要重繪,因此的鍵的label被更新了,invalidateAllKeys()?方法用來重繪全部的鍵。
對于?其余全部的codes,只是?簡單的將unicode轉化為字符而且發送到輸入框里,若是這個code表明了字母表里的一個字母,而且caps變量為true,那么咱們須要將字母轉化為大寫。
修改onKey的代碼(這里的功能實現方法跟實例中有誤差):
@Override
public void onKey(int primaryCode, int[] keyCodes) {
InputConnection ic = getCurrentInputConnection();
playClick(primaryCode);
switch(primaryCode){
case Keyboard.KEYCODE_DELETE :
ic.deleteSurroundingText(1, 0);
break;
case Keyboard.KEYCODE_SHIFT:
caps = !caps;
keyboard.setShifted(caps);
kv.invalidateAllKeys();
break;
case Keyboard.KEYCODE_DONE:
ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));
break;
default:
char code = (char)primaryCode;
if(Character.isLetter(code) && caps){
code = Character.toUpperCase(code);
}
ic.commitText(String.valueOf(code),1);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
3、實例解析:繼承EditText自定義view來實現
保證不遮擋輸入框,界面漂亮有動畫。數字鍵盤可隨機,支持純色繪制按鍵。
1. 效果圖
?
這個程序有點Bug,點擊輸入法最底部的三個鍵時,虛擬按鍵也觸發到了。
想解這個Bug的話自行再仔細研究下代碼。
1. 功能特色
在輸入時,保證鍵盤不會擋住輸入框。
能夠直接經過?Edittext?的屬性來配置要顯示的鍵盤布局?xml?文件。點擊?Edittext?輸入框便可彈出鍵盤。
支持屬性配置?已經寫好的鍵盤?xml?。支持屬性配置?是否隨機數字。
支持純色繪制按鍵。默認的?keyboardview?在android2.3等低版本下不能正常顯示純色的按鍵背景。本示范工程經過重寫原有的?keyboardview?來解決這個bug。
注:資源里面只有兩種鍵盤樣式:數字0-9+"000"、0-9+.?。你能夠經過本身寫鍵盤布局xml,而后經過屬性引用來顯示本身的鍵盤。具體能夠參考附件的示范工程。
2. 邏輯分析
1) 生成隨機數的key
先for循環生成0-9的KeyModel,存儲到LinkedList中
LinkedList tempList = new LinkedList();
for (int i = 0; i < count; i++) {
tempList.add(new KeyModel(48 + i, i + ""));
}
1
2
3
4
1
2
3
4
后面經過隨機數,從?LinkedList?中取出KeyModel放入新的?List?中(這里的代碼是?resultList), 而后這里的?List?就是隨機的了。
Random rand = new SecureRandom();
rand.setSeed(SystemClock.currentThreadTimeMillis());
for (int i = 0; i < count; i++) {
int num = rand.nextInt(count - i);
// Log.d(TAG, " rand num"+num);
KeyModel model = tempList.get(num);
// Log.d(TAG, model.toString());
resultList.add(new KeyModel(model.getCode(), model.getLabel()));
tempList.remove(num);
}
1
2
3
4
5
6
7
8
9
10
11
1
2
3
4
5
6
7
8
9
10
11
4、實例解析:以Dialog的形式來實現
1. 效果圖
2. 技術分析略。
5、源碼下載地址:
上面三種“自定義鍵盤”方式并不是嚴格區分。
本博文轉載自 ?http://blog.csdn.net/u014136472/article/details/50257245
原本想本身寫的可是無心中發現這篇博客,感受寫的很好,因此就轉載了。
若是須要對每個例子的源碼進行說明的話,可在評論出說明,我再本身寫一些博文進行分析
總結
以上是生活随笔為你收集整理的android开发自定义键盘,Android 总结:自定义键盘实现原理和三种实例详解的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: c语言版本双人贪吃蛇
- 下一篇: 分享一个自己写的QT小游戏-玛丽奥医生
