android提供了gesturedetector類來處理一些常用的手勢操作,比如說 onlongpress,onfling 等。但這裡不使用gesturedetector,而是直接在自定義view重寫的ontouchevent中進行處理。欲實現的效果是:當手機按住螢幕時,如果在指定的時間內沒有移動(如500毫秒),那麼進入長按模式,此時手指在螢幕上移動都算作長按模式。如果手機按住螢幕就立馬移動,那麼就算作移動模式。
motionevent 類提供了記錄當前座標的函式(getx(),gety())和當前事件產生的時間的函式(geteventtime())以及按下時間(getdowntime())。motionevent同時也提供了當前的操作型別,按下(action_down)、 移動 (action_move)、彈起 (action_up)。有了這些引數,我們便可以輕易的實現想要的效果了。
大概思路如下:在按下時記錄x,y座標以及按下時間,當第一次移動的時候獲取移動的時間,如果大於指定的長按時間,那麼進入長按模式,否則就是普通的移動模式。很容易,在模擬器裡面實現了這個效果,但是當在真機裡面執行時,卻無法實現這樣的效果。原來模擬器點選的時候能夠保證在不移動滑鼠的情況下不觸發action_move,但是真機卻很敏感,幾乎在action_down後的幾毫秒之後就立馬不停的action_move了。想了一下,其實只要稍微變通下變可以在真機上也實現相同的效果了。那就是判斷action_move後的座標和action_down的座標的偏移值是否小於我們指定的偏移畫素,如果在指定值內,那麼認為沒有移動。於是有了如下這個函式。
/*** 判斷是否有長按動作發生* @param lastx 按下時x座標* @param lasty 按下時y座標* @param thisx 移動時x座標* @param thisy 移動時y座標* @param lastdowntime 按下時間* @param thiseventtime 移動時間* @param longpresstime 判斷長按時間的閥值*/privateboolean islongpressed(float lastx,float lasty,
float thisx,float thisy,long lastdowntime,long thiseventtime,long longpresstime)returnfalse;
}在action_down的時候,記錄下lastx,lasty和lastdowntime,在action_move的時候判斷當前是否為長按模式(類標誌變數的方式),如果不是,那麼獲取當前的thisx,thisy和thiseventtime呼叫函式進行判斷。最後別忘記在action_up裡將長按標誌值為false。action_down裡面這樣處理://檢測是否長按,在非長按時檢測if(!mislongpressed)if(mislongpressed)else
在Django框架中編寫Context處理器的方法
寫context處理器的一些建議 編寫處理器的一些建議 使每個context處理器完成盡可能小的功能。使用多個處理器是很容易的,所以你可以根據邏輯塊來分解功能以便將來復用。要注意 template context processors 裡的context processor 將會在基於這個setti...
轉貼BEA 在Oracle中實現各種日期處理完全版
to date格式 day dd number 12 dy abbreviated fri day spelled out friday ddspth spelled out,ordinal twelfth month mm number 03 mon abbreviated mar month s...
兩種方法在VB MAPX中在指定座標處新增符號
兩種方法在vb mapx中在指定座標處新增符號 第一種方法 private sub command1 click dim x as double,y as double x text1.text y text2.text map1.annotations.addsymbol x,y end sub ...