Android iew 的onTouch事件中,长按、左右滑动和点击判断

小菜鸟战斗机 2018-3-27 195

在Android的开发中要对一个View长按、滑动、和点击同时进行,在View的onTouch事件中做了以下的工作:

[java] view plain copy
  1. float xDown,yDown,xUp;    
  2. boolean isLongClickModule = false;  
  3. boolean isLongClicking = false;  
  4. myView.setOnTouchListener(new OnTouchListener() {    
  5.           public boolean onTouch(View v, MotionEvent event) {    
  6.                 //当按下时处理    
  7.                 if (event.getAction() == MotionEvent.ACTION_DOWN) {    
  8.                     xDown= event.getX();    
  9.                     yDown = event.getY();  
  10.                 Log.v("OnTouchListener""Down");    
  11.            
  12.                 } else if (event.getAction() == MotionEvent.ACTION_UP) {// 松开处理    
  13.                     //获取松开时的x坐标    
  14.                     if(isLongClickModule){  
  15.                           isLongClickModule = false;  
  16.                           isLongClicking = false;  
  17.                     }  
  18.                     xUp = event.getX();   
  19.                     
  20.                     Log.v("OnTouchListener""Up");   
  21.                    //按下和松开绝对值差当大于20时滑动,否则不显示    
  22.                     if ((xUp - xDown) > 20)  
  23.                     {    
  24.                     //添加要处理的内容  
  25.                     }  
  26.                     else if((xUp - xDown ) < -20)  
  27.                     {                         
  28.                     //添加要处理的内容  
  29.                     }   
  30.                     else if0 == (xDown - xUp))   
  31.                     {   
  32.                         int viewWidth = v.getWidth();   
  33.                         if( xDown < viewWidth/3 )  
  34.                         {   
  35.                             //靠左点击  
  36.                         }   
  37.                         else if(xDown > viewWidth/3 && xDown < viewWidth * 2 /3)   
  38.                         {  
  39.                             //中间点击  
  40.                         }  
  41.                         else   
  42.                         {   
  43.                             //靠右点击  
  44.                         }   
  45.                     }   
  46.                  }   
  47.                  else if (event.getAction() == MotionEvent.ACTION_MOVE)   
  48.                  {  
  49.                      //当滑动时背景为选中状态 //检测是否长按,在非长按时检测   
  50.                      if(!isLongClickModule)  
  51.                      {   
  52.                          isLongClickModule = isLongPressed(xDown, yDown, event.getX(),   
  53.                     event.getY(),event.getDownTime() ,event.getEventTime(),300);  
  54.                      }   
  55.                      if(isLongClickModule && !isLongClicking){   
  56.                          //处理长按事件   
  57.                          isLongClicking = true; }   
  58.                      }   
  59.                  else   
  60.                  {  
  61.                      //其他模式   
  62.                  } return false;   
  63.          }});  
[java] view plain copy
  1.        /* 判断是否有长按动作发生 
  2.  * @param lastX 按下时X坐标 
  3.  * @param lastY 按下时Y坐标 
  4.  * @param thisX 移动时X坐标 
  5.  * @param thisY 移动时Y坐标 
  6.  * @param lastDownTime 按下时间 
  7.  * @param thisEventTime 移动时间 
  8.  * @param longPressTime 判断长按时间的阀值 
  9.  */  
  10. private boolean isLongPressed(float lastX,float lastY,  
  11.   float thisX,float thisY,  
  12.   long lastDownTime,long thisEventTime,  
  13.   long longPressTime){  
  14.   float offsetX = Math.abs(thisX - lastX);  
  15.   float offsetY = Math.abs(thisY - lastY);  
  16.   long intervalTime = thisEventTime - lastDownTime;  
  17.   if(offsetX <= 10 && offsetY <= 10 && intervalTime >= longPressTime){  
  18.     return true;  
  19.   }  
  20.   return false;  
  21. }  




最新回复 (0)
返回