前言
★本文簡(jiǎn)述:
- 簡(jiǎn)單通過(guò)
KeyBoardView
實(shí)現(xiàn)自定義鍵盤(pán)功能赵抢。 - 真的只是給和我一樣的渣渣簡(jiǎn)單介紹剧蹂,所以了解過(guò)的可以慢走不送了~
- 太簡(jiǎn)單了,別打我…我知道你已經(jīng)想打我了哈哈
★目的:
也就是我為什么腦抽寫(xiě)這篇文章烦却。
因?yàn)槲宜坪跆懒顺璧穑W(wǎng)上這類(lèi)資料好少基本都是一個(gè)實(shí)例。
看著有點(diǎn)摸不清頭腦~
學(xué)東西不都崇尚又簡(jiǎn)至深其爵,所以我來(lái)做個(gè)簡(jiǎn)單的筆記~
?
話說(shuō)冒冬,你是不是只認(rèn)可我蠢?別往我手上看…沒(méi)刀摩渺。
正文
*我知道沒(méi)有效果圖要被掄:
看到以上效果圖简烤,估計(jì)很多人要吐槽為什么我沒(méi)放個(gè)EditText。
好吧還真沒(méi)放摇幻。雖然我懶但其實(shí)放不放都好横侦。
下一章好好弄個(gè)實(shí)例就好了~
代碼三步走:
- 第一步:
1、新建一個(gè)xml文件夾放在res
目錄下面绰姻,然后新建xml文件枉侧。我這里取名叫做number.xml
。
<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:keyWidth="33.3%p" //這一個(gè)就是每一個(gè)按鈕的寬度
android:keyHeight="100dp" //每一個(gè)按鈕高度狂芋,可以設(shè)置百分比
>
<!--中間內(nèi)容放下面 -->
……
</keyboard>
2榨馁、然后在XML文件中添加按鈕布局,這個(gè)布局就是鍵盤(pán)的樣子了帜矾。
★這邊想說(shuō):codes
將會(huì)是監(jiān)聽(tīng)onKey()
得到按鈕輸出的值辆影,keyLabel
是按鈕顯示的值。
以及android:keyWidth
是單個(gè)按鈕寬度黍特,keyOutputText
可以在之后設(shè)置的監(jiān)聽(tīng)里OnText()
中得到蛙讥。
還有其他屬性就不一一介紹了,比如keyIcon
設(shè)置圖標(biāo)灭衷。
<Row>
<Key android:codes="10" android:keyLabel="1" />
<Key android:codes="20" android:keyLabel="2" />
<Key android:codes="30" android:keyLabel="3" />
</Row>
<Row>
<Key android:codes="40" android:keyWidth="50%p" android:keyLabel="4" android:keyEdgeFlags="left" />
<Key android:codes="OK" android:keyWidth="50%p" android:keyLabel="OK" android:keyOutputText="@string/app_name" android:keyEdgeFlags="right" />
</Row>
- 二次慢、布局文件引用KeyBoradView.
★ 實(shí)際上有很多屬性可以用的,這只是簡(jiǎn)單實(shí)現(xiàn)下翔曲。
最好設(shè)置focusable
和focusableInTouchMode
焦點(diǎn)事件為true迫像。
<android.inputmethodservice.KeyboardView
android:id="@+id/main_keyview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
/>
- 三、實(shí)例化KeyBoradView給其設(shè)置KeyBorad瞳遍,以及
OnKeyboardActionListener
事件監(jiān)聽(tīng)闻妓。
★ 網(wǎng)上大部分事例都是新建了一個(gè)KeyBoradUtil工具類(lèi)來(lái)管理鍵盤(pán)。但是掠械,沒(méi)人說(shuō)必須那樣…不過(guò)這次還是按那個(gè)套路來(lái)由缆,啊哈哈畢竟基礎(chǔ)筆記注祖,搞那么麻煩干啥子咯是吧~
1、新建一個(gè)類(lèi)均唉,我取名叫KeyUtils
然后在里面新建三個(gè)屬性是晨。KeyBoard用處可大了,他才是本體舔箭,可以通過(guò)設(shè)置他來(lái)切換鍵盤(pán)罩缴。
private Context mContext;//上下文對(duì)象
private KeyboardView mKeyboardView;//這個(gè)主角怎么能丟?
private Keyboard mKeyboard;//好吧层扶,其實(shí)他也是主角
2箫章、構(gòu)造函數(shù),初始下三個(gè)參數(shù)镜会。
/** * 必須activity作為上下文對(duì)像 *
@param context
*/
public KeyUtils(Context context) {
mContext = context;
//初始化鍵盤(pán)布局炉抒,下面在放進(jìn) KeyBoardView里面去。
mKeyboard = new Keyboard(mContext,R.xml.number);
//配置keyBoardView
try{
mKeyboardView = (KeyboardView) ((Activity)context).findViewById(R.id.main_keyview);
mKeyboardView.setKeyboard(mKeyboard); //裝甲激活~ 咳咳…
mKeyboardView.setPreviewEnabled(false); //這個(gè)是稚叹,效果圖按住是出來(lái)的預(yù)覽圖焰薄。
//設(shè)置監(jiān)聽(tīng),不設(shè)置的話會(huì)報(bào)錯(cuò)扒袖。監(jiān)聽(tīng)放下面了塞茅。
mKeyboardView.setOnKeyboardActionListener(mListener);
}catch (Exception e){
Log.e("sun","keyview初始化失敗");
}
}
3、先說(shuō)下預(yù)覽圖吧季率,就是效果圖上的預(yù)覽圖野瘦,需要預(yù)覽圖的話的將setPreviewEnabled
設(shè)置為true
,不過(guò)還得在布局文件中的android.inputmethodservice.KeyboardView
標(biāo)簽對(duì)立面設(shè)置預(yù)覽布局飒泻。否則鞭光,不會(huì)有字。至于設(shè)置的布局泞遗,一個(gè)TextView就好了~
android:keyPreviewLayout="@layout/preview_keyboard"
4惰许、握了個(gè)大草的,OnKeyboardActionListener
監(jiān)聽(tīng)貼一下吧~
★ 簡(jiǎn)單介紹下:
- onPress: 按下觸發(fā)史辙。
- onRelease:松開(kāi)觸發(fā)汹买。
- onKey : 松開(kāi)觸發(fā),在OnRelease之前觸發(fā)聊倔。
- swipeLeft : 左滑動(dòng)晦毙,其他同理。哈哈~就這么懶耙蔑。
- onText :需要在 鍵盤(pán)xml见妒,也就是我此時(shí)的
number.xml
里面中key
標(biāo)簽對(duì)里添加一個(gè)keyOutputText
的屬性,打印出來(lái)的就是它的值甸陌。
//監(jiān)聽(tīng)
private KeyboardView.OnKeyboardActionListener mListener = new KeyboardView.OnKeyboardActionListener() {
@Override
public void onPress(int primaryCode) { Log.e("sun","onPress=======:"+primaryCode); }
@Override
public void onRelease(int primaryCode) { Log.e("sun","onRelease====:"+primaryCode); }
@Override
public void onKey(int primaryCode, int[] keyCodes) { Log.e("sun","onkey=====primaryCode:"+primaryCode+""); }
@Override
public void swipeLeft() { Log.e("sun","swipeLeft"); }
@Override
public void swipeRight() { Log.e("sun","swipeRight"); }
@Override
public void swipeDown() { Log.e("sun","swipeDown"); }
@Override
public void swipeUp() { Log.e("sun","swipeUp"); }
};
- 然后在activity中實(shí)例化一下就可以用了须揣。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new KeyUtils(this);
}
最后 :
這感覺(jué)特么的最最最濃縮了吧連樣式什么鬼的都沒(méi)加盐股,哈哈雖然這是我偷懶的理由。
在這基礎(chǔ)上再去看一些實(shí)例效果就簡(jiǎn)單多啦~~~
渣渣文返敬,結(jié)束遂庄。
路人葵:希望能幫到有需要的小伙伴們嘿嘿