天天看点

android View中如何判断长按事件

一、如果用户在获得焦点的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毫秒

继续阅读