1. 程式人生 > >android按鍵長按短按功能的實現策略

android按鍵長按短按功能的實現策略

定時器輪休的方式,根據取樣次數來區分長按還是短按 1.當按下鍵1的時候,就不斷的計數,直到你放手電壓值變化,再根據計數的次數判斷上報長按還是短按的功能 沒有按鍵的時候取樣率為HZ/4,取樣是HZ/40 static void  lradc1_data_function(unsigned long data) 248 { 249         volatile unsigned int  reg_val; 250         static int key_pressed = -1, count = 0; 251     int delay = HZ/40; 252         reg_val = readl(KEY_BASSADDRESS+LRADC_DATA1); 253 //       printk("[lkj]  second lradc data1 =0x%x, s_headset_plug=%d \n", reg_val, s_headset_plug); 254         //because recorder app close this, so ....
255
        writel( readl(baseaddr+0x28) | (1<<27),(baseaddr+(0x28))); 256         writel( readl(baseaddr+0x28) | (1<<29),(baseaddr+(0x28))); 257 258         if(s_first_headset_plug != 1 || s_mic_type != 1) { 259                 mod_timer(&mic_data->timer, jiffies +  HZ/4); 260                 printk("[lkj] input key hook key return \n");
261
                return ; 262         } 263     if (reg_val >=0 && reg_val < 0x5 ) 264     { 265             // hook key 266             if (key_pressed == 0) 267                 count++; 268             else { 269                 key_pressed = 0; 270                 count = 0; 271
            } 272              273             if (count > 5) 274             { 275                              sw_pressed[0] = 1; 276                  input_report_key(sun4ikbd_dev, HOOK_KEY, 1); 277                  input_sync(sun4ikbd_dev); 278                  printk("[lkj] input key sw1 down \n"); 279                  count = 0; 280             } 281 282      283      284     } 285     else if( reg_val >= 0x6 && reg_val <= 0xb  )  //根據電壓值採取不同按鍵 286     { 287         // sw2 288             if (key_pressed == 1)  //計數為了減小誤觸以及實現短按長按的功能 289                 count++; 290             else { 291                 key_pressed = 1; 292                 count = 0; 293             } 294              295             if (count > 5)   //計數到大於5時,有2種情況出現 296             { 297                              sw_pressed[1] = 1; 298              //    printk("[lkj] input key sw2 down \n"); 299             } 300 301     } 302     else if ( reg_val >= 0xf && reg_val < 0x1f ) 303     { 304         // sw3 305              if (key_pressed == 2) 306                 count++; 307             else { 308                 key_pressed = 2; 309                 count = 0; 310             } 311              312             if (count > 5) 313             { 314                              sw_pressed[2] = 1; 315            //      printk("[lkj] input key sw3 down \n"); 316             } 317 318    } 319     else if ( reg_val >= 0x34) {//大於0x34時,根據count的次數判斷長按還是短按,並上報不同的功能 320         key_pressed = -1; 321                 if (sw_pressed[0]) 322                 { 323                         sw_pressed[0] = 0; 324                         input_report_key(sun4ikbd_dev, HOOK_KEY, 0); 325                         input_sync(sun4ikbd_dev); 326             //            printk("[lkj] input key sw1 up \n"); 327                 } 328                 if (sw_pressed[1]) 329                 { 330                         sw_pressed[1] = 0; 331             if (count > 20){ 332                          input_report_key(sun4ikbd_dev,KEY_NEXTSONG,1); 333                          input_sync(sun4ikbd_dev); 334                          input_report_key(sun4ikbd_dev, KEY_NEXTSONG, 0); 335                          input_sync(sun4ikbd_dev); 336              337             }//long 338              else{ 339               340                         input_report_key(sun4ikbd_dev, KEY_VOLUMEUP, 1); 341                         input_sync(sun4ikbd_dev); 342                         input_report_key(sun4ikbd_dev, KEY_VOLUMEUP, 0); 343                         input_sync(sun4ikbd_dev); 344               345              }//     shot 346 347                 } 348                 if (sw_pressed[2]) 349                 { 350                         sw_pressed[2] = 0; 351             if (count > 20){ 352                          input_report_key(sun4ikbd_dev,KEY_PREVIOUSSONG,1); 353                          input_sync(sun4ikbd_dev); 354                          input_report_key(sun4ikbd_dev, KEY_PREVIOUSSONG, 0); 355                          input_sync(sun4ikbd_dev); 356              357             }//long 358              else{ 359               360                         input_report_key(sun4ikbd_dev, KEY_VOLUMEDOWN, 1); 361                         input_sync(sun4ikbd_dev); 362                         input_report_key(sun4ikbd_dev, KEY_VOLUMEDOWN, 0); 363                         input_sync(sun4ikbd_dev); 364               365              }//     shot 366                 } 367         count = 0; 368         delay = HZ/4; 369  }

相關推薦

android按鍵功能實現策略

定時器輪休的方式,根據取樣次數來區分長按還是短按 1.當按下鍵1的時候,就不斷的計數,直到你放手電壓值變化,再根據計數的次數判斷上報長按還是短按的功能 沒有按鍵的時候取樣率為HZ/4,取樣是HZ/40 static void  lradc1_data_function(u

Android 按鍵識別

在Android中已經有了長按與短按的識別,只是長按識別的時間比較短 ,大概在1s以上就認為是長按了。主要的思路是設定一個標誌位,利用事件相應次數函式event.getRepeatCount()來設定標誌位。主要用的函式是按鍵響應的三個函式 onKeyLongPress,o

轉 新型的按鍵掃描程式(轉) 寫的很棒

不過我在網上游逛了很久,也看過不少源程式了,沒有發現這種按鍵處理辦法的蹤跡,所以,我將他共享出來,和廣大同僚們共勉。我非常堅信這種按鍵處理辦法的便捷和高效,你可以移植到任何一種嵌入式處理器上面,因為C語言強大的可移植性。 同時,這裡面用到了一些分層的思想,在微控制器

Android中儲存圖片到本地功能實現

文章轉載自http://blog.csdn.net/ccpat/article/details/45314175  感謝原作者~ 本文描述將一個Bitmap物件儲存為一個圖片檔案的主要步驟。儲存的圖片檔案能夠立刻在系統相簿和相簿中找到。 我使用的是一張drawabl

android 監聽上下左右鍵的功能實現

  鍵盤中的上下左右與返回鍵。可以直接監聽,不需要在xml或者其他地方註冊。 主要方法是: public boolean onKeyDown(int kCode,KeyEvent kEvent) { switch(kCode) { case KeyEvent.KEYCODE

Android TCP連線 心跳機制及實現

維護任何一個長連線都需要心跳機制,客戶端傳送一個心跳給伺服器,伺服器給客戶端一個心跳應答, 這樣雙方都知道他們之間的連線是沒有斷開。【客戶端先發送給服務端】 如果超過一個時間的閾值,客戶端沒有收到伺服器的應答,或者伺服器沒有收到客戶端的心跳, 那麼對

Android自動dump hprof檔案的功能實現

要實現這個功能,必須提升許可權,必須滿足以下兩個條件之一 1、在root的裝置上執行 2、如果機子沒root,需要在app的manifest檔案中新增sharedUid,但是使用了這個的話,需要對apk檔案進行系統簽名 android:sharedUserId="andro

android客戶端訊息推送功能實現方案

1.使用第三方推送平臺 如友盟、極光、百度等現成的訊息推送。好處:訊息及時、穩定,整合簡單。不需要自己搭建支援伺服器,但是可能涉及到收費、保密、服務質量、擴充套件等問題。 2、MQTT協議實現android推送 MQTT是一個輕

Android 基於Zxing的掃碼功能實現(二)

本篇文章已授權微信公眾號 guolin_blog (郭霖)獨家釋出 引言 本篇博文是基於 Android 二維碼的掃碼功能實現(一) 文章寫的,建議閱讀這篇文章之前,先看看上篇文章。還有建議閱讀本文的同學,結合zxing的原始碼理解。 上篇部落格說明z

Android中儲存圖片到本地功能實現 .

初學Android時轉載的文章,沒想到還有很多人看,但是今天我才發現我這排版排的什麼玩意啊,根本沒法看!估計也耽誤了很多人的時間!真的很對不住,寫部落格也是個細心的活,不能摻進偷懶的想法。 文章轉載自http://blog.csdn.net/ccpat/article/d

Android app應用多語言切換功能實現

最近在做一個多語言切換的功能,類似於微信的語言切換,搜了下資料基本上都是以下這種: 1. 實現的效果 和微信類似,在設定介面開啟切換語言的介面,選擇語言後重啟 HomeActivity,語言切換完成,下次重新開啟 App ,也是使用者設定的語言。 2. 實現步驟

[Golang] 從零開始寫Socket Server(3): 對連線的處理策略(模擬心跳)

    通過前兩章,我們成功是寫出了一套湊合能用的Server和Client,並在二者之間實現了通過協議交流。這麼一來,一個簡易的socket通訊框架已經初具雛形了,那麼我們接下來做的,就是想辦法讓這

通過DGUS觸控式螢幕實現按鍵啟動不同功能的效果

DGUS中有一個功能,可能用的人不多,所以不太瞭解,叫“觸控式螢幕按壓狀態返回”。這個控制元件也是一個觸控控制元件,配合頁面上的按鈕來實現觸控功能。“觸控式螢幕按壓狀態返回”與普通的“基本觸控”的主要區別在於,它除了可以實現基本觸控的功能(按鍵效果,頁面切換)外,還可以判斷觸

【CC2530強化實訓02】普通延時函數實現按鍵

掃描 -- 技術 unsigned int 切換 pan code count 【CC2530強化實訓02】普通延時函數實現按鍵的長按與短按 【題目要求】 用一個按鍵實現單擊與雙擊的功能已經是很多嵌入式產品的常用手法。使用定時器的間隔定時來計算按鍵按下的時間是通用

【CC2530強化實訓03】定時器間隔定時實現按鍵

【題目要求】       雖然用普通的延時函式能夠實現按鍵長按與短按的判別,但是在實際的工程應用和專案開發中並不好用也不靈活。更多得是藉助定時器的間隔定時來計算按鍵從按下到鬆開的時間間隔,然後通過判斷該時間值來區分按鍵長按與短按的狀態。       在新大陸國賽裝置的黑色

Android POWER KEY 按鍵觸發

功能需求短按實現彈出:重啟或者關機對話方塊                 長按直接關機: 1.短按:     <integer name="config_shortPressOnPowerBehavior">1</integer>     &

Android ListView彈出CheckBox,實現全選,反選,批量刪除功能

ListView長按彈出CheckBox,實現全選,反選,批量刪除功能. 主佈局:activity_main <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="

C++實現功能邏輯程式碼

  if(data.speed==0)         {             qDebug()<<"--------------------------data.speed==0----------------------------------";    

RT5350 openwrt新增Reset按鍵實現重啟系統,復位系統

新增Reset按鍵,實現短按重啟系統,長按復位系統 1、檢視目前的gpio cat /sys/kernel/debug/gpio GPIOs 0-21, platform/10000600.gpio, 10000600.gpio:  gpio-0   (S1        

Android系統中自定義按鍵、雙擊、事件

在專案中碰到這樣的問題: 由於系統中的按鍵在底層做了重新定義或者新增了按鍵,此時需要在APP層對按鍵事件(keyevent)做分解處理,模擬Android系統做法,把keyevent分解成: 1、單擊事件:就是普通key的單擊; 2、雙擊事件:500ms內同一按鍵單擊兩次;