導航:首頁 > 操作系統 > android按住事件

android按住事件

發布時間:2023-04-05 07:51:38

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的說明

  1. dispatchTouchEvent方法用於事件的分發,Android中所有的事件都必須經過這個方法的分發,然後型春決定是自身消費當前事件還是繼續往下分發給子控制項處理。返回true表示不繼續分發,事件沒有被消費。返回false則繼續往下分發,如果是ViewGroup則分發給onInterceptTouchEvent進行判斷是否攔截該事件。

  2. onTouchEvent方法用於事件的處理,返回true表示消費處理當前事件,返回false則不處理,交給子控制項進行繼續分發。

  3. onInterceptTouchEvent是ViewGroup中才有的方法,View中沒有,它的作用是負責事件的攔截,返回true的時候表示攔截當前事件,不繼續往下分發,交給自身的onTouchEvent進行處理。返回false則不攔截,繼續往下傳。

⑵ Android開發中,長按事件怎麼獲得屏幕坐標點

對於很多游戲使用屏幕控制一般需要考慮長按事件,比如在動作類的游戲中需要長按發射武器,結合Android Button模型,我們實現一個帶圖片的Button的長按,為了更清晰的顯示原理,Android開發網這里使用ImageButton作為基類.
public class RepeatingImageButton extends ImageButton {
private long mStartTime; //記錄長按開始
private int mRepeatCount; //重復次數計數
private RepeatListener mListener;
private long mInterval = 500; //Timer觸發間隔,即每0.5秒算一次按下

public RepeatingImageButton(Context context) {
this(context, null);
}
public RepeatingImageButton(Context context, AttributeSet attrs) {
this(context, attrs, android.R.attr.imageButtonStyle);
}
public RepeatingImageButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setFocusable(true); //允許獲得焦點
setLongClickable(true); //啟用長按事件
}

public void setRepeatListener(RepeatListener l, long interval) { //實現重復按下事件listener
mListener = l;
mInterval = interval;
}

@Override
public boolean performLongClick() {
mStartTime = SystemClock.elapsedRealtime();
mRepeatCount = 0;
post(mRepeater);
return true;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) { // 本方法原理同onKeyUp的一樣,這里處理屏幕事件,下面的onKeyUp處理Android手機上的物理按鍵事件
removeCallbacks(mRepeater);
if (mStartTime != 0) {
doRepeat(true);
mStartTime = 0;
}
}
return super.onTouchEvent(event);
}
//處理導航鍵事件的中鍵或軌跡球按下事件
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_ENTER:
super.onKeyDown(keyCode, event);
return true;
}
return super.onKeyDown(keyCode, event);
}
//當按鍵彈起通知長按結束
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_ENTER:

removeCallbacks(mRepeater); //取消重復listener捕獲
if (mStartTime != 0) {
doRepeat(true); //如果長按事件累計時間不為0則說明長按了
mStartTime = 0; //重置長按計時器
}
}
return super.onKeyUp(keyCode, event);
}

private Runnable mRepeater = new Runnable() { //在線程中判斷重復
public void run() {
doRepeat(false);
if (isPressed()) {
postDelayed(this, mInterval); //計算長按後延遲下一次累加
}
}
};
private void doRepeat(boolean last) {
long now = SystemClock.elapsedRealtime();
if (mListener != null) {
mListener.onRepeat(this, now - mStartTime, last ? -1 : mRepeatCount++);
}
}

下面是重復Button Listener介面的定義,調用時在Button中先使用setRepeatListener()方法實現RepeatListener介面
public interface RepeatListener {
void onRepeat(View v, long ration, int repeatcount); //參數一為用戶傳入的Button對象,參數二為延遲的毫秒數,第三位重復次數回調。
}
}

本類大家可以直接在自己的View中implements實現RepeatListener介面即可.

⑶ android 長按事件 和 長按彈出上下文菜單如何處理

android 底層在當你點擊控制項2秒後就屬於長按事件了,則進入長按事件監聽,當點擊少於2秒就直接進入點擊事件了,望有幫助

⑷ android中利用View中的onTouchEvent捕捉長按事件

在自定義定view中想要實現的效果是知睜祥:當手機按住屏幕時,如果在指定的時間內沒有移動(如1秒),那麼進入長按模式,此時手指在屏幕上移動都算作長按模式。如果手機按住屏幕就立馬移動,那麼就算作移動模式。

MotionEvent提供了當前的操作類型,按下(搭搏ACTION_DOWN)、 移動 (ACTION_MOVE)、彈起 (ACTION_UP)。MotionEvent 類同時提供了記錄當前坐標的函早唯數(getX(),getY())。event.getDownTime()用來記錄event發生時的時間,event.getEventTime()用來記錄最近一個ACTION_MOVE發生時的時間。

大概思路如下:在按下時記錄x,y坐標以及按下時間,當第一次移動的時候獲取移動的時間,如果大於指定的長按時間,那麼進入長按模式,否則就是普通的移動模式。很容易在模擬器裡面實現了這個效果,但是當在真機裡面運行時,卻無法實現這樣的效果。原來模擬器點擊的時候能夠保證在不移動滑鼠的情況下不觸發ACTION_MOVE,但是真機卻很敏感,幾乎在ACTION_DOWN後的幾毫秒之後就立馬不停的ACTION_MOVE了。想了一下,其實只要稍微變通下變可以在真機上也實現相同的效果了。那就是判斷ACTION_MOVE後的坐標和ACTION_DOWN的坐標的偏移值是否小於我們指定的偏移像素,如果在指定值內,那麼認為沒有移動。

⑸ Android系統判斷長按和點擊

首先,支持長按和點擊的視圖一定是從Down開始就消費事件,在不設置Touch監聽器OnTouchListener的情況下,每個事件缺旅慧都會進入onTouchEvent方法。

當一個視圖設置了長按監聽器,在Flag中會增加LONG_CLICKABLE標志。View內部靜態類ListenerInfo集合了與View相關的各類監聽。

Down事件時,會調用一個checkForLongClick方法,向主線程延遲發送一個Runnable。

延遲時間即系統認為多久算長按事件的時間,如果期間手指一直在觸屏,當到達該時間時伏答,主線程調度該任務,run方法,將觸發performLongClick方法,系統認為這是一次長按事件。

手指還在觸摸時,就會調用長按監聽器的onLongClick方法,如果未達到時間,手指已經離開屏幕,Up事件,此時,如果還沒有執行過Runnable,將會調用removeCallbacks方法移除該任務,確鎮拍保手指離開後不會再觸發長按Runnable,同時,執行performClick方法,系統認為這是一次點擊事件。

任重而道遠

⑹ 移動端android,長按事件時,touchend事件不觸發的解決方法

下面記錄一個在工作中,遇到的touchend事件不觸發的bug解決方法:

就是當長按特定按鈕的時候,會啟動一個事件,往杯子裡面裝水,當松開後,會有相關的操作,但是發現在部分安卓手機裡面,長按鬆手後,touchend事件觸發不了。一開始在網上找了好多回復,都說在touchstart事件裡面加上茄肆e.preventDefault()就可以啦,但是經過親身試驗後,發現此方法對長按事件無效!
後來只能查看了一下touch其他的事件,發現還有 touchcancel 這么一頌緩個東西!
這個事件是顫櫻轎在,當觸控點被特定的實現方式打亂時觸發 的,於是就懷著死馬當活馬醫的心情,在頁面添加了touchcancel事件,裡面執行的邏輯和touchend事件裡面的邏輯是一模一樣的,結果還真是不讓人失望,完美解決!

閱讀全文

與android按住事件相關的資料

熱點內容
android藍牙開發源碼 瀏覽:607
如何查看電腦系統伺服器ip地址查詢 瀏覽:389
把文件夾設鎖 瀏覽:570
命令行語句 瀏覽:218
企友3e財務如何連接伺服器 瀏覽:984
華為手機如何刪除卸載app殘留數據 瀏覽:543
rpm的命令作用 瀏覽:365
如何查看網站的伺服器時間 瀏覽:850
編譯局和人民出版社 瀏覽:652
java泛型extends 瀏覽:326
頭條程序員教學 瀏覽:772
安卓合並什麼意思 瀏覽:530
linux在光碟引導 瀏覽:537
imap伺服器地址怎麼查 瀏覽:654
作曲教程pdf 瀏覽:506
pr怎麼壓縮文件大小 瀏覽:863
查看oracle字元集命令 瀏覽:179
鋰電池增加密度 瀏覽:661
linux用戶密碼忘記 瀏覽:242
gb壓縮天然氣 瀏覽:635