❶ android怎麼監聽手指抬起屏幕的事件
一般情況下,你在MotionEvent.ACTION_UP或者MotionEvent.ACTION_POINTER_UP等UP事件的回調中處理即可,因為手指在屏幕上如果按著即使不動的情況下,其實Action_move仍在回調,就是用戶比較難模擬出來那種完全手指按著屏幕一個像素點也沒有動的情況。
或者你不想在UP事件中處理,那麼就在Move中檢測單位事件內移動的具體,比如100ms內如果用戶手指移動距離小於你自己定義的閥值的話,可以認為用戶沒有移動手指。
寫了半天才發現你問的不是這個問題。
你的問題可以通過先計算你將要滑動屏幕到的最終位置,然後通過判斷你現在已經滑動到的位置,如果兩個位置間的距離小於某個閥值比如一像素的話,那麼就可以看做屏幕滑動停止了。
可以參考一下launcher中對屏幕滑動結束的處理邏輯。
❷ Android框架 ImageButton如何實現 按住和松開時的事件
這個可以用onTouch來實現,touch事件有手指按下,移動,放開的相關api。
關於Touch事件的說明:
1.關於事件構成
在Android中,事件主要包括點按、長按、拖拽、滑動等,點按又包括單擊和雙擊,另外還包括單指操作和多指操作。所有這些都構成了Android中的事件響應。總的來說,所有的事件都由如下三個部分作為耐森基礎:
1.按下(ACTION_DOWN)
2.移動(ACTION_MOVE)
3.抬起(ACTION_UP)
所有的操作事件首先必須執行的是按下操作(ACTIONDOWN),之後所有的操作都是以按下操作作為前提,當按下操作完成後,接下來可能是一段移動(ACTIONMOVE)然後抬起(ACTION_UP),或者是按下操作執行完成後沒有移動就直接抬起。這一系列的動作在Android中都可以進行控制。
2.事件的處理API
在View和ViewGroup中都存在dispatchTouchEvent和onTouchEvent方法,但是在ViewGroup中還有一個onInterceptTouchEvent方法,在Android中,所有的事件都是從開始經過傳遞到完成事件的卜畝耐消費,這些方法的返回值就決定了某一事件是否是繼續往下傳,還是被攔截了,或是被消費了。
public boolean dispatchTouchEvent(MotionEvent event)
public boolean onTouchEvent(MotionEvent event)
public boolean onInterceptTouchEvent(MotionEvent event)
3.事件處理API的說明
dispatchTouchEvent方法用於事件的分發,Android中所有的事件都必須經過這個方法的分發,然後型春決定是自身消費當前事件還是繼續往下分發給子控制項處理。返回true表示不繼續分發,事件沒有被消費。返回false則繼續往下分發,如果是ViewGroup則分發給onInterceptTouchEvent進行判斷是否攔截該事件。
onTouchEvent方法用於事件的處理,返回true表示消費處理當前事件,返回false則不處理,交給子控制項進行繼續分發。
onInterceptTouchEvent是ViewGroup中才有的方法,View中沒有,它的作用是負責事件的攔截,返回true的時候表示攔截當前事件,不繼續往下分發,交給自身的onTouchEvent進行處理。返回false則不攔截,繼續往下傳。
❸ Android手勢---GestureDetector
GestureDetector 可以使用 MotionEvents 檢測各種手勢和事件。
這個類只能用於檢測觸摸事件的 MotionEvent
GestureDetector有三個內部介面,兩個內部類
他們都是起到監聽器的作用
注意:SimpleOnGestureListener繼承了GestureDetector的三個內部介面
GestureDetector自帶了五個構造方法,但是有兩個被廢棄了
因為第三個調用第二個,所以只要關注前面兩個就行了
我們發現第二個構造方法中多了一個Handler變數
一般來說,不會使用這個構造方法
但是因為GestureDetector中的數據是給GestureHandler內部類進行處理,這個類會使用Handle,由穗穗Handler的知識知道,創建Handler必須有Looper,但是在一些新開的線程中沒有創建Looper,所以我們需要傳入一個帶了Looper的Handler變數,否則,GestureDetector對象會創建失敗
按下是所以手勢必定有的動作
所以無論什麼手勢,第一個調用的方法就是onDown
注意:
GestureDetector的點擊對圖片,按鈕等無用
為了解決這個問題,我們可以
這兩個方法都可以響應到單擊事件,但是他們之間還是有區別的
當我們同時在監聽器中覆寫這兩個方法,並且進行單擊事件
我們會發現當進行單擊事件的時候,這幾個方法響應的順序是這樣的
首先onDown()必定是第一個執行的,但是會發現onSingleTapUp在onSingleComfirmed之前執行
我查閱了相關文檔,發現他們雖然同樣響應的是當手指離開屏幕的活動,但是 onSingleTapUp是立即執行 ,而 onSingleComfirmed卻要在離開後300ms後才執行 ,這樣悉世的目的是確認我們進行的是單擊事件(為了防止我們在300ms內再次進行單擊事件),所以他們的名字分別是Up和Comfirmed
所以,在 設置雙擊事件時,最好使用onSingleComfirmed(),進行雙擊時不會回調單擊方法
這兩個方法都可以響應雙擊事件,為了驗證他們的區別,我們同樣在一個響應器中覆寫這兩個方法,並且進行雙擊事件(我們這里單擊事件使用onSingleComfirmed)
我們使用Log.e()把方法響應的順序弄出來,發現他們規律很神奇
然後我在onDoubleTapEvent()中吧MotionEvent e 輸出,
然後方法響應的順序變成:
我們對以上信息進行分析:
DoubleTap在DoubleTapEvent前面執行,但是根據DoubleTapEvent的第一個MotionEvent是Down,所以判斷 雙擊的響應條件是在第一次單擊後的300ms內按下手指
我們又嘗試在雙擊後手指不離開屏幕,可見隨時間的延長,Move也變得更多,
由此判斷, onDoubleTapEvent是實時回調的,並且是用來檢測MotionEvent
這次我們在響應器中覆寫所有方法,進行長按操作
發現方法響應的順序為:
也就是說,在長按睜族肢時,onShowPress在onLongPress前面執行
同樣,我們覆寫所有方法,進行滑動操作,
發現方法的響應順序為
由此可見,在滑動/拖動過程中,不斷調用onScroll,最後調用onFiling
當然,Android自帶的手勢不能完全滿足我們的需求,於是Android提供了自建手勢的方法,這些內容將在下一篇博客中陳述