一般來說Android用戶比較熟悉的按鈕交互方式有兩種:單擊與長按解滓。雙擊這個交互且不說合不合理,但需求來了總是要做的立由。關于這個交互,最先想到的是Android手機系統(tǒng)中序厉,連續(xù)點擊版本號6次可以打開開發(fā)者模式這一場景锐膜。這個場景比較簡單,只需要計數就好弛房,而我這里的需求道盏,同一個按鈕,單擊與雙擊會觸發(fā)不同的事件文捶。
出于職業(yè)嗅覺荷逞,首先考慮的是有沒有相關API可以調用,查閱了一下粹排,果然找到GestureDetector.OnDoubleTapListener這個接口正適合目前的需求种远。OnDoubleTapListener的間接子類叫SimpleOnGestureListener,我只需要重寫下按鈕的onTouch事件顽耳,在重寫方法里做事件分發(fā)即可坠敷,于是乎問題迎刃而解:
button.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
});
GestureDetector gestureDetector = new GestureDetector(Activity.this, new GestureDetector.SimpleOnGestureListener() {
/**
* 發(fā)生確定的單擊時執(zhí)行
* @param e
* @return
*/
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {//單擊事件
Toast.makeText(Activity.this,"這是單擊事件", Toast.LENGTH_SHORT).show();
return super.onSingleTapConfirmed(e);
}
/**
* 雙擊發(fā)生時的通知
* @param e
* @return
*/
@Override
public boolean onDoubleTap(MotionEvent e) {//雙擊事件
Toast.makeText(Activity.this,"這是單擊事件",Toast.LENGTH_SHORT).show();
return super.onDoubleTap(e);
}
/**
* 雙擊手勢過程中發(fā)生的事件,包括按下射富、移動和抬起事件
* @param e
* @return
*/
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
return super.onDoubleTapEvent(e);
}
});
假如沒有這樣的API膝迎,我們要自己實現,可以怎么做呢胰耗。這里比較繞的地方就是單擊和雙擊事件都要照顧限次,但二者又有聯系和沖突,然后我想了個辦法柴灯,通過Hander發(fā)送不同的消息來標記兩個事件卖漫,兩次點擊之間如果小于某個時間差,就認為觸發(fā)雙擊事件弛槐,單擊事件消息的發(fā)送延遲略長于這個時間差懊亡,如果在這之間觸發(fā)了雙擊事件,就撤回單擊事件的消息發(fā)送乎串,這樣單擊就不會被執(zhí)行店枣,代碼如下速警。
public class MainActivity extends Activity {
long mLastTime=0;
long mCurTime=0;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1:
Toast.makeText(MainActivity.this,"這是單擊事件",Toast.LENGTH_LONG).show();
break;
case 2:
Toast.makeText(MainActivity.this,"這是雙擊事件",Toast.LENGTH_LONG).show();
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mLastTime=mCurTime;
mCurTime= System.currentTimeMillis();
if(mCurTime-mLastTime<300){//雙擊事件
mCurTime =0;
mLastTime = 0;
handler.removeMessages(1);
handler.sendEmptyMessage(2);
}else{//單擊事件
handler.sendEmptyMessageDelayed(1, 310);
}
}
});
}
}
跑起來也沒什么問題,很OK的樣子鸯两,不知道大家有沒有其他的好辦法闷旧,可以交流討論。