日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android系统中自定义按键的短按、双击、长按事件

發(fā)布時(shí)間:2025/3/15 Android 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android系统中自定义按键的短按、双击、长按事件 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在項(xiàng)目中碰到這樣的問(wèn)題:
由于系統(tǒng)中的按鍵在底層做了重新定義或者新增了按鍵,此時(shí)需要在APP層對(duì)按鍵事件(keyevent)做分解處理,模擬Android系統(tǒng)做法,把keyevent分解成:
1、單擊事件:就是普通key的單擊;
2、雙擊事件:500ms內(nèi)同一按鍵單擊兩次;
3、長(zhǎng)按事件:同一按鍵長(zhǎng)按超過(guò)1000ms(系統(tǒng)中長(zhǎng)按事件為500ms);
4、組合按鍵:兩個(gè)以上按鍵同時(shí)按住;

其中的keyevent可以來(lái)自Activity、View子類的dispatchKeyEvent方法,也可以是我們自定義的接口,也可以是我們發(fā)廣播送上來(lái)的,根據(jù)項(xiàng)目需求;

關(guān)于各事件的原理:
1、雙擊事件:每次點(diǎn)擊的up事件中啟動(dòng)一個(gè)定時(shí)(500ms)線程消息,用Handler.postDelayed()方法。
2、長(zhǎng)按事件:每次點(diǎn)擊的down事件中啟動(dòng)一個(gè)定時(shí)(1000ms)線程消息,用Handler.postDelayed()方法,注意:在RepeatCount==0時(shí)啟動(dòng);
3、組合按鍵:用變量記錄每個(gè)按鍵的狀態(tài),再進(jìn)行判斷;

具體代碼如下:

Java代碼 ?
  • package?com.jerome.util;??
  • ??
  • import?android.content.Context;??
  • import?android.os.Handler;??
  • import?android.util.Log;??
  • import?android.view.KeyEvent;??
  • ??
  • public?class?KeyUtil?{??
  • ????private?boolean?isVolumeDown?=?false;??
  • ????private?boolean?isVolumeUp?=?false;??
  • ????private?boolean?isMenu?=?false;??
  • ????private?int?currentKeyCode?=?0;??
  • ??
  • ????private?static?Boolean?isDoubleClick?=?false;??
  • ????private?static?Boolean?isLongClick?=?false;??
  • ??
  • ????CheckForLongPress?mPendingCheckForLongPress?=?null;??
  • ????CheckForDoublePress?mPendingCheckForDoublePress?=?null;??
  • ????Handler?mHandler?=?new?Handler();??
  • ??
  • ????Context?mContext?=?null;??
  • ????private?String?TAG?=?"";??
  • ??
  • ????public?KeyUtil(Context?context,?String?tag)?{??
  • ????????mContext?=?context;??
  • ????????TAG?=?tag;??
  • ????}??
  • ??
  • ????public?void?dispatchKeyEvent(KeyEvent?event)?{??
  • ????????int?keycode?=?event.getKeyCode();??
  • ??
  • ????????//?有不同按鍵按下,取消長(zhǎng)按、短按的判斷??
  • ????????if?(currentKeyCode?!=?keycode)?{??
  • ????????????removeLongPressCallback();??
  • ????????????isDoubleClick?=?false;??
  • ????????}??
  • ??
  • ????????//?處理長(zhǎng)按、單擊、雙擊按鍵??
  • ????????if?(event.getAction()?==?KeyEvent.ACTION_DOWN)?{??
  • ????????????checkForLongClick(event);??
  • ????????}?else?if?(event.getAction()?==?KeyEvent.ACTION_UP)?{??
  • ????????????checkForDoubleClick(event);??
  • ????????}??
  • ??
  • ????????if?(keycode?==?KeyEvent.KEYCODE_VOLUME_DOWN)?{??
  • ????????????if?(event.getAction()?==?KeyEvent.ACTION_DOWN)?{??
  • ????????????????isVolumeDown?=?true;??
  • ????????????}?else?if?(event.getAction()?==?KeyEvent.ACTION_UP)?{??
  • ????????????????isVolumeDown?=?false;??
  • ????????????}??
  • ????????}?else?if?(keycode?==?KeyEvent.KEYCODE_VOLUME_UP)?{??
  • ????????????if?(event.getAction()?==?KeyEvent.ACTION_DOWN)?{??
  • ????????????????isVolumeUp?=?true;??
  • ????????????}?else?if?(event.getAction()?==?KeyEvent.ACTION_UP)?{??
  • ????????????????isVolumeUp?=?false;??
  • ????????????}??
  • ????????}?else?if?(keycode?==?KeyEvent.KEYCODE_MENU)?{??
  • ????????????if?(event.getAction()?==?KeyEvent.ACTION_DOWN)?{??
  • ????????????????isMenu?=?true;??
  • ????????????}?else?if?(event.getAction()?==?KeyEvent.ACTION_UP)?{??
  • ????????????????isMenu?=?true;??
  • ????????????}??
  • ????????}??
  • ??
  • ????????//?判斷組合按鍵??
  • ????????if?(isVolumeDown??
  • ????????????????&&?isVolumeUp??
  • ????????????????&&?isMenu??
  • ????????????????&&?(keycode?==?KeyEvent.KEYCODE_VOLUME_UP??
  • ????????????????????????||?keycode?==?KeyEvent.KEYCODE_VOLUME_DOWN?||?keycode?==?KeyEvent.KEYCODE_MENU)??
  • ????????????????&&?event.getAction()?==?KeyEvent.ACTION_DOWN)?{??
  • ????????????//組合按鍵事件處理;??
  • ????????????isVolumeDown?=?false;??
  • ????????????isVolumeUp?=?false;??
  • ????????????isMenu?=?false;??
  • ????????}??
  • ????}??
  • ??
  • ????private?void?removeLongPressCallback()?{??
  • ????????if?(mPendingCheckForLongPress?!=?null)?{??
  • ????????????mHandler.removeCallbacks(mPendingCheckForLongPress);??
  • ????????}??
  • ????}??
  • ??
  • ????private?void?checkForLongClick(KeyEvent?event)?{??
  • ????????int?count?=?event.getRepeatCount();??
  • ????????int?keycode?=?event.getKeyCode();??
  • ????????if?(count?==?0)?{??
  • ????????????currentKeyCode?=?keycode;??
  • ????????}?else?{??
  • ????????????return;??
  • ????????}??
  • ????????if?(mPendingCheckForLongPress?==?null)?{??
  • ????????????mPendingCheckForLongPress?=?new?CheckForLongPress();??
  • ????????}??
  • ????????mPendingCheckForLongPress.setKeycode(event.getKeyCode());??
  • ????????mHandler.postDelayed(mPendingCheckForLongPress,?1000);??
  • ????}??
  • ??
  • ????class?CheckForLongPress?implements?Runnable?{??
  • ??
  • ????????int?currentKeycode?=?0;??
  • ??
  • ????????public?void?run()?{??
  • ????????????isLongClick?=?true;??
  • ????????????longPress(currentKeycode);??
  • ????????}??
  • ??
  • ????????public?void?setKeycode(int?keycode)?{??
  • ????????????currentKeycode?=?keycode;??
  • ????????}??
  • ????}??
  • ??
  • ????private?void?longPress(int?keycode)?{??
  • ????????Log.i(TAG,?"--longPress?長(zhǎng)按事件--"?+?keycode);??
  • ????}??
  • ??
  • ????private?void?singleClick(int?keycode)?{??
  • ????????Log.i(TAG,?"--singleClick?單擊事件--"?+?keycode);??
  • ????}??
  • ??
  • ????private?void?doublePress(int?keycode)?{??
  • ????????Log.i(TAG,?"---doublePress?雙擊事件--"?+?keycode);??
  • ????}??
  • ??
  • ????private?void?checkForDoubleClick(KeyEvent?event)?{??
  • ????????//?有長(zhǎng)按時(shí)間發(fā)生,則不處理單擊、雙擊事件??
  • ????????removeLongPressCallback();??
  • ????????if?(isLongClick)?{??
  • ????????????isLongClick?=?false;??
  • ????????????return;??
  • ????????}??
  • ??
  • ????????if?(!isDoubleClick)?{??
  • ????????????isDoubleClick?=?true;??
  • ????????????if?(mPendingCheckForDoublePress?==?null)?{??
  • ????????????????mPendingCheckForDoublePress?=?new?CheckForDoublePress();??
  • ????????????}??
  • ????????????mPendingCheckForDoublePress.setKeycode(event.getKeyCode());??
  • ????????????mHandler.postDelayed(mPendingCheckForDoublePress,?500);??
  • ????????}?else?{??
  • ????????????//?500ms內(nèi)兩次單擊,觸發(fā)雙擊??
  • ????????????isDoubleClick?=?false;??
  • ????????????doublePress(event.getKeyCode());??
  • ????????}??
  • ????}??
  • ??
  • ????class?CheckForDoublePress?implements?Runnable?{??
  • ??
  • ????????int?currentKeycode?=?0;??
  • ??
  • ????????public?void?run()?{??
  • ????????????if?(isDoubleClick)?{??
  • ????????????????singleClick(currentKeycode);??
  • ????????????}??
  • ????????????isDoubleClick?=?false;??
  • ????????}??
  • ??
  • ????????public?void?setKeycode(int?keycode)?{??
  • ????????????currentKeycode?=?keycode;??
  • ????????}??
  • ????}??
  • ??
  • ????private?void?removeDoublePressCallback()?{??
  • ????????if?(mPendingCheckForDoublePress?!=?null)?{??
  • ????????????mHandler.removeCallbacks(mPendingCheckForDoublePress);??
  • ????????}??
  • ????}??
  • }??


  • 注意:
    只有Action Down狀態(tài)下RepeatCount才會(huì)>0,避免長(zhǎng)按和單擊事件混淆;

    轉(zhuǎn)載于:https://www.cnblogs.com/Free-Thinker/p/6113297.html

    總結(jié)

    以上是生活随笔為你收集整理的Android系统中自定义按键的短按、双击、长按事件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲色图日韩精品 | 夜色视频在线观看 | 日本中出视频 | 亚洲人视频在线 | 亚洲色图第一区 | 亚洲无人区码一码二码三码的含义 | jizz日本大全 | 成人毛片网 | 国产美女裸体无遮挡免费视频 | 爱爱视频网址 | 91精品黄色 | 国产精品jizz | 国产精品8888 | 国产精品久久久久久一区二区 | 欧美日韩亚洲二区 | 婷婷色吧 | 神马老子午夜 | 国产乡下妇女做爰视频 | 精品人妻一区二区三区四区不卡 | 九九视频免费看 | 日本一区二区三区免费电影 | 精品肉丝脚一区二区三区 | 欧美高清视频 | 日韩国产成人 | 国产精品一区二区人人爽 | 久色伊人 | 亚洲第一中文字幕 | 日韩成人av在线播放 | 制服下的诱惑暮生 | av中出| 亚洲s码欧洲m码国产av | 澳门黄色 | 色网站观看 | 黑人操日本女人视频 | 日韩欧美一区视频 | 韩国一级淫片免费看 | 成人性生交大片免费看96 | 亚洲成a人在线观看 | 污黄网站在线观看 | 射精一区二区 | 91久久久久一区二区 | 一区在线免费 | 欧美色图俺去了 | 西野翔之公侵犯中文字幕 | 久久亚洲国产 | 日韩精品三区 | 国产精品理论片在线观看 | 看全色黄大色黄大片女一次牛 | 校园春色欧美 | 亚洲第一视频在线观看 | 每日更新在线观看av | 日本黄色美女网站 | 色啪网站 | 成人看片在线 | 蜜桃做爰免费网站 | 综合色视频 | 男阳茎进女阳道视频大全 | 日韩视频一区二区 | 国产福利免费看 | 色综合色综合色综合 | 亚洲色图欧美在线 | 中文字幕一区二区三区人妻四季 | 激情草逼| 精品国偷自产国产一区 | 亚洲爽爽| 婷婷激情六月 | 免费不卡视频 | 久久久ww | 久久这里只有精品首页 | 亚洲理伦电影 | 国内国产精品天干天干 | 国产人妻精品一区二区三区不卡 | 性久久| 野战少妇38p | 日本少妇毛茸茸高潮 | 成人小视频在线观看 | 狠狠干影视 | 深夜国产在线 | 婷婷色综合 | 东北熟女一区二区三区 | 国产对白羞辱绿帽vk | 国产精品亚洲天堂 | 欧美成人精品欧美一级 | 国产精品国产一区 | 欧美日韩国产在线观看 | 欧美一区亚洲 | 亚洲一区二区三区黄色 | 亚洲乱子伦| 成人一卡二卡 | 国产乱色精品成人免费视频 | 成人性生交免费看 | 日本japanese极品少妇 | 美女高潮黄又色高清视频免费 | 国产污污网站 | 波多野结衣视频免费 | 美女诱惑一区二区 | a色视频 | www四虎 | 97干干|