下面我就以ImageView控件来举例说明,其他控件也是一样的用法。
主要部分代码如下:
public static void registerDoubleClickListener(View view, final OnDoubleClickListener listener) {
if (listener == null) return;
view.setOnClickListener(new View.OnClickListener() {
private static final int DOUBLE_CLICK_TIME = 350; //双击间隔时间350毫秒
private boolean waitDouble = true;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
listener.OnSingleClick((View) msg.obj);
}
};
//等待双击
public void onClick(final View v) {
if (waitDouble) {
waitDouble = false; //与执行双击事件
new Thread() {
public void run() {
try {
Thread.sleep(DOUBLE_CLICK_TIME);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //等待双击时间,否则执行单击事件
if (!waitDouble) {
//如果过了等待事件还是预执行双击状态,则视为单击
waitDouble = true;
Message msg = handler.obtainMessage();
msg.obj = v;
handler.sendMessage(msg);
}
}
}.start();
} else {
waitDouble = true;
listener.OnDoubleClick(v); //执行双击
}
}
});
}
public interface OnDoubleClickListener {
public void OnSingleClick(View v);
public void OnDoubleClick(View v);
}
在需要用的地方,调用以上方法即可:
registerDoubleClickListener(viewHolder.projectImg, //这里是你要监听的控件
new OnDoubleClickListener() {
@Override
public void OnSingleClick(View view) {
final int i = (int) view.getTag();
singleClick(i);
}
@Override
public void OnDoubleClick(View view) {
final int i = (int) view.getTag();
doubleClick(i);
}
});
以上方法是可以同时监听单击事件和双击事件,而且不会冲突;如果你只想写双击事件,也可以用一下逻辑来简单实现:
mLastTime = mCurTime;
mCurTime = System.currentTimeMillis();
if (mCurTime - mLastTime < 500) {
doubleClick();
mCurTime = 0;
}else{
singleClick();
}