如何爲一個按鈕(View)設置任意屢次點擊事件以及能夠同時響應多個屢次點擊事件

一,如何爲一個View設置多點擊事件

此方法只能讓該View響應一個多點擊事件。java

可以使用情景:例如咱們有需求讓一個按鈕只響應一個三擊事件或者四擊事件等ide

代碼:this

/**
	 * 用於處理屢次點擊事件,注意不能多個屢次點擊事件共存.例如,若您設置了三擊事件,用戶在指定時間內只有點擊三下及以上纔會響應事件,
	 * 低於三下不會響應任何事件。
	 * 
	 *
	 */
	public abstract class OnMultiClickLisener
			implements View.OnClickListener {

		// 記錄用戶點擊控件時的時間
		private long[] hit = null;
		// 完成這幾回點擊所需的時間
		private long interval;

		/**
		 * 默認{@link #interval}爲500ms
		 * 
		 * @param hit
		 *            表示此事件是幾擊事件
		 */
		public OnMultiClickLisener(int hit) {
			this(hit, 500L);
		}

		/**
		 * 
		 * @param hit
		 *            表示此事件是幾擊事件
		 * @param interval
		 *            指定時間(ms),用戶完成hit次點擊所費時間在此時間間隔內則視爲完成了屢次點擊事件
		 */
		public OnMultiClickLisener(int hit, long interval) {
			super();
			this.hit = new long[hit];
			this.interval = interval;
		}

		@Override
		public void onClick(View v) {
			System.arraycopy(this.hit, 1, this.hit, 0, this.hit.length - 1);
			this.hit[this.hit.length - 1] = SystemClock.uptimeMillis();
			if (this.hit[this.hit.length - 1] - this.hit[0] < this.interval) {
				// 完成點擊事件時間間隔小於指定時間則多擊事件完成
				this.onMultiClick(v);
			}
		}

		/**
		 * 用戶完成多擊事件時調用的方法
		 * 
		 * @param view
		 *            用戶點擊的View
		 */
		public abstract void onMultiClick(View view);

	}

二 ,如何讓一個View能夠同時響應多個多點擊事件

可以使用情景:例如咱們有需求讓一個按鈕既能夠響應單擊事件也能夠響應雙擊事件,甚至能夠響應更高點擊事件等spa

代碼:code

/**
	 * 用於處理屢次點擊事件,能夠多個屢次點擊事件共存.例如,若您設置了View最多能夠處理四擊事件,用戶在指定時間內點擊了三下,則會依次處理三擊,
	 * 雙擊,單擊事件,除非某一個事件方法返回了true,那麼就不會再執行接下來的事件方法了,若用戶點擊了五下或者更多,那也只會處理四擊,三擊,雙擊,
	 * 單擊事件。
	
	 *
	 */
	public class OnAnyMultiClickLisener implements View.OnClickListener {
		// 記錄用戶點擊控件的次數
		private int hit = 0;
		// 表示最多可響應幾擊事件
		private int count = 0;
		// 完成整個點擊事件所需的時間
		private long interval;
		// 定義一個Timer用於執行定時任務
		private Timer timer;
		// 響應事件的處理器
		private OnAnyMultiClickLisener.OnMultiClickEvent[] liseners = null;

		/**
		 * 默認{@link #interval}爲500ms
		 * 
		 * @param liseners
		 *            處理事件的處理器,傳入n個表明能夠處理在interval時間內從1到n次點擊的事件.
		 *            例如:若傳入了三個處理器,則表示在interval時間內,能夠處理用戶的單擊事件,雙擊事件和三擊事件.
		 *            事件類型的處理分別對應於下標0,1,2
		 */
		public OnAnyMultiClickLisener(
				OnAnyMultiClickLisener.OnMultiClickEvent... liseners) {
			this(500L, liseners);
		}

		/**
		 * 
		 * @param interval
		 *            完成整個點擊事件的時間(ms)
		 * @param liseners
		 *            處理事件的處理器,傳入n個表明能夠處理在interval時間內從1到n次點擊的事件.
		 *            例如:若傳入了三個處理器,則表示在interval時間內,能夠處理用戶的單擊事件,雙擊事件和三擊事件.
		 *            事件類型的處理分別對應於下標0,1,2
		 */
		public OnAnyMultiClickLisener(long interval,
				OnAnyMultiClickLisener.OnMultiClickEvent... liseners) {
			super();
			this.interval = interval;
			this.liseners = liseners;
			this.count = liseners.length;
			this.timer = new Timer();
		}

		@Override
		public void onClick(View v) {
			if (this.hit < this.count) {
				// 用戶點擊次數加1
				this.hit++;
			}
			if (1L == this.hit) {
				final View vv = v;
				// 定義一個定時任務
				final TimerTask task = new TimerTask() {
					@Override
					public void run() {
						// 根據在this.interval時間段內點擊的次數執行相應的點擊事件,處理順序由高次點擊事件到低次點擊事件
						for (int i = hit; i > 0; i--) {
							if (liseners[i - 1].OnMultiClick(vv)) {
								// 若用戶想要此事件獨佔,而再也不向低次事件傳播下去則跳出循環
								break;
							}
						}
						// 完成整個事件處理以後,hit清零
						hit = 0;
						// 取消這個task
						this.cancel();
					}
				};
				// 開啓一個定時任務
				this.timer.schedule(task, this.interval);
			}
		}

		/**
		 * 用於{@link OnAnyMultiClickLisener}多事件處理的處理器
		 * 
		 *
		 */
		public interface OnMultiClickEvent {
			/**
			 * 處理用戶點擊事件的方法
			 * 
			 * @param view
			 *            用戶點擊的View
			 * @return 是否獨佔事件的響應。如果返回true,不然返回false.例如:若值爲false,用戶傳入了三個事件處理器,
			 *         在指定時間內完成了三擊,那麼會優先處理三擊事件,而後處理雙擊事件,最後處理單擊事件,
			 *         固然若在處理雙擊事件時此方法返回了true,那麼事件將不會傳播下去,也就是說不會處理單擊事件。
			 */
			public boolean OnMultiClick(View view);
		}

	}
相關文章
相關標籤/搜索