自定义View,
1. 自定义一个Runnable线程TouchEventCountThread , 用来统计500ms内的点击次数
2. 在MyView中的 onTouchEvent 中调用 上面的线程
3. 自定义一个Handler, 在TouchEventHandler 中 处理 统计到的点击事件, 单击, 双击, 三击, 都可以处理
核心代码如下:
public class MyView extends View { ...... // 统计500ms内的点击次数 TouchEventCountThread mInTouchEventCount = new TouchEventCountThread(); // 根据TouchEventCountThread统计到的点击次数, perform单击还是双击事件 TouchEventHandler mTouchEventHandler = new TouchEventHandler(); @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if (0 == mInTouchEventCount.touchCount) // 第一次按下时,开始统计 postDelayed(mInTouchEventCount, 500); break; case MotionEvent.ACTION_UP: // 一次点击事件要有按下和抬起, 有抬起必有按下, 所以只需要在ACTION_UP中处理 mInTouchEventCount.touchCount++; // 如果是长按操作, 则Handler的消息,不能将touchCount置0, 需要特殊处理 if(mInTouchEventCount.isLongClick) { mInTouchEventCount.touchCount = 0; mInTouchEventCount.isLongClick = false; } break; case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_CANCEL: break; default: break; } return super.onTouchEvent(event); } public class TouchEventCountThread implements Runnable { public int touchCount = 0; public boolean isLongClick = false; @Override public void run() { Message msg = new Message(); if(0 == touchCount){ // long click isLongClick = true; } else { msg.arg1 = touchCount; mTouchEventHandler.sendMessage(msg); touchCount = 0; } } } public class TouchEventHandler extends Handler { @Override public void handleMessage(Message msg) { Toast.makeText(mContext, "touch " + msg.arg1 + " time.", Toast.LENGTH_SHORT).show();
//在此处可以判断msg.arg1的数值是1还是2,来判断单击还是双击
}
}
......
}