一、如果用户在获得焦点的view上按keycode_dpad_center或keycode_enter键,即ok键后,在view的onkeydown方法中会开启一个延迟线程,在延迟线程中会去回调onlongclick()方法,代码如下:
在如下代码中开始延迟线程:
[java]
view plaincopyprint?
public boolean onkeydown(int keycode, keyevent event) {
boolean result = false;
switch (keycode) {
case keyevent.keycode_dpad_center:
case keyevent.keycode_enter: {
if ((mviewflags & enabled_mask) == disabled) {
return true;
}
// long clickable items don't necessarily have to be clickable
if (((mviewflags & clickable) == clickable ||
(mviewflags & long_clickable) == long_clickable) &&
(event.getrepeatcount() == 0)) {
setpressed(true);
if ((mviewflags & long_clickable) == long_clickable) {
postcheckforlongclick(0);//在这里开启延迟线程
}
break;
}
}
return result;
}
延迟线程代码如下:
class checkforlongpress implements runnable {
private int moriginalwindowattachcount;
public void run() {
if (ispressed() && (mparent != null)
&& moriginalwindowattachcount == mwindowattachcount) {
if (performlongclick()) { //这里回调onlongclick()方法
mhasperformedlongpress = true;
}
}
}
public void rememberwindowattachcount() {
moriginalwindowattachcount = mwindowattachcount;
}
二、如果用户在触摸屏上长按某个view,view中首先会检测在这个触摸点移动没,如果没有移动再开启一个延迟线程去回调onlongclick()方法,代码如下:
在view中的ontouchevent中的down事件中:
case motionevent.action_down:
if (mpendingcheckfortap == null) {
mpendingcheckfortap = new checkfortap();
}
mprivateflags |= prepressed;
mhasperformedlongpress = false;
postdelayed(mpendingcheckfortap, viewconfiguration.gettaptimeout());//开始延迟线程检测触摸点移动没
break;
如果没有移动,则会开启一个延迟线程回调onlongclick()方法:
private final class checkfortap implements runnable {
public void run() {
mprivateflags &= ~prepressed;
mprivateflags |= pressed;
refreshdrawablestate();
if ((mviewflags & long_clickable) == long_clickable) {
postcheckforlongclick(viewconfiguration.gettaptimeout());//开启延迟线程回调onlongclick()方法
剩下来就和按键长按一样的处理了。
在其中要注意二个参数:
viewconfiguration.gettaptimeout() 是用于检测触摸点有没有移动的时间,默认为115毫秒
viewconfiguration.getlongpresstimeout() 是用于检测是不是长按的时间,默认为500毫秒