Android交互體驗必知:功能按鍵事件
譯文
【51CTO獨家譯文】本文為翻譯自外文網(wǎng)站tutsplus.com的《Android交互體驗必知:功能按鍵事件》。以下為全部譯文:
開始學習
每一種Android設(shè)備一般都會提供除字母和數(shù)字外的物理功能按鍵,這一般是根據(jù)不同的Android制造商而有所不同,比如Sony就只實現(xiàn)了這些功能按鍵中的三種而已。這些功能按鍵如果設(shè)計良好,對于正在開發(fā)的app應(yīng)用,能給用戶帶來很好交互體驗。
Android應(yīng)用主要是基于Activities的設(shè)計,這個相信大多數(shù)開發(fā)者都已經(jīng)十分熟悉,并可以在官方開發(fā)手冊中學習到。而今天我們準備學習的是如何通過實現(xiàn)KeyEvent.Callback這個接口從而能重新定義Android設(shè)備上的功能按鍵,為我們開發(fā)的應(yīng)用服務(wù)。
功能按鍵的常量定義和方法
KeyEvent類有多個定義好的key常量,表示一個標準的Android設(shè)備中的功能按鍵,列表入下:
功能按鍵 |
常量定義 |
描述 |
Power |
KEYCODE_POWER |
打開設(shè)備或者將設(shè)備喚醒 |
Back |
KEYCODE_BACK |
回到上一屏(頁) |
Home |
KEYCODE_HOME |
返回主菜單(屏幕) |
SEARCH |
KEYCODE_SEARCH |
打開一個搜索 |
CAMERA |
KEYCODE_CAMERA |
打開攝像頭功能 |
VOLUME |
KEYCODE_VOLUME_UP KEYCODE_VOLUME_DOWN |
調(diào)節(jié)音量大小 |
讀者可以從官方文檔中,找到更多關(guān)于功能按鍵的常量定義,以上列表的只是常用的幾個。
對于功能按鍵的調(diào)用,常用的回調(diào)方法有入下幾個:
- onKeyDown()
- onKeyUp()
- onKeyLongPress()
而對于設(shè)備中的軌跡球或者觸摸屏幕,常用的回調(diào)方法有入下幾個:
- onTrackballEvent()
- onTouchEvent()
開發(fā)者可以選擇只實現(xiàn)上面談到的某些回調(diào)方法即可,不需要全部都實現(xiàn)。例如,如果想避免用戶偶然按下了CAMERA或者SEARCH檢索的功能鍵,則只需要在onKeyDown()的回調(diào)方法中進行編寫代碼控制,并返回true的值,讓系統(tǒng)知道當前捕捉的是onkeyDown事件即可。
關(guān)于特殊的鍵
然而,有些特殊的鍵是開發(fā)者沒有辦法去重新定制的,因為它們直接由系統(tǒng)去調(diào)用,比如象power和home鍵,BACK回退鍵也是特殊鍵之一,盡管如果開發(fā)者要重新定制其行為的話,可以重新覆寫onBackPressed()方法,但在一般情況下,強烈不建議開發(fā)者這樣去做,因為回退鍵本身功能是回到上一屏的,重新定制的話會給用戶帶來很多困擾。
下面我們就以一個具體例子說明如何定制這些功能鍵。
步驟1建立Android工程
首先打開eclipse,選擇新建立一個Android功能,將工程命名為KeyControl,選擇使用Android2.1版本的SDK,***點FINISH完成創(chuàng)建,如下圖:
步驟2重寫onKeyDown()方法
首先學習重寫onKeyDown()方法,代碼如下:
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- switch(keyCode){
- case KeyEvent.KEYCODE_MENU:
- Toast.makeText(this, "Menu key pressed", Toast.LENGTH_SHORT).show();
- return true;
- case KeyEvent.KEYCODE_SEARCH:
- Toast.makeText(this, "Search key pressed", Toast.LENGTH_SHORT).show();
- return true;
- case KeyEvent.KEYCODE_BACK:
- onBackPressed();
- return true;
- case KeyEvent.KEYCODE_VOLUME_UP:
- event.startTracking();
- return true;
- case KeyEvent.KEYCODE_VOLUME_DOWN:
- Toast.makeText(this,"Volumen Down pressed", Toast.LENGTH_SHORT).show();
- return false;
- }
- return super.onKeyDown(keyCode, event);
- }
在上面的代碼中,在onKeyDown方法中,分別根據(jù)keycode去判斷觸發(fā)的是哪個功能鍵,例如菜單menu鍵,BACK鍵,搜索功能鍵盤,聲音鍵等,并且通過Toast的顯示方式實現(xiàn)了自己的功能,而沒有調(diào)用原先該功能鍵盤的實際功能。其中請注意的是,上面代碼中對KeyEvent.KEYCODE_VOLUME_DOWN的捕捉事件中,返回的值不是true,而是false,則表明由系統(tǒng)直接處理該功能事件,當用戶按下聲音鍵時,實際上已經(jīng)是通過系統(tǒng)調(diào)用而減少了音量大小。
步驟3重寫onKeyUp方法
同樣道理,我們重寫onKeyUp方法,代碼如下:
- @Override
- public boolean onKeyUp(int keyCode, KeyEvent event) {
- switch(keyCode){
- case KeyEvent.KEYCODE_MENU:
- Toast.makeText(this, "Menu key released", Toast.LENGTH_SHORT).show();
- return true;
- case KeyEvent.KEYCODE_SEARCH:
- Toast.makeText(this, "Search key released", Toast.LENGTH_SHORT).show();
- return true;
- case KeyEvent.KEYCODE_VOLUME_UP:
- if(event.isTracking() && !event.isCanceled())
- Toast.makeText(this, "Volumen Up released", Toast.LENGTH_SHORT).show();
- return true;
- case KeyEvent.KEYCODE_VOLUME_DOWN:
- Toast.makeText(this, "Volumen Down released", Toast.LENGTH_SHORT).show();
- return true;
- }
- return super.onKeyUp(keyCode, event);
- }
在上面的代碼中,基本跟之前的onKeyDown()方法中介紹的功能一樣,分別對Menu菜單,Search檢索功能,減少音量三個鍵重新覆寫了方法,用Toast的方式顯示信息。而在Volumeup音量增加的按鍵事件捕捉中,如果用戶一段時間沒按下去的話,則會提示出錯信息。
步驟4重寫onKeyLongPress方法
重寫onKeyLongPress方法的代碼如下:
- @Override
- public boolean onKeyLongPress(int keyCode, KeyEvent event) {
- Toast.makeText(this, "Pressed for a long time =) ", Toast.LENGTH_SHORT).show();
- return true;
- }
onKeyLongPress方法是在當在onKeyDown()方法中,對某一個功能鍵調(diào)用了event.startTracking()方法跟蹤,并且按下這個功能鍵有一陣時間后才觸發(fā)。所以上面的代碼我們是在按下音量的增加功能鍵一陣時間后,會顯示提示信息。event.startTracking()方法之能在同一時間監(jiān)視一個按鍵,如果同一時間另外一個按鍵也按下,則該事件會取消對前一個按鍵的跟蹤。
步驟5重寫onBackPressed()方法
代碼如下:
- @Override
- public void onBackPressed() {
- Toast.makeText(this, "Back key pressed =)", Toast.LENGTH_SHORT).show();
- super.onBackPressed();
- }
依然要提醒讀者注意的是,***不要重寫該方法,因為會給用戶的操作體驗帶來困擾。
步驟6重寫onTouchEvent()方法
代碼如下:
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- float x = event.getX();
- float y = event.getY();
- Toast.makeText(this, "Touch press on x: " + x + " y: "+y, Toast.LENGTH_SHORT).show();
- return true;
- }
在上面的代碼中,在onTouchEvent方法中,當用戶觸摸屏幕時,會獲得觸摸點所在的X坐標和Y坐標,并顯示出來。
小結(jié)
本文中,簡單介紹了在Android中如何對常見的功能按鍵進行覆寫的方法以及其中的注意點。讀者可以在應(yīng)用中,根據(jù)實際情況需要進行定制,以設(shè)計出更好的用戶體驗的應(yīng)用。
原文地址:http://mobile.tutsplus.com/tutorials/android/android-sdk-intercepting-physical-key-events/
【51CTO譯稿,非經(jīng)授權(quán)謝絕轉(zhuǎn)載,合作媒體轉(zhuǎn)載請注明原文出處、作者及51CTO譯者!】