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

本文介绍了在Android开发中如何在View的onTouch事件中实现长按、左右滑动和点击的判断。通过监听MotionEvent,分别处理了按下、移动和释放等状态,从而实现复杂触摸交互。

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

float xDown,yDown,xUp;  
boolean isLongClickModule = false;
boolean isLongClicking = false;
myView.setOnTouchListener(new OnTouchListener() {  
          public boolean onTouch(View v, MotionEvent event) {  
	            //当按下时处理  
	            if (event.getAction() == MotionEvent.ACTION_DOWN) {  
	            	xDown= event.getX();  
	            	yDown = event.getY();
		        Log.v("OnTouchListener", "Down");  
         
	            } else if (event.getAction() == MotionEvent.ACTION_UP) {// 松开处理  
		            //获取松开时的x坐标  
	            	if(isLongClickModule){
	            		  isLongClickModule = false;
	            		  isLongClicking = false;
		            }
		            xUp = event.getX(); 
		          
		            Log.v("OnTouchListener", "Up"); 
		           //按下和松开绝对值差当大于20时滑动,否则不显示  
			        if ((xUp - xDown) > 20)
			        {  
					//添加要处理的内容
			        }
			        else if((xUp - xDown ) < -20)
			        {			           	
					//添加要处理的内容
				    } 
			        else if( 0 == (xDown - xUp)) 
			        { 
			        	int viewWidth = v.getWidth(); 
			        	if( xDown < viewWidth/3 )
			        	{ 
			        		//靠左点击
			        	} 
			        	else if(xDown > viewWidth/3 && xDown < viewWidth * 2 /3) 
			        	{
			        		//中间点击
			        	}
						else 
						{ 
							//靠右点击
						} 
			        } 
			     } 
	             else if (event.getAction() == MotionEvent.ACTION_MOVE) 
	             {
	            	 //当滑动时背景为选中状态 //检测是否长按,在非长按时检测 
	            	 if(!isLongClickModule)
	            	 { 
	            		 isLongClickModule = isLongPressed(xDown, yDown, event.getX(), 
					event.getY(),event.getDownTime() ,event.getEventTime(),300);
	            	 } 
	            	 if(isLongClickModule && !isLongClicking){ 
	            		 //处理长按事件 
	            		 isLongClicking = true; } 
	            	 } 
	             else 
	             {
	            	 //其他模式 
	             } return false; 
	     }});
          /* 判断是否有长按动作发生
	   * @param lastX 按下时X坐标
	   * @param lastY 按下时Y坐标
	   * @param thisX 移动时X坐标
	   * @param thisY 移动时Y坐标
	   * @param lastDownTime 按下时间
	   * @param thisEventTime 移动时间
	   * @param longPressTime 判断长按时间的阀值
	   */
	  private boolean isLongPressed(float lastX,float lastY,
			  float thisX,float thisY,
			  long lastDownTime,long thisEventTime,
			  long longPressTime){
	    float offsetX = Math.abs(thisX - lastX);
	    float offsetY = Math.abs(thisY - lastY);
	    long intervalTime = thisEventTime - lastDownTime;
	    if(offsetX <= 10 && offsetY <= 10 && intervalTime >= longPressTime){
	      return true;
	    }
	    return false;
	  }







评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值