android View中如何判断长按事件
16lz
2021-01-26
一、如果用户在获得焦点的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毫秒
更多相关文章
- SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
- 解读Android之Service(3)AIDL
- Android(安卓)LayoutInflater.inflate 的使用及源码分析
- Android(安卓)CoordinatorLayout之源码解析
- Android如何获取判断是否有悬浮窗权限
- (原创)Android(安卓)Studio常用快捷键大全
- Android(安卓)Java层的anti-hooking技巧
- Android学习【3】Android开发问题记录
- Android(安卓)实现点击两次BACK键退出应用