android View中如何判断长按事件
2012-07-31 02:06
197 查看
一、如果用户在获得焦点的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);//在这里开启延迟线程
}
return true;
}
break;
}
}
return result;
}
延迟线程代码如下:
[java]
view plaincopyprint?
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事件中:
[java]
view plaincopyprint?
case MotionEvent.ACTION_DOWN:
if (mPendingCheckForTap == null) {
mPendingCheckForTap = new CheckForTap();
}
mPrivateFlags |= PREPRESSED;
mHasPerformedLongPress = false;
postDelayed(mPendingCheckForTap, ViewConfiguration.getTapTimeout());//开始延迟线程检测触摸点移动没
break;
如果没有移动,则会开启一个延迟线程回调onLongClick()方法:
[java]
view plaincopyprint?
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毫秒
在如下代码中开始延迟线程:
[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);//在这里开启延迟线程
}
return true;
}
break;
}
}
return result;
}
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; }
延迟线程代码如下:
[java]
view plaincopyprint?
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;
}
}
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事件中:
[java]
view plaincopyprint?
case MotionEvent.ACTION_DOWN:
if (mPendingCheckForTap == null) {
mPendingCheckForTap = new CheckForTap();
}
mPrivateFlags |= PREPRESSED;
mHasPerformedLongPress = false;
postDelayed(mPendingCheckForTap, ViewConfiguration.getTapTimeout());//开始延迟线程检测触摸点移动没
break;
case MotionEvent.ACTION_DOWN: if (mPendingCheckForTap == null) { mPendingCheckForTap = new CheckForTap(); } mPrivateFlags |= PREPRESSED; mHasPerformedLongPress = false; postDelayed(mPendingCheckForTap, ViewConfiguration.getTapTimeout());//开始延迟线程检测触摸点移动没 break;
如果没有移动,则会开启一个延迟线程回调onLongClick()方法:
[java]
view plaincopyprint?
private final class CheckForTap implements Runnable {
public void run() {
mPrivateFlags &= ~PREPRESSED;
mPrivateFlags |= PRESSED;
refreshDrawableState();
if ((mViewFlags & LONG_CLICKABLE) == LONG_CLICKABLE) {
postCheckForLongClick(ViewConfiguration.getTapTimeout());//开启延迟线程回调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毫秒
相关文章推荐
- Android View中如何判断长按事件
- android View中如何判断长按事件
- Android判断touch事件点是否在view范围内的方法
- android给 TextView 加上效果和事件响应 判断是否点击函数
- Android ListView 嵌套 ImageView,如何响应ImageView的点击和长按事件
- android如何让某个view触发点击事件
- Android ViewPager 如何判断当前页面是从前一页还是后一页滑动过来
- android ViewPager如何判断左右滑动
- 如何判断Android多次点击事件
- Android 判断触摸点是否在某个view内部,解决子childView与parentView的touch事件冲突
- Android如何基于坐标对View进行模拟点击事件详解
- android textview 如何实现像新浪微博@用户的点击事件
- Android TextView 如何判断是否已经省略
- Android ViewPager 如何判断当前页面是从前一页还是后一页滑动过来
- Android:如何在java代码中覆盖webview中的javascript事件
- android 如何判断一个 View textview imageview etc 是否绘制完成
- Android 中如何才能让 StackView 的 OnItemSelectedListener 侦听器响应选中事件
- 求助: Android 加载 webview, 点击webview 中网页时间, 如何触发 Android 事件
- Android 悬浮球的实现(如何判断是否点击在某View上)(如何自由拖动View)
- Android 判断触摸点是否在某个view的区域,解决子view与parent的touch事件冲突