當前位置:首頁 » 安卓系統 » android雙擊按鈕

android雙擊按鈕

發布時間: 2023-08-16 07:36:34

『壹』 Android 雙擊單擊事件監聽手勢檢測GestureDetector原理及實現

app我們常用的手勢有很多的地方,比如右滑關閉界面等。手勢控制分為觸發動作(Touch Mechanics,用戶手指在屏幕上如何動作)和觸發行為(Touch Activities,界面上特定動作在特定情境下引發的結果)。這是因為同樣的觸發動作(如單次觸擊)在不同情境下可能會帶來不同的結果(如輕觸,取消,開啟/關閉指示),同樣單次觸發行為(如放大)可能是由多種觸發動作(如捏放,雙次觸擊,雙次觸擊拖拽等)實現。

    一般情況下,我們知道View類有個View.OnTouchListener內部介面,通過重寫他的onTouch(View v, MotionEvent event)方法,我們可以處理一些touch事件,但是這個方法太過簡單,如果需要處理一些復雜的手勢,用這個介面就會很麻煩(因為我們要自己根據用戶觸摸的軌跡去判斷是什麼手勢)。

    Android sdk給我們提供了GestureDetector類,通過這個類我們可以識別很多的手勢,主要是通過他的onTouchEvent(event)方法完成了不同手勢的識別。雖然他能識別手勢,但是不同的手勢要怎麼處理,應該是提供給程序員實現的。

一.GestureDetector簡介

1.組成

GestureDetector類用來識別觸摸屏的各種手勢,它包含了兩個介面和一個內部類:

介面:

OnGestureListener:用來監聽手勢事件(6種)。

OnDoubleTapListener:用來監聽雙擊事件。

內部類:

SimpleOnGestureListener:用來監聽所有的手勢。實際上它實現了上述兩個介面,不過方法體是空的,需要我們自己寫。我們可以繼承這個類,重寫裡面的方法進行手勢處理。

2.構造

GestureDetector gestureDetector = new GestureDetector(GestureDetector.OnGestureListener listener);

GestureDetector gestureDetector = new GestureDetector(Context context,GestureDetector.OnGestureListener listener);

GestureDetector gestureDetector = new GestureDetector(Context context,GestureDetector.SimpleOnGestureListener listener);

3.方法

(1)onTouchEvent(MotionEvent ev) 分析捕捉到的觸摸事件觸發相應的回調函數

(2)setIsLongpressEnabled(boolean isLongpressEnabled) 設置「長按」是否可用

(3)setOnDoubleTapListener(GestureDetector.OnDoubleTapListener onDoubleTapListener) 設置雙擊監聽器

4.使用

流程:

首先,系統捕捉屏幕的觸摸事件(onTouchListener),這時還未涉及具體手勢,只是簡單地捕捉到觸摸。

接著,在onTouch()方法中調用GestureDetector的onTouchEvent()方法,將捕捉到的MotionEvent交給GestureDetector來處理

最後,還需要實現抽象方法。

可根據需要選擇:

重寫OnGestureListener並通過構造函數傳入gestureDetector

重寫OnDoubleTapListener並通過GestureDetector.setOnDoubleTapListener方法傳入gestureDetector

重寫SimpleOnGestureListener並通過構造函數傳入gestureDetector

實現:

註:不要注重我寫的類是什麼類,要注重實現方法自定義view和activity中都可以,根據需要繼承上面三種listener,傳入構造函數即可;

public class TestDemo{

Context context;

public TestDemo(Context context){

this.context = context;

}

private GestureDetectordetector;

private void initView(){

detector =new GestureDetector(context, new MySimple());

detector =new GestureDetector(context, new MyGesture());

detector =new GestureDetector(context, new MyDoubleTap());

setOnTouchListener((v, event) -> {

// 事件監聽交給手勢類來處理

detector.onTouchEvent(event);

return true;

});

}

//與上面二選一

@Override

public boolean onTouchEvent(MotionEvent event) {

return detector.onTouchEvent(event);

}

// 手勢監聽器類SimpleOnGestureListener

    private class MySimple extends GestureDetector.SimpleOnGestureListener {

        @Override

        public boolean onSingleTapUp(MotionEvent e) {//一次單獨的輕擊抬起操作,也就是輕擊一下屏幕,立刻抬起來,才會有這個觸發;如果除了Down以外還有其它操作,那就不再是Single操作了,所以也就不會觸發這個事件

            return super.onSingleTapUp(e);

        }

        @Override

        public void onLongPress(MotionEvent e) {//長按事件;

            super.onLongPress(e);

        }

        @Override

        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {//在屏幕上拖動事件,只要手指移動就會執行,無論是用手拖動view,或者是以拋的動作滾動,都會多次觸發,這個方法在ACTION_MOVE動作發生時就會觸發他不會執行MotionEvent.ACTION_UP,通常用來實現放大縮小和移動。

            return false;

        }

        @Override

        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {//滑動屏幕,用戶按下觸摸屏、快速移動後松開,由1個MotionEvent ACTION_DOWN, 多個ACTION_MOVE, 1個ACTION_UP觸發;是個甩的動作,這個甩的動作是在一個MotionEvent.ACTION_UP(手指抬起)發生時執行,通常用來實現翻頁效果

            return super.onFling(e1, e2, velocityX, velocityY);

        }

        @Override

        public void onShowPress(MotionEvent e) {//down事件發生而move或則up還沒發生前觸發該事件;

            super.onShowPress(e);

        }

        @Override

        public boolean onDown(MotionEvent e) {//down事件用戶按下屏幕

            return super.onDown(e);

        }

        @Override

        public boolean onDoubleTap(MotionEvent e) {//雙擊事件

            return super.onDoubleTap(e);

        }

        @Override

        public boolean onDoubleTapEvent(MotionEvent e) {//雙擊間隔中還發生其他的動作。通知DoubleTap手勢中的事件,包含down、up和move事件(這里指的是在雙擊之間發生的事件,例如在同一個地方雙擊會產生DoubleTap手勢,而在DoubleTap手勢裡面還會發生down和up事件,這兩個事件由該函數通知)

            return super.onDoubleTapEvent(e);

        }

        @Override

        public boolean onSingleTapConfirmed(MotionEvent e) {//單擊事件。用來判定該次點擊是SingleTap而不是DoubleTap,如果連續點擊兩次就是DoubleTap手勢,如果只點擊一次,系統等待一段時間後沒有收到第二次點擊則判定該次點擊為SingleTap而不是DoubleTap,然後觸發SingleTapConfirmed事件。

            return super.onSingleTapConfirmed(e);

        }

    }

// 手勢監聽器類GestureListener

    private class MyGesture extends GestureDetector.OnGestureListener{

        @Override

        public boolean onDown(MotionEvent e) {//down事件用戶按下屏幕

            return false;

        }

        @Override

        public void onShowPress(MotionEvent e) {//down事件發生瞬間而move或則up還沒發生前觸發該事件;

        }

        @Override

        public boolean onSingleTapUp(MotionEvent e) {//一次單獨的輕擊抬起操作,也就是輕擊一下屏幕,立刻抬起來,才會有這個觸發;如果除了Down以外還有其它操作,那就不再是Single操作了,所以也就不會觸發這個事件;

            return super.onSingleTapUp(e);

        }

        @Override

        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {//在屏幕上拖動事件,只要手指移動就會執行,無論是用手拖動view,或者是以拋的動作滾動,都會多次觸發,這個方法在ACTION_MOVE動作發生時就會觸發他不會執行MotionEvent.ACTION_UP,通常用來實現放大縮小和移動。

            return false;

        }

        @Override

        public void onLongPress(MotionEvent e) {//長按事件,超過一定時長觸發該事件回調;

            super.onLongPress(e);

        }

        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {//滑動屏幕,用戶按下觸摸屏、快速移動後松開,由1個MotionEvent ACTION_DOWN, 多個ACTION_MOVE, 1個ACTION_UP觸發;是個甩的動作,這個甩的動作是在一個MotionEvent.ACTION_UP(手指抬起)發生時執行,通常用來實現翻頁效果

            return super.onFling(e1, e2, velocityX, velocityY);

        }

    }

// 手勢監聽器類SimpleOnGestureListener

    private class MyDoubleTap extends GestureDetector.OnDoubleTapListener {

        @Override

        public boolean onDoubleTap(MotionEvent e) {//雙擊事件

            return super.onDoubleTap(e);

        }

        @Override

        public boolean onDoubleTapEvent(MotionEvent e) {//雙擊間隔中還發生其他的動作。通知DoubleTap手勢中的事件,包含down、up和move事件(這里指的是在雙擊之間發生的事件,例如在同一個地方雙擊會產生DoubleTap手勢,而在DoubleTap手勢裡面還會發生down和up事件,這兩個事件由該函數通知)

            return super.onDoubleTapEvent(e);

        }

        @Override

        public boolean onSingleTapConfirmed(MotionEvent e) {//單擊事件。用來判定該次點擊是SingleTap而不是DoubleTap,如果連續點擊兩次就是DoubleTap手勢,如果只點擊一次,系統等待一段時間後沒有收到第二次點擊則判定該次點擊為SingleTap而不是DoubleTap,然後觸發SingleTapConfirmed事件。

            return super.onSingleTapConfirmed(e);

        }

    }

}

關於onFling()和onScroll()的區別:

onFling()是甩,這個甩的動作是在一個MotionEvent.ACTION_UP(手指抬起)發生時執行,而onScroll(),只要手指移動就會執行。他不會執行MotionEvent.ACTION_UP。onFling通常用來實現翻頁效果,而onScroll通常用來實現放大縮小和移動。

關於onSingleTapConfirmed和onSingleTapUp的一點區別: OnGestureListener有這樣的一個方法onSingleTapUp,和onSingleTapConfirmed容易混淆。二者的區別是:onSingleTapUp,只要手抬起就會執行,而對於onSingleTapConfirmed來說,如果雙擊的話,則onSingleTapConfirmed不會執行

SimpleOnGestureListener是GestureDetector類的一個內部類,該類是static class,也就是說它實際上是一個外部類。可以在外部繼承這個類,重寫裡面的手勢處理方法。

1.OnDoubleTapListener是用來檢測滑鼠雙擊事件的

2.SimpleOnGestureListener實際上實現了OnGestureListener 和OnDoubleTapListener,所以它可以完成以上提到的所有手勢識別(9種)

『貳』 安卓手機雙擊喚醒屏幕怎麼實現的

其實雙擊喚醒最早是諾基亞首先使用的,後來逐步被各個手機廠商所借鑒。

雙擊喚醒的原理說來也非常簡單:

1、手機的顯示屏和觸摸屏實際上是兩個單獨工作的組件,只不過觸摸屏是接近透明的,貼在顯示屏上面用戶看不出來。

2、觸摸屏識別手勢信號,傳輸給處理器,顯示屏只是負責顯示相應的圖像。

3、傳統的手機關閉顯示屏時,觸摸屏也是關閉的,兩者都不工作。

4、有喚醒功能的手機如LGG3和HTCOneM8等,在關閉顯示屏,但是觸摸屏還在是通電的,在黑屏的狀態下用戶可以隨時滑動輸入,當你劃出特定的手勢時,就相當於給出了一個開機鍵的信號,處理器識別以後,屏幕開啟,實現雙擊喚醒。

『叄』 android的ontouch方法如何判斷單擊還是雙擊

原生態android 是沒有真正意義上的雙擊事件 也沒有那個概念 。
1、雙擊就是兩次單機,當點擊事件出發時按下的時候出發一次onTouch 事件,抬起的時候,也觸發一個onTouch 事件。
2、如果想做雙擊的話 只能自己進行判斷了,用兩次onTouch 抬起時的時間間隔來定位他是否是雙擊。
3、 第一點擊 抬起後記錄下當前的時候 curreenttime temp0然後保存下來,第二次點擊抬起的時候在記錄下currenttimeemp1,用temp1-temp0 在你指定的時間呢就算是雙擊。用一個標記 錯判斷如果是雙擊了就flag = true 連續的地三四次就不進行處理了,當請求處理完畢後 在吧flag =false。

『肆』 android平板電腦中怎麼樣判斷是單擊還是雙擊

android平板電腦中是沒有雙擊選項的,原因如下:

  1. android平板電腦和電腦系統不同而且操作也是不同的,電腦打開軟體是需要雙擊軟體或者右鍵後單擊選擇打開。

  2. android平板電腦打開軟體只需要點擊一下就可以打開了,點擊軟體2次和點擊1次效果是一樣的,都是會打開軟體的。

『伍』 安卓手機怎麼雙擊屏幕開屏 主要是怕開屏鍵按壞啦

以OPPO安卓手機為例,進入到設置界面,選擇手勢體感。然後在手勢畢高余體感界面中點擊黑屏手勢將雙擊亮屏開啟就可以了。具體的設置方法念高如下:

1、點擊該手機桌面上的設置按鈕進入。

『陸』 android雙擊返回鍵退出為什麼又重新啟動

一、實現思路:
用戶按下返回鍵時設定一個定時器來監控是否2秒內實現了退出,如果用戶沒有接著按返回鍵,則清除第一次按返回鍵的效果,使程序還原到第一次按下返回鍵之前的狀態。定時器是每次用戶按下返回鍵才去創建。
二、功能代碼:
?

/**
* 菜單、返回鍵響應
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(keyCode == KeyEvent.KEYCODE_BACK)
{
exitBy2Click(); //調用雙擊退出函數
}
return false;
}
/**
* 雙擊退出函數
*/
private static Boolean isExit = false;

private void exitBy2Click() {
Timer tExit = null;
if (isExit == false) {
isExit = true; // 准備退出
Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
tExit = new Timer();
tExit.schele(new TimerTask() {
@Override
public void run() {
isExit = false; // 取消退出
}
}, 2000); // 如果2秒鍾內沒有按下返回鍵,則啟動定時器取消掉剛才執行的任務

} else {
finish();
System.exit(0);
}
}

『柒』 安卓怎麼修改home鍵,使home鍵雙擊進後台(也就是像iPhone那樣)

這個不能修改的,只能這樣。

不過安卓可以安姿慎圓裝虛擬Home鍵。下載Easy Touch,功能和蘋果的AssistiveTouch一樣的功能,可以自定義相關的操作,可以很跡塌好的模擬實體的HOME鍵。在各大應用商城都可以下載。

在蘋果中按一次home鍵,返回主界面。雙擊home鍵,出現後台運行程序。長按home鍵,在iPhone 3GS(第三代)和iPhone4(第孝改四代)中會開啟「語音控制」,在iPhone4S(第五代)、iPhone5(第六代)、第三代與第四代iPad中將會開啟Siri語音助手。按電源鍵3秒後,同時按住home鍵10秒,松開電源鍵,保持home鍵15秒,進入DFU模式(越獄用)。連按3下home鍵的功能可以自定義。

熱點內容
滑板鞋腳本視頻 發布:2025-02-02 09:48:54 瀏覽:433
群暉怎麼玩安卓模擬器 發布:2025-02-02 09:45:23 瀏覽:557
三星安卓12彩蛋怎麼玩 發布:2025-02-02 09:44:39 瀏覽:743
電腦顯示連接伺服器錯誤 發布:2025-02-02 09:24:10 瀏覽:537
瑞芯微開發板編譯 發布:2025-02-02 09:22:54 瀏覽:146
linux虛擬機用gcc編譯時顯示錯誤 發布:2025-02-02 09:14:01 瀏覽:239
java駝峰 發布:2025-02-02 09:13:26 瀏覽:652
魔獸腳本怎麼用 發布:2025-02-02 09:10:28 瀏覽:538
linuxadobe 發布:2025-02-02 09:09:43 瀏覽:212
sql2000資料庫連接 發布:2025-02-02 09:09:43 瀏覽:726