編輯:關於Android編程
long firstClickTime = 0; long secondClickTime = 0; public void click1(View view) { if (firstClickTime > 0) { secondClickTime = SystemClock.uptimeMillis(); if (secondClickTime - firstClickTime < 500) { Toast.makeText(this, "第一種雙擊方式", 0).show(); } firstClickTime = 0; return ; } firstClickTime = SystemClock.uptimeMillis(); new Thread(new Runnable() { @Override public void run() { // try { Thread.sleep(500); firstClickTime = 0; } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start(); }雙擊事件(多擊事件)中有兩個重要的問題需要考慮:第一次點擊的時間,最後(如何知道是“最後”)點擊的時間;點擊一次後,等待一段時間(比如2s),再次雙擊(多擊)如何保證得到正確的響應。 上面的代碼解決了這兩個問題,但不夠效率,也很復雜。它是通過一個變量存儲第一次點擊的時間,通過判斷這個變量的大小來判斷是不是第二次點擊,解決第一個問題;再加上子線程的sleep方法,500ms內如果沒有第二次點擊,變量就重置了,解決了第二個問題。 但是這種方式解決雙擊事件還算湊合,那麼三擊、四擊……如何解決了?
Listtimes = new ArrayList (); public void click2(View view) { times.add(SystemClock.uptimeMillis()); if (times.size() == 2) { //已經完成了一次雙擊,list可以清空了 if (times.get(times.size()-1)-times.get(0) < 500) { times.clear(); Toast.makeText(this, "第二種雙擊方式", 0).show(); } else { //這種情況下,第一次點擊的時間已經沒有用處了,第二次就是“第一次” times.remove(0); } } }
在第二種方式中,使用List存放點擊時的時間。現在來分析一下這個實現的原理:1、如何判斷是第二次點擊?
通過鏈表的長度,每次點擊list的長度加1,當為2時,表示點擊了兩次。2、如何消除間隔一段時間的點擊事件的影響?
如果是正常的雙擊,點擊兩次就完成一次“輪回”,之前保存的時間數據已經使用完畢了,需要清除掉,具體操作就是將List清空。而如果是點擊一次後,第二次點擊相隔時間較長,那個第一次點擊的時間已經沒有用處了,就直接將第二次點擊視為“第一次”點擊,具體而言就是去掉第1次的點擊事件。
這個方法,比起第一種方法效率要好得多,而且非常容易擴展到三擊、四擊……事件。比如:Listtimes = new ArrayList (); public void click2(View view) { times.add(SystemClock.uptimeMillis()); if (times.size() == 3) { if (times.get(times.size()-1)-times.get(0) < 500) { times.clear(); Toast.makeText(this, "三擊方式", 0).show(); } else { times.remove(0); } } }
改變的只是判斷條件。第三種,谷歌程序員的寫法。
下面是谷歌所寫的三擊方法,我改寫成了雙擊的方法/** * 雙擊事件、多擊事件 */ //存儲時間的數組 long[] mHits = new long[2]; public void doubleClick() { // 雙擊事件響應 /** * arraycopy,拷貝數組 * src 要拷貝的源數組 * srcPos 源數組開始拷貝的下標位置 * dst 目標數組 * dstPos 開始存放的下標位置 * length 要拷貝的長度(元素的個數) * */ //實現數組的移位操作,點擊一次,左移一位,末尾補上當前開機時間(cpu的時間) System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1); mHits[mHits.length - 1] = SystemClock.uptimeMillis(); //雙擊事件的時間間隔500ms if (mHits[0] >= (SystemClock.uptimeMillis() - 500)) { //雙擊後具體的操作 //do } }非常簡潔,思想差不多,不過谷歌工程師是利用數組移位操作來消除第二個問題的影響的。而要實現多擊事件,只需修改數組長度即可。
介紹圓角控件常用於頭像,按鈕,圖標等,用途十分廣泛,而且常常配合board使用。在IOS中,UIVIew的CALayer層已經提供了圓角和board的方法,所以圓角控件的
1.介紹Runtime Permissions官方說明Android 6.0之前,權限在應用安裝過程中只詢問一次,以列表的形式展現給用戶,然而大多數用戶並不會注意到這些,
前面一篇文章中我們講解了android裡面的多渠道打包,對於大型的app來說,幾百個上千個渠道包都是很正常的事,所以效率定制化是一件很重要的事。主要講解了三種多渠道打包方
一、前言本文主要來介紹一個實際案例就是如何通過這個框架來修改系統的地理位置信息來實現隱藏功能,在如今社交工具的發展特別是微信,他有一個實時位置共享功能,那麼對於那些不是單