如何编写Android View长按事件判断的长尾?

2026-04-01 06:351阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计853个文字,预计阅读时间需要4分钟。

如何编写Android View长按事件判断的长尾?

一、若用户在获得焦点的VIEW上按下KEYCODE_DPAD_CENTER或KEYCODE_ENTER键后,即OK键后,在VIEW的onKeyDown方法中会启动一个延迟线程,在该延迟线程中会调用onLongClick()方法。

代码如下:javaif (user presses OK key) { view.onKeyDown(KeyEvent.KEYCODE_DPAD_CENTER | KeyEvent.KEYCODE_ENTER); new Thread(new Runnable() { @Override public void run() { onLongClick(); } }).start();}


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

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


[java] ​​ view plain​​​ ​​​copy​​​ ​​​print​​​ ​​​?​​



  1. publicbooleanonKeyDown(int
  2. booleanresult=false;

  3. switch
  4. case
  5. case
  6. if
  7. returntrue;
  8. }
  9. //Longclickableitemsdon'tnecessarilyhavetobeclickable
  10. if
  11. (mViewFlags&LONG_CLICKABLE)==LONG_CLICKABLE)&&
  12. 0)){
  13. true);
  14. if
  15. 0);//在这里开启延迟线程
  16. }
  17. returntrue;
  18. }
  19. break;
  20. }
  21. }
  22. return
  23. }


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 plain​​​ ​​​copy​​​ ​​​print​​​ ​​​?​​



  1. classCheckForLongPressimplements

  2. privateint

  3. publicvoid
  4. if(isPressed()&&(mParent!=null)
  5. &&mOriginalWindowAttachCount==mWindowAttachCount){
  6. if(performLongClick()){//这里回调onLongClick()方法
  7. true;
  8. }
  9. }
  10. }

  11. publicvoid
  12. mOriginalWindowAttachCount=mWindowAttachCount;
  13. }
  14. }


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 plain​​​ ​​​copy​​​ ​​​print​​​ ​​​?​​



  1. case
  2. if(mPendingCheckForTap==null){
  3. new
  4. }
  5. mPrivateFlags|=PREPRESSED;
  6. false;
  7. //开始延迟线程检测触摸点移动没
  8. break;


case MotionEvent.ACTION_DOWN:
if (mPendingCheckForTap == null) {
mPendingCheckForTap = new CheckForTap();
}
mPrivateFlags |= PREPRESSED;
mHasPerformedLongPress = false;
postDelayed(mPendingCheckForTap, ViewConfiguration.getTapTimeout());//开始延迟线程检测触摸点移动没
break;


如果没有移动,则会开启一个延迟线程回调onLongClick()方法:


[java] ​​ view plain​​​ ​​​copy​​​ ​​​print​​​ ​​​?​​



如何编写Android View长按事件判断的长尾?

  1. privatefinalclassCheckForTapimplements
  2. publicvoid
  3. mPrivateFlags&=~PREPRESSED;
  4. mPrivateFlags|=PRESSED;
  5. refreshDrawableState();
  6. if
  7. //开启延迟线程回调onLongClick()方法
  8. }
  9. }
  10. }


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毫秒

本文共计853个文字,预计阅读时间需要4分钟。

如何编写Android View长按事件判断的长尾?

一、若用户在获得焦点的VIEW上按下KEYCODE_DPAD_CENTER或KEYCODE_ENTER键后,即OK键后,在VIEW的onKeyDown方法中会启动一个延迟线程,在该延迟线程中会调用onLongClick()方法。

代码如下:javaif (user presses OK key) { view.onKeyDown(KeyEvent.KEYCODE_DPAD_CENTER | KeyEvent.KEYCODE_ENTER); new Thread(new Runnable() { @Override public void run() { onLongClick(); } }).start();}


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

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


[java] ​​ view plain​​​ ​​​copy​​​ ​​​print​​​ ​​​?​​



  1. publicbooleanonKeyDown(int
  2. booleanresult=false;

  3. switch
  4. case
  5. case
  6. if
  7. returntrue;
  8. }
  9. //Longclickableitemsdon'tnecessarilyhavetobeclickable
  10. if
  11. (mViewFlags&LONG_CLICKABLE)==LONG_CLICKABLE)&&
  12. 0)){
  13. true);
  14. if
  15. 0);//在这里开启延迟线程
  16. }
  17. returntrue;
  18. }
  19. break;
  20. }
  21. }
  22. return
  23. }


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 plain​​​ ​​​copy​​​ ​​​print​​​ ​​​?​​



  1. classCheckForLongPressimplements

  2. privateint

  3. publicvoid
  4. if(isPressed()&&(mParent!=null)
  5. &&mOriginalWindowAttachCount==mWindowAttachCount){
  6. if(performLongClick()){//这里回调onLongClick()方法
  7. true;
  8. }
  9. }
  10. }

  11. publicvoid
  12. mOriginalWindowAttachCount=mWindowAttachCount;
  13. }
  14. }


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 plain​​​ ​​​copy​​​ ​​​print​​​ ​​​?​​



  1. case
  2. if(mPendingCheckForTap==null){
  3. new
  4. }
  5. mPrivateFlags|=PREPRESSED;
  6. false;
  7. //开始延迟线程检测触摸点移动没
  8. break;


case MotionEvent.ACTION_DOWN:
if (mPendingCheckForTap == null) {
mPendingCheckForTap = new CheckForTap();
}
mPrivateFlags |= PREPRESSED;
mHasPerformedLongPress = false;
postDelayed(mPendingCheckForTap, ViewConfiguration.getTapTimeout());//开始延迟线程检测触摸点移动没
break;


如果没有移动,则会开启一个延迟线程回调onLongClick()方法:


[java] ​​ view plain​​​ ​​​copy​​​ ​​​print​​​ ​​​?​​



如何编写Android View长按事件判断的长尾?

  1. privatefinalclassCheckForTapimplements
  2. publicvoid
  3. mPrivateFlags&=~PREPRESSED;
  4. mPrivateFlags|=PRESSED;
  5. refreshDrawableState();
  6. if
  7. //开启延迟线程回调onLongClick()方法
  8. }
  9. }
  10. }


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毫秒