您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么實現(xiàn)物理按鍵的長按事件”,在日常操作中,相信很多人在怎么實現(xiàn)物理按鍵的長按事件問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么實現(xiàn)物理按鍵的長按事件”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
核心實現(xiàn)代碼如下:
有同學(xué)可能會說:這樣實現(xiàn)有什么問題嗎?看起來合情合理,用起來也沒問題啊!
是的!從功能實現(xiàn)角度,這樣做是最簡單的,代碼量最少,能立即可用。然而,大家也需要意識到:OnButtonPressed() 和 OnButtonReleased() 是在中斷上下文中調(diào)用的!因此,這兩個函數(shù)必須快速返回,不能做過于繁重的工作。但是作為框架,這兩個中斷函數(shù)又必須調(diào)用相應(yīng)的回調(diào)函數(shù)。。。這樣子的話,就要求傳入的回調(diào)函數(shù)必須短小精悍,不能過于繁瑣!!于是,V0.0.1版本的實現(xiàn)短板就凸顯了:當(dāng)按鍵按下后需要做的處理必須足夠簡單,如果比較復(fù)雜和繁瑣,就可能造成系統(tǒng)中斷響應(yīng)不及時,進而導(dǎo)致系統(tǒng)PANIC重啟!!!
那么有沒有辦法解決這個問題呢?
辦法當(dāng)然是有的!!既然V0.0.1版本的問題和中斷響應(yīng)相關(guān),那么可以借鑒Linux內(nèi)核中的原則和方案:中斷服務(wù)程序的執(zhí)行越快越好,將中斷處理分為兩部分:中斷處理上半部和中斷處理下半部。
解釋:
中斷發(fā)生后需要立即調(diào)用中斷服務(wù)程序進行中斷處理,如果直接在中斷服務(wù)程序中做這個處理,那么處理速度必須越快越好!
但是,肯定有一些情況的處理步驟是比較耗時和復(fù)雜的,在這種情況下,就可以先把要做的處理工作進行標記(中斷上半部),具體處理步驟在中斷服務(wù)程序返回后再完成(中斷下半部)。
是不是感覺很抽象,理解不了了?! 沒關(guān)系,我們通過V0.0.2版本的設(shè)計實現(xiàn)給大家講解這個方案。
上圖中的示例就是DTButton - V0.0.2的核心實現(xiàn),現(xiàn)在應(yīng)該感覺很簡單了吧。嘿嘿!因為是通用框架,所以最終的代碼實現(xiàn)要考慮的東西很多,比上圖中的示例看起來要復(fù)雜些。
現(xiàn)在,這個框架比起上一個版本有了很大的改進,并且還擁有了專用的事件處理線程!也正是因為創(chuàng)建了這個線程,所以不能浪費啊,必須多多利用才行。
那么還能用它來干點啥呢???
大家想想,現(xiàn)在能夠捕捉到按鍵的按下事件和釋放事件了!!
那么,如果按下事件和釋放事件之間的時間間隔比較長,那么是不是我們就可以“創(chuàng)造“一個全新的長按事件呢???
答案是肯定的!
按下事件發(fā)生后,可以通過事件處理線程進行粗略計時,當(dāng)計時超過預(yù)設(shè)的時間間隔(大概2.5秒),即可觸發(fā)長按事件,具體表現(xiàn)為長按事件回調(diào)函數(shù)的調(diào)用。
這里需要注意:
1. 長按事件只會觸發(fā)一次,即:OnButtonLongPressed() 回調(diào)函數(shù)只會調(diào)用一次
2. 釋放事件觸發(fā)時需要停止計時,即:按下事件和釋放事件之間的時間間隔不足2.5秒就不會觸發(fā)長按事件
有了上面的分析,大家就可以自己嘗試動手實現(xiàn)了。
什么?覺得麻煩?
沒事!我已經(jīng)將實現(xiàn)代碼上傳到了文末的附件中,大家可以下載使用和研究,非常歡迎大家的意見和建議。
使用示例如下:
1. 定義按鍵事件回調(diào)函數(shù)
2. 一鍵注冊,開箱即用
運行結(jié)果如下:
到此,關(guān)于“怎么實現(xiàn)物理按鍵的長按事件”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。