一、如果用户在获得焦点的VIEW上按KEYCODE_DPAD_CENTER或KEYCODE_ENTER键,即OK键后,在VIEW的onKeyDown方法中会开启一个延迟线程,在延迟线程中会去回调onLongClick()方法,代码如下:

在如下代码中开始延迟线程:

 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);//在这里开启延迟线程                    }                    return true;                }                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毫秒



更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 解读Android之Service(3)AIDL
  3. Android(安卓)LayoutInflater.inflate 的使用及源码分析
  4. Android(安卓)CoordinatorLayout之源码解析
  5. Android如何获取判断是否有悬浮窗权限
  6. (原创)Android(安卓)Studio常用快捷键大全
  7. Android(安卓)Java层的anti-hooking技巧
  8. Android学习【3】Android开发问题记录
  9. Android(安卓)实现点击两次BACK键退出应用

随机推荐

  1. MySQL 常用函数总结
  2. 如何选择合适的MySQL日期时间类型来存储
  3. mysql 时间戳的用法
  4. 详细分析mysql MDL元数据锁
  5. MySQL OOM(内存溢出)的解决思路
  6. MySQL MGR 有哪些优点
  7. mysql数据库中字符集乱码问题原因及解决
  8. MySql如何实现远程登录MySql数据库过程解
  9. MySql添加新用户及为用户创建数据库和给
  10. MySQL数据库高级查询和多表查询