[android]自定義軟鍵盤(pán)KeyBoardView的基本實(shí)現(xiàn)

前言

★本文簡(jiǎn)述:

  1. 簡(jiǎn)單通過(guò)KeyBoardView實(shí)現(xiàn)自定義鍵盤(pán)功能赵抢。
  2. 真的只是給和我一樣的渣渣簡(jiǎn)單介紹剧蹂,所以了解過(guò)的可以慢走不送了~
  3. 太簡(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)有效果圖要被掄:

簡(jiǎn)單的鍵盤(pán).gif

看到以上效果圖简烤,估計(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è)置focusablefocusableInTouchMode焦點(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)單介紹下:

  1. onPress: 按下觸發(fā)史辙。
  2. onRelease:松開(kāi)觸發(fā)汹买。
  3. onKey : 松開(kāi)觸發(fā),在OnRelease之前觸發(fā)聊倔。
  4. swipeLeft : 左滑動(dòng)晦毙,其他同理。哈哈~就這么懶耙蔑。
  5. 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é)束遂庄。

路人葵:希望能幫到有需要的小伙伴們嘿嘿

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末寥院,一起剝皮案震驚了整個(gè)濱河市劲赠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌秸谢,老刑警劉巖凛澎,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異估蹄,居然都是意外死亡塑煎,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)臭蚁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)最铁,“玉大人,你說(shuō)我怎么就攤上這事垮兑±湮荆” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵系枪,是天一觀的道長(zhǎng)雀哨。 經(jīng)常有香客問(wèn)我,道長(zhǎng)私爷,這世上最難降的妖魔是什么雾棺? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮衬浑,結(jié)果婚禮上捌浩,老公的妹妹穿的比我還像新娘。我一直安慰自己工秩,他們只是感情好嘉栓,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著拓诸,像睡著了一般侵佃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奠支,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天馋辈,我揣著相機(jī)與錄音,去河邊找鬼倍谜。 笑死迈螟,一個(gè)胖子當(dāng)著我的面吹牛叉抡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播答毫,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼褥民,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了洗搂?” 一聲冷哼從身側(cè)響起消返,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎耘拇,沒(méi)想到半個(gè)月后撵颊,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惫叛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年倡勇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘉涌。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡妻熊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出仑最,到底是詐尸還是另有隱情扔役,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布词身,位于F島的核電站厅目,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏法严。R本人自食惡果不足惜损敷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望深啤。 院中可真熱鬧拗馒,春花似錦、人聲如沸溯街。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)呈昔。三九已至挥等,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間堤尾,已是汗流浹背肝劲。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辞槐。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓掷漱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親榄檬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子卜范,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,756評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件鹿榜、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,059評(píng)論 4 62
  • 偶然的瞬間犬缨,你收到一個(gè)多年來(lái)未聯(lián)系的小學(xué)同學(xué)的來(lái)電喳魏,被告知對(duì)方要結(jié)婚了棉浸。是的怀薛,你沒(méi)聽(tīng)錯(cuò),也不要驚訝迷郑,她要結(jié)婚了枝恋。你...
    誰(shuí)還記得那年初夏閱讀 328評(píng)論 0 2
  • 最能揭示潛力的兩項(xiàng)特質(zhì)。 根據(jù)幾年前流傳的一則故事嗡害,Google曾將它的Lvl.99數(shù)據(jù)處理技術(shù)應(yīng)用于面試和業(yè)務(wù)評(píng)...
    bd3250545d54閱讀 422評(píng)論 0 1
  • 在藏族人家焚碌,一進(jìn)門(mén)就能看到各種壁畫(huà)。其中霸妹,就少不了吉祥四瑞的圖案十电。民間常以此祥瑞圖表達(dá)藏族人對(duì)生活團(tuán)結(jié)和睦...
    小猴子不會(huì)爬樹(shù)閱讀 7,829評(píng)論 0 8